/**
 * @requires javelin-behavior
 */
describe('Javelin Behaviors', function() {

  beforeEach(function() {
    // Don't try this at home, kids.
    JX.behavior._behaviors = {};
    JX.behavior._initialized = {};
    JX.behavior._statics = {};
  });

  it('JX.behavior should not work with clowny names', function() {
    ensure__DEV__(true, function() {
      expect(function() {
        JX.behavior('toString', function() {});
      }).toThrow();
    });
  });

  it('JX.initBehavior should pass a config object', function() {
    var called = false;
    var config = 'no-value';

    JX.behavior('my-behavior', function(cfg) {
      called = true;
      config = cfg;
    });

    JX.initBehaviors({});
    expect(called).toBe(false);
    expect(config).toEqual('no-value');

    called = false;
    config = null;
    JX.initBehaviors({ 'my-behavior': [] });
    expect(called).toBe(true);
    expect(config).toBeNull();

    called = false;
    config = null;
    JX.initBehaviors({ 'my-behavior': ['foo'] });
    expect(called).toBe(true);
    expect(config).toEqual('foo');
  });

  it('JX.initBehavior should init a behavior with no config once', function() {
    var count = 0;
    JX.behavior('foo', function() {
      count++;
    });
    JX.initBehaviors({ 'foo': [] });
    expect(count).toEqual(1);
    JX.initBehaviors({ 'foo': [] });
    expect(count).toEqual(1);
    JX.initBehaviors({ 'foo': ['test'] });
    expect(count).toEqual(2);
  });

  it('Behavior statics should persist across behavior invocations', function() {
    var expect_value;
    var asserted = 0;
    JX.behavior('static-test', function(config, statics) {
      statics.value = (statics.value || 0) + 1;
      expect(statics.value).toBe(expect_value);
      asserted++;
    });

    expect_value = 1;
    JX.initBehaviors({'static-test' : [{ hog : 0 }]});
    expect_value = 2;
    JX.initBehaviors({'static-test' : [{ hog : 0 }]});

    // Test that we actually invoked the behavior.
    expect(asserted).toBe(2);
  });

  it('should throw for undefined behaviors', function() {
    var called;
    JX.behavior('can-haz', function() {
      called = true;
    });

    expect(function() {
      JX.initBehaviors({
        'no-can-haz': [],
        'can-haz': [],
        'i-fail': []
      });
    }).toThrow();

    expect(called).toBe(true);
  });

});

