From a5ac05b73dd53307e3f2ebb16cd4a1056aaff3f7 Mon Sep 17 00:00:00 2001 From: Mike Gerwitz Date: Wed, 6 Aug 2014 00:54:52 -0400 Subject: [PATCH] Evented Node.js EventEmitter compatibility guarantees --- test/event/EventableTest.js | 65 +++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 test/event/EventableTest.js diff --git a/test/event/EventableTest.js b/test/event/EventableTest.js new file mode 100644 index 0000000..1d00eaf --- /dev/null +++ b/test/event/EventableTest.js @@ -0,0 +1,65 @@ +/** + * Tests 1-N message dispatch interface + * + * Copyright (C) 2014 Mike Gerwitz + * + * This file is part of jsTonic. + * + * jstonic is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +var Sut = require( '../../' ).event.Eventable, + expect = require( 'chai' ).expect; + + +describe( 'event.Eventable', () => +{ + /** + * One critical design decision of Eventable was to produce an interface + * that is compatible with Node.js' EventEmitter prototype---this allows + * existing Node libraries that make use of it to be used wherever an + * Eventable is expected, without any frustrating adapter code that + * would deter developers. + * + * Note an important distinction here: Eventable defines a *subset* of + * the methods implemented by EventEmitter; so implementors of Eventable + * may provide other methods in addition, and EventEmitter likewise does + * the same; the only goal we care about is that EventEmitter can be + * used polymorphically with regards to Eventable. Therefore, while it's + * true that EventEmitter can be used wherever Eventable is expected, + * the reverse is not necessarily true. + * + * This test was created when the Event interface had already been + * declared "frozen", so the below methods should be correct. + */ + it( 'is compatible with Node.js Event prototype', () => + { + let f = ( ev, listener ) => {}; + + let njs_ev = { + addListener: f, + on: f, + once: f, + removeListener: f, + removeAllListeners: f, + setMaxListeners: f, + listeners: f, + emit: f, + }; + + // via ease.js ECMAScript interop + expect( Sut.isCompatible( njs_ev ) ).to.be.true; + } ); +} ); +