var basicEvents = require('nodeunit').testCase;12/////helper///////3function setHelper (emitter, test, testName){4var eventNames = [5testName,6testName + '.*',7testName + '.ns1',8testName + '.ns1.ns2',9testName + '.ns2.*'10];1112for (var i = 0; i < eventNames.length; i++) {13emitter.on(eventNames[i], function () {14test.ok(true, eventNames[i] + 'has fired');15});16}1718return eventNames;19};2021module.exports = basicEvents({2223setUp: function (callback) {24var EventEmitter2;2526if(typeof require !== 'undefined') {27EventEmitter2 = require('../../lib/eventemitter2').EventEmitter2;28}29else {30EventEmitter2 = window.EventEmitter2;31}3233this.emitter = new EventEmitter2({34wildcard: true,35verbose: true36});3738callback();39},4041tearDown: function (callback) {42//clean up?43callback();44},4546'1. An event can be namespaced.': function (test) {4748var emitter = this.emitter;4950emitter.on('test1.ns1', function () {51test.ok(true, 'The event was raised');52});5354emitter.emit('test1.ns1');5556test.expect(1);57test.done();5859},60'2. An event can be namespaced and accept values.': function (test) {6162var emitter = this.emitter;6364emitter.on('test2.ns1', function(value1) {65test.ok(true, 'The event was raised');66test.ok(typeof value1 !== 'undefined', 'The event was raised with the value `' + value1 + '`.');67});6869emitter.emit('test2.ns1', 1);7071test.expect(2);72test.done();7374},75'3. A namespaced event can be raised multiple times and accept values.': function (test) {7677var emitter = this.emitter;7879emitter.on('test3.ns1', function (value1, value2, value3) {80test.ok(true, 'The event was raised');81test.ok(arguments.length === 3, 'The event was raised with the correct number of arguments');82test.ok(value1 === 1 || value1 === 4, 'The event was raised with the value `' + value1 + '`.');83test.ok(value2 === 2 || value2 === 5, 'The event was raised with the value `' + value2 + '`.');84test.ok(value3 === 3 || value3 === 6, 'The event was raised with the value `' + value3 + '`.');85});8687emitter.emit('test3.ns1', 1, 2, 3);88emitter.emit('test3.ns1', 4, 5, 6);8990test.expect(10);91test.done();92},93'4. A listener should support wild cards.': function (test) {9495var emitter = this.emitter;9697emitter.on('test4.*', function () {98test.ok(true, 'The event was raised');99});100101emitter.emit('test4.ns1');102103test.expect(1);104test.done();105106},107'5. Emitting an event should support wildcards.': function (test) {108109var emitter = this.emitter;110111emitter.on('test5A.test5B', function () {112test.ok(true, 'The event was raised');113});114115emitter.emit('test5A.*');116117test.expect(1);118test.done();119120},121'6. A listener should support complex wild cards.': function (test) {122123var emitter = this.emitter;124125emitter.on('test10.*.foo', function () {126test.ok(true, 'The event was raised');127});128129emitter.emit('test10.ns1.foo');130131test.expect(1);132test.done();133134},135'7. Emitting an event should support complex wildcards.': function (test) {136137var emitter = this.emitter;138139emitter.on('test11.ns1.foo', function () {140test.ok(true, 'The event was raised');141});142143emitter.emit('test11.*.foo');144145test.expect(1);146test.done();147148},149'8. Emitting an event should support complex wildcards multiple times, a valid listener should accept values.': function (test) {150151var emitter = this.emitter;152153emitter.on('test12.ns1.ns2', function (value1, value2, value3) {154test.ok(true, 'The event was raised');155test.ok(arguments.length === 3, 'The event was raised with the correct number of arguments');156test.ok(value1 === 1 || value1 === 4, 'The event was raised with the value `' + value1 + '`.');157test.ok(value2 === 2 || value2 === 5, 'The event was raised with the value `' + value1 + '`.');158test.ok(value3 === 3 || value3 === 6, 'The event was raised with the value `' + value1 + '`.');159});160161emitter.emit('test12.*.ns2', 1, 2, 3);162emitter.emit('test12.*.ns2', 4, 5, 6);163164test.expect(10);165test.done();166167},168'9. List all the listeners for a particular event.': function(test) {169170var emitter = this.emitter;171172emitter.on('test13', function (event) {173test.ok(true,'raised one');174});175176emitter.on('test13', function (event) {177test.ok(true,'raised two');178});179180var listeners = emitter.listeners('test13');181182test.ok(listeners.length === 2, 'The event `test13` should have 2 listeners');183test.expect(1);184test.done();185186},187'10. should be able to listen on any event' : function (test) {188189var emitter = this.emitter;190191var fn = function (foo, bar) {192test.equal(this.event, 'test23.ns5.ns5')193test.equal(foo, 'foo');194test.equal(bar, 1);195test.ok(true, 'raised test23.ns5.ns5');196}197198emitter.onAny(fn);199emitter.emit('test23.ns5.ns5', 'foo', 1);200test.expect(4);201test.done();202203},204/*,205'11. A listener should support total wild card.': function (test) {206207var emitter = this.emitter;208209emitter.on('*', function () {210test.ok(true, 'The event was raised');211});212213emitter.emit('test14');214emitter.emit('test14.ns1');215emitter.emit('test14.ns1.ns2');216217test.expect(1);218test.done();219220},221222'12. A listener should support complex total wild card.': function (test) {223224var emitter = this.emitter;225226emitter.on('*', function () {227test.ok(true, 'The event was raised');228});229230emitter.emit('test15.*');231emitter.emit('test15.*.ns2')232emitter.emit('*');233234test.expect(1);235test.done();236237},238'13. Should be able to fire with wildcard start.' : function (test) {239var emitter = this.emitter;240241emitter.on('test16', function () {242test.ok(true, 'The event test15 was raised');243});244emitter.on('test16.ns1', function () {245test.ok(true, 'The event test15.ns1 was raised');246});247248emitter.emit('*');249emitter.emit('*.ns1');250251test.expect(2);252test.done();253},254'14. Should fail if delimiter is used to start or end event name.' : function (test) {255var emitter = this.emitter;256257//nothing should emit, so here is a all-listener258emitter.on('*.*.*', function () {259test.ok(false, 'an event was raised!');260});261emitter.on('*.*', function () {262test.ok(false, 'an event was raised!');263});264emitter.on('*', function () {265test.ok(false, 'an event was raised!');266});267268try {269emitter.on('.ns4', function () {270test.ok(false, 'The event .ns4 was raised');271});272273emitter.emit('.ns4');274}275catch(ex) {276test.ok(true, 'The event .ns4 was not raised');277}278279try {280281emitter.on('ns4.', function () {282test.ok(false, 'The event .ns4 was raised');283});284285emitter.emit('ns4.');286}287catch(ex) {288test.ok(true, 'The event .ns4 was not raised');289}290291try {292293emitter.on('.ns4', function () {294test.ok(false, 'The event .ns4 was raised');295});296297emitter.emit('ns4.');298}299catch(ex) {300test.ok(true, 'The event .ns4 was not raised');301}302303try {304305emitter.on('.ns4', function () {306test.ok(false, 'The event .ns4 was raised');307});308309}310catch(ex) {311test.ok(true, 'The event .ns4 was not raised');312}313314try {315316emitter.emit('ns4.');317318}319catch(ex) {320test.ok(true, 'The event .ns4 was not raised');321}322323try {324emitter.emit('some..bad');325}326catch (ex) {327test.ok(true, 'error was raised');328}329330try {331emitter.on('some..bad', function () {332test.ok(false, 'a bad event was raised');333});334}335catch (ex){336test.ok(true,'error was raised');337}338339test.expect(7);340test.done();341},342343'15. Should provide case sensitive option.' : function (test) {344var emitter = this.emitter;345346emitter.on('test18', function () {347test.ok(false, 'The event test18 was raised');348});349emitter.on('test18.ns1', function () {350test.ok(false, 'The event test18.ns1 was raised');351});352353emitter.emit('Test18');354355test.expect(0);356test.done();357},358359'16. one emit should be able to fire on multiple namespaces.' : function (test) {360var emitter = this.emitter;361362emitter.on('test19.*', function () {363test.ok(true, 'test19.* was raised');364});365emitter.on('test19.foo', function () {366test.ok(true, 'test19.foo was raised');367});368369emitter.emit('test19.foo');370test.expect(2);371test.done();372},373374'17. should support case insensitivty (complex).' : function (test) {375if(typeof require !== 'undefined') {376EventEmitter2 = require('../lib/ee2').EventEmitter2;377}378else {379EventEmitter2 = window.EventEmitter2;380}381382var emitter = new EventEmitter2({ caseSensitive : false});383384emitter.on('test20', function () {385test.ok(true, 'The event test20 was raised');386});387emitter.on('test20.ns1', function () {388test.ok(true, 'The event test20.ns1 was raised');389});390emitter.on('*.ns1', function () {391test.ok(true, 'The event *.ns1 was raised');392});393emitter.on('*.ns2', function () {394test.ok(false, 'The event *.ns2 was raised');395});396397emitter.emit('Test20');398emitter.emit('TeSt20.nS1');399400test.expect(3);401test.done();402},403404'18. should be able to removeListeners' : function (test) {405var emitter = this.emitter;406407var someFun = function () {408test.ok(true, 'someFunc was raised');409}410411emitter.on('test21', someFun);412emitter.on('test21.*', someFun);413emitter.on('test21.ns1', someFun);414emitter.on('test21.ns1.ns2', someFun);415416emitter.emit('test21'); //1417emitter.emit('test21.ns2'); //1418emitter.emit('test21.ns1'); //2419420var listeners = emitter.listeners('test21');421test.ok(listeners.length === 1, 'there should be 1 listener');422423emitter.removeListener('test21', someFun);424listeners = emitter.listeners('test21');425test.ok(listeners.length === 0, 'there should be 0 listener (empty array)');426427// should be able to add more listeners after removing428emitter.on('test21', someFun);429emitter.on('test21', someFun);430listeners = emitter.listeners('test21');431test.ok(listeners.length === 2, 'there should be 2 listeners'); //1432433emitter.emit('test21'); //2434435emitter.removeListener('test21', someFun); //this removes all listeners436listeners = emitter.listeners('test21');437test.ok(listeners.length === 1, 'there should be 1 listeners'); //1438emitter.removeListener('test21', someFun); //this removes all listeners439listeners = emitter.listeners('test21');440test.ok(listeners.length === 0, 'there should be 0 listeners'); //1441442emitter.emit('test21'); //0443444listeners = emitter.listeners('test21.ns1');445test.ok(listeners.length === 1, 'there should be 1 listeners'); //1446447emitter.removeListener('test21.ns1', someFun); // remove one448listeners = emitter.listeners('test21.ns1');449test.ok(listeners.length === 0, 'there should be 0 listeners'); //1450451listeners = emitter.listeners('test21.*');452test.ok(listeners.length === 1, 'there should be 1 listeners'); //1453emitter.removeListener('test21.*', someFun); // remove one454listeners = emitter.listeners('test21.*');455test.ok(listeners.length === 0, 'there should be 0 listeners'); //1456457test.expect(15);458test.done();459},460461'19. should be able to remove all listeners' : function (test) {462463var emitter = this.emitter,464addedEvents = setHelper(emitter, test, 'test22');465466emitter.emit('test22'); //1467468var listeners = emitter.listeners('test22');469test.ok(listeners.length === 1, 'there should be 1 listener'); //1470471emitter.removeAllListeners('test22');472listeners = emitter.listeners('test22');473test.ok(listeners.length === 0, 'there should be 0 listener'); //1474475emitter.removeAllListeners('test22.ns1');476listeners = emitter.listeners('test22.ns1');477test.ok(listeners.length === 0, 'there should be 0 listener'); //1478479emitter.removeAllListeners(); //removing all possible480for (var i = 0; i < addedEvents.length; i++) {481listeners = emitter.listeners(addedEvents[i]);482test.ok(listeners.length === 0, 'there shouldn\'t be at a listener');483}484485test.expect(addedEvents.length + 4 );486test.done();487},488489'19. should be able to fire once and done' : function (test) {490var emitter = this.emitter,491addedEvents = setHelper(emitter,test,'test24');492493emitter.once('test24once', function () {494test.ok(true, 'fired once');495});496497emitter.emit('test24');498emitter.emit('test24once');499emitter.emit('test24once');500501test.expect(2);502test.done();503},504505'20. should be able to fire many and done' : function (test) {506507var emitter = this.emitter,508addedEvents = setHelper(emitter,test,'test25');509510emitter.many('test25many', 5, function () {511test.ok(true, 'test25many pewpew');512});513514emitter.emit('test25'); //1515for (var i= 0; i < 5; i++) {516emitter.emit('test25many'); //1517}518emitter.emit('test25many'); //0519520test.expect(6);521test.done();522},523524'21. should be able to list all onAny listeners' : function (test) {525var emitter = this.emitter,526addedEvents = setHelper(emitter, test, 'test26'),527fn = function (tag) {528if (tag !== 'addListener') {529test.equals(tag, 'test26.ns5.ns5', 'emitted tag, and raised tag should match');530test.ok(true, 'something happened somewhere');531}532};533534emitter.onAny(fn);535emitter.emit('test26.ns5.ns5'); //2536var listeners = emitter.listenersAny();537test.equals(listeners.length, 1, 'should be one any listeners');538539emitter.offAny(fn);540listeners = emitter.listenersAny();541test.ok(listeners.length === 0, 'should be no any listeners');542543emitter.onAny(fn);544emitter.onAny(fn);545listeners = emitter.listenersAny();546test.equals(listeners.length, 2, 'should be two any listeners');547548emitter.offAny();549listeners = emitter.listenersAny();550test.ok(listeners.length === 0, 'should be no any listeners');551552test.expect(6);553test.done();554},555556'22. should not expand beyond the namespace' : function (test) {557var emitter = this.emitter,558addedEvents = setHelper(emitter,test,'test27');559560emitter.emit('test27.ns2.ns3'); //1561emitter.emit('test27.ns2.ns3.ns4'); //0562563test.expect(1);564test.done();565},566567'23. should raise errors, if error is emitted and not caught' : function (test) {568var emitter = this.emitter,569error = new Error('Something Funny Happened');570571try {572emitter.emit('error');573}574catch (ex) {575test.ok(ex instanceof Error, 'should be an Error');576}577578try {579emitter.emit('error', error);580}581catch (ex) {582test.equal(error, ex, 'should have passed up the argument');583}584585emitter.on('error', function (event, err) {586test.ok(true, 'error event was raised');587test.equal(err, error, 'of the error');588});589590emitter.emit('error',error);591592test.expect(4);593test.done();594},595596'24. should raise errors on namespaces, if error is emitted and not caught' : function (test) {597var emitter = this.emitter,598error = new Error('Something Funny Happened');599600emitter.on('foo.bar', function(){});601602try {603emitter.emit('foo.error');604}605catch (ex) {606test.ok(ex instanceof Error, 'should be an Error');607}608609try {610emitter.emit('foo.error', error);611}612catch (ex) {613test.equal(error, ex, 'should have passed up the argument');614}615616emitter.on('error', function (event, err) {617test.ok(true, 'error event was raised');618test.equal(err, error, 'of the error');619});620621emitter.emit('error',error);622623test.expect(4);624test.done();625},626627'25. should support old config for EE2' : function (test) {628if(typeof require !== 'undefined') {629EventEmitter2 = require('../lib/ee2').EventEmitter2;630}631else {632EventEmitter2 = window.EventEmitter2;633}634var emitter = new EventEmitter2({635caseSensitive : true,636delimiter : '?'637});638639emitter.on('test30?a?b', function () {640test.ok(true, 'test30?a?b did emit');641});642643emitter.emit('test30?a?b');644645test.expect(1);646test.done();647},648649'26. should reject bad wildcard inputs' : function (test) {650var emitter = this.emitter;651addedEvents = setHelper(emitter,test,'test31');652653emitter.onAny(function () {654test.ok(false, 'no event should be emitted, ever');655});656657// try listening on a bad658try {659emitter.on('test31*', function () {660test.ok(false, 'should never registered');661});662}663catch (ex) {664test.ok(ex instanceof Error, 'expected an error');665}666// bad wildcard at the front667try {668emitter.on('*test31', function () {669test.ok(false, 'should never registered');670});671}672catch (ex) {673test.ok(ex instanceof Error, 'expected an error');674}675// bad wildcard at the front676try {677emitter.on('test*31', function () {678test.ok(false, 'should never registered');679});680}681catch (ex) {682test.ok(ex instanceof Error, 'expected an error');683}684// bad wildcard at the front685try {686emitter.on('test31.*a', function () {687test.ok(false, 'should never registered');688});689}690catch (ex) {691test.ok(ex instanceof Error, 'expected an error');692}693// bad wildcard at the front694try {695emitter.on('*test31.a*', function () {696test.ok(false, 'should never registered');697});698}699catch (ex) {700test.ok(ex instanceof Error, 'expected an error');701}702// bad wildcard at the front703try {704emitter.on('*test31.a*a', function () {705test.ok(false, 'should never registered');706});707}708catch (ex) {709test.ok(ex instanceof Error, 'expected an error');710}711712//now try emittering with a bad wildcard713try {714emitter.emit('test31*')715}716catch (ex) {717test.ok(ex instanceof Error, 'expected an error');718}719// bad wildcard at the front720try {721emitter.on('*test31');722}723catch (ex) {724test.ok(ex instanceof Error, 'expected an error');725}726// bad wildcard at the front727try {728emitter.on('test*31');729}730catch (ex) {731test.ok(ex instanceof Error, 'expected an error');732}733// bad wildcard at the front734try {735emitter.on('test31.*a');736}737catch (ex) {738test.ok(ex instanceof Error, 'expected an error');739}740// bad wildcard at the front741try {742emitter.on('*test31.a*');743}744catch (ex) {745test.ok(ex instanceof Error, 'expected an error');746}747// bad wildcard at the front748try {749emitter.on('*test31.a*a');750}751catch (ex) {752test.ok(ex instanceof Error, 'expected an error');753}754755test.expect(12);756test.done();757},758759'27. Should be able to start with 0 max listeners' : function (test) {760761if(typeof require !== 'undefined') {762EventEmitter2 = require('../lib/ee2').EventEmitter2;763}764else {765EventEmitter2 = window.EventEmitter2;766}767try {768var emitter = new EventEmitter2({769maxListeners : 0770});771emitter.on('no listeners', function () {772test.ok(false, 'no listener was raised');773});774test.ok(true, 'was able to make something');775}776catch (ex) {777test.ok(false, 'Error was raised');778}779780test.expect(1);781test.done();782},783784'28. should raise maxListeners when too many are registerd' : function (test) {785var emitter = this.emitter;786787emitter.on('maxListeners', function () {788test.ok(true, 'maxListeners fired');789});790791for (var i = 0; i < 11 ; i++){792emitter.on('test33', function () {793test.ok(false, 'event was raised');794});795}796797var listeners = emitter.listeners('test33');798test.equal(listeners.length, 10, '10 listeners in total');799800test.expect(2);801test.done();802} */803804'29. No warning should be raised if we set maxListener to be greater before adding' : function (test) {805var emitter = this.emitter;806var type = 'test29.*';807808// set to 20809emitter.setMaxListeners(20);810811for (var i = 0; i < 15 ; i++) {812emitter.on(type, function () {813test.ok(true, 'event was raised');814});815}816817// require('eyes').inspect(emitter._events);818819var listeners = emitter.listeners(type);820test.equal(listeners.length, 15, 'should have 15');821test.ok(!(emitter.listenerTree[ 'test29' ]['*']._listeners.warned), 'should not have been set');822823test.expect(2);824test.done();825}826827828});829830831