
/*!
 * socket.io-node
 * Copyright(c) 2011 LearnBoost <dev@learnboost.com>
 * MIT Licensed
 */

(function (module, io, should) {

  module.exports = {

    'add listeners': function () {
      var event = new io.EventEmitter
        , calls = 0;

      event.on('test', function (a, b) {
        ++calls;
        a.should().eql('a');
        b.should().eql('b');
      });

      event.emit('test', 'a', 'b');
      calls.should().eql(1);
      event.on.should().eql(event.addListener);
    },

    'remove listener': function () {
      var event = new io.EventEmitter;
      function empty () { }

      event.on('test', empty);
      event.on('test:more', empty);
      event.removeAllListeners('test');

      event.listeners('test').should().eql([]);
      event.listeners('test:more').should().eql([empty]);
    },

    'remove all listeners with no arguments': function () {
      var event = new io.EventEmitter;
      function empty () { }

      event.on('test', empty);
      event.on('test:more', empty);
      event.removeAllListeners();

      // TODO: with node 0.5 we'll change this to expect []
      event.listeners('test').should().eql([empty]);
      event.listeners('test:more').should().eql([empty]);
    },

    'remove listeners functions': function () {
      var event = new io.EventEmitter
        , calls = 0;

      function one () { ++calls }
      function two () { ++calls }
      function three () { ++calls }

      event.on('one', one);
      event.removeListener('one', one);
      event.listeners('one').should().eql([]);

      event.on('two', two);
      event.removeListener('two', one);
      event.listeners('two').should().eql([two]);

      event.on('three', three);
      event.on('three', two);
      event.removeListener('three', three);
      event.listeners('three').should().eql([two]);
    },

    'number of arguments': function () {
      var event = new io.EventEmitter
        , number = [];

      event.on('test', function () {
        number.push(arguments.length);
      });

      event.emit('test');
      event.emit('test', null);
      event.emit('test', null, null);
      event.emit('test', null, null, null);
      event.emit('test', null, null, null, null);
      event.emit('test', null, null, null, null, null);

      [0, 1, 2, 3, 4, 5].should().eql(number);
    },

    'once': function () {
      var event = new io.EventEmitter
        , calls = 0;

      event.once('test', function (a, b) {
        ++calls;
      });

      event.emit('test', 'a', 'b');
      event.emit('test', 'a', 'b');
      event.emit('test', 'a', 'b');

      function removed () {
        should().fail('not removed');
      };

      event.once('test:removed', removed);
      event.removeListener('test:removed', removed);
      event.emit('test:removed');

      calls.should().eql(1);
    }

  };

})(
    'undefined' == typeof module ? module = {} : module
  , 'undefined' == typeof io ? require('socket.io-client') : io
  , 'undefined' == typeof should || !should.fail ? require('should') : should
);
