UNPKG

callbag-from-event

Version:

Create a callbag listenable source from events on a DOM node

209 lines (184 loc) 5.44 kB
const test = require('tape'); const fromEvent = require('.'); test('it converts from (fake) DOM node events', (t) => { t.plan(14); const elem = { added: false, id: null, addEventListener: (name, listener) => { t.equals(name, 'click', 'addEventListener for click'); this.added = true; let i = 0; this.id = setInterval(() => listener((++i)*10)); }, removeEventListener: (name, listener) => { t.equals(name, 'click', 'removeEventListener for click'); this.added = false; clearInterval(this.id); } } const source = fromEvent(elem, 'click'); const downwardsExpectedType = [ [0, 'function'], [1, 'number'], [1, 'number'], [1, 'number'] ]; const downwardsExpected = [10, 20, 30]; function makeSink(type, data) { let talkback; return (type, data) => { const et = downwardsExpectedType.shift(); t.equals(type, et[0], 'downwards type is expected: ' + et[0]); t.equals(typeof data, et[1], 'downwards data type is expected: ' + et[1]); if (type === 0) { talkback = data; } if (type === 1) { const e = downwardsExpected.shift(); t.equals(data, e, 'downwards data is expected: ' + e); } if (downwardsExpected.length === 0) { talkback(2); } }; } const sink = makeSink(); source(0, sink); setTimeout(() => { t.pass('nothing else happens after dispose()'); t.end(); }, 700); }); test('it handles sink immediately terminating source', (t) => { t.plan(5); const elem = { added: false, id: null, addEventListener: (name, listener) => { t.equals(name, 'click', 'addEventListener for click'); this.added = true; let i = 0; this.id = setInterval(() => listener((++i)*10)); }, removeEventListener: (name, listener) => { t.equals(name, 'click', 'removeEventListener for click'); this.added = false; clearInterval(this.id); } } const source = fromEvent(elem, 'click'); const downwardsExpectedType = [ [0, 'function'] ]; function makeSink(type, data) { let talkback; return (type, data) => { const et = downwardsExpectedType.shift(); t.ok(et, 'downwards call was expected'); t.equals(type, et[0], 'downwards type is expected: ' + et[0]); t.equals(typeof data, et[1], 'downwards data type is expected: ' + et[1]); if (type === 0) { talkback = data; talkback(2); // Immediately end. } else { t.fail('incorrectly written test, this should never be called'); } }; } const sink = makeSink(); source(0, sink); setTimeout(() => { t.pass('nothing else happens after dispose()'); t.end(); }, 700); }); test('immediately terminating sink doesn\'t receive immediately emitted data', (t) => { t.plan(5); const elem = { added: false, id: null, addEventListener: (name, listener) => { t.equals(name, 'click', 'addEventListener for click'); this.added = true; let i = 0; listener(++i); this.id = setInterval(() => listener((++i)*10)); }, removeEventListener: (name, listener) => { t.equals(name, 'click', 'removeEventListener for click'); this.added = false; clearInterval(this.id); } } const source = fromEvent(elem, 'click'); const downwardsExpectedType = [ [0, 'function'] ]; function makeSink(type, data) { let talkback; return (type, data) => { const et = downwardsExpectedType.shift(); t.ok(et, 'downwards call was expected'); t.equals(type, et[0], 'downwards type is expected: ' + et[0]); t.equals(typeof data, et[1], 'downwards data type is expected: ' + et[1]); if (type === 0) { talkback = data; talkback(2); // Immediately end. } else { t.fail('incorrectly written test, this should never be called'); } }; } const sink = makeSink(); source(0, sink); setTimeout(() => { t.pass('nothing else happens after dispose()'); t.end(); }, 700); }); test('it adds & removes listener with passed in options', (t) => { t.plan(8); const inputOptions = { passive: true } const elem = { addEventListener: (name, listener, options) => { t.equals(options, inputOptions) let i = 0; this.id = setInterval(() => listener((++i)*10)); }, removeEventListener: (name, listener, options) => { t.equals(options, inputOptions) clearInterval(this.id); } } const source = fromEvent(elem, 'click', inputOptions); const downwardsExpectedType = [ [0, 'function'], [1, 'number'], ]; const downwardsExpected = [10]; function makeSink(type, data) { let talkback; return (type, data) => { const et = downwardsExpectedType.shift(); t.equals(type, et[0], 'downwards type is expected: ' + et[0]); t.equals(typeof data, et[1], 'downwards data type is expected: ' + et[1]); if (type === 0) { talkback = data; } if (type === 1) { const e = downwardsExpected.shift(); t.equals(data, e, 'downwards data is expected: ' + e); } if (downwardsExpected.length === 0) { talkback(2); } }; } const sink = makeSink(); source(0, sink); setTimeout(() => { t.pass('nothing else happens after dispose()'); t.end(); }, 700); });