From 735c2359c4e81dea3c773e563270425ae155c277 Mon Sep 17 00:00:00 2001 From: Robert Penner Date: Thu, 27 Apr 2017 18:37:16 -0700 Subject: [PATCH] add tests --- test/nanosignal-signal1.test.ts | 31 --------- test/signal-remove-during-dispatch.test.ts | 32 ++++++++++ test/signal.test.ts | 64 +++++++++++++++++++ ...=> signal0-remove-during-dispatch.test.ts} | 0 ...signal-signal0.test.ts => signal0.test.ts} | 19 +++++- 5 files changed, 114 insertions(+), 32 deletions(-) delete mode 100644 test/nanosignal-signal1.test.ts create mode 100644 test/signal-remove-during-dispatch.test.ts create mode 100644 test/signal.test.ts rename test/{nanosignal-self-removal.test.ts => signal0-remove-during-dispatch.test.ts} (100%) rename test/{nanosignal-signal0.test.ts => signal0.test.ts} (82%) diff --git a/test/nanosignal-signal1.test.ts b/test/nanosignal-signal1.test.ts deleted file mode 100644 index d593d15..0000000 --- a/test/nanosignal-signal1.test.ts +++ /dev/null @@ -1,31 +0,0 @@ -import createSignal, { Signal } from '../src/nanosignal'; - -describe('signal with 1 argument', () => { - let dated: Signal; - beforeEach(() => { - dated = createSignal(); - }); - it('is a function', () => expect(typeof dated).toBe('function')); - - describe('when fired with the payload', () => { - let listenerA: jest.Mock; - let listenerB: jest.Mock; - const payload = new Date(); - beforeEach(() => { - listenerA = jest.fn(); - listenerB = jest.fn(); - dated.subscribe(listenerA); - dated.subscribe(listenerB); - dated(payload); - }); - - it('the listeners receive the payload', () => { - expect(listenerA).toHaveBeenCalledWith(payload); - expect(listenerB).toHaveBeenCalledWith(payload); - }); - }); - -}); - - - diff --git a/test/signal-remove-during-dispatch.test.ts b/test/signal-remove-during-dispatch.test.ts new file mode 100644 index 0000000..c60e135 --- /dev/null +++ b/test/signal-remove-during-dispatch.test.ts @@ -0,0 +1,32 @@ +import createSignal, { Signal } from '../src/nanosignal'; + +describe('when a listener unsubscribes another listener during dispatch', () => { + let dated: Signal; + let listenerA: jest.Mock; + let listenerB: jest.Mock; + let listenerC: jest.Mock; + beforeEach(() => { + dated = createSignal(); + listenerA = jest.fn(); + const unsubscribeA = dated.subscribe(listenerA); + listenerB = jest.fn(unsubscribeA); + listenerC = jest.fn(); + dated.subscribe(listenerB); + dated.subscribe(listenerC); + // dispatch twice and expect the unsubscribed listener to be called only once + dated(new Date()); + dated(new Date()); + }); + + it('the first listener is called once then unsubscribed', () => { + expect(listenerA).toHaveBeenCalledTimes(1); + }); + + it('no other listener is skipped', () => { + expect(listenerB).toHaveBeenCalledTimes(2); + expect(listenerC).toHaveBeenCalledTimes(2); + }); +}); + + + diff --git a/test/signal.test.ts b/test/signal.test.ts new file mode 100644 index 0000000..5f40496 --- /dev/null +++ b/test/signal.test.ts @@ -0,0 +1,64 @@ +import createSignal, { Signal, Unsubscriber } from '../src/nanosignal'; + +describe('Signal', () => { + let dated: Signal; + beforeEach(() => { + dated = createSignal(); + }); + it('is a function', () => expect(typeof dated).toBe('function')); + + describe('given 2 listeners', () => { + let listenerA: jest.Mock; + let listenerB: jest.Mock; + const payload = new Date(); + beforeEach(() => { + listenerA = jest.fn(); + listenerB = jest.fn(); + dated.subscribe(listenerA); + dated.subscribe(listenerB); + dated(payload); + }); + + it('when the signal fires, the listeners receive the payload', () => { + expect(listenerA).toHaveBeenCalledWith(payload); + expect(listenerB).toHaveBeenCalledWith(payload); + }); + }); + + describe('given a firstListener argument and then subscribe() a second listener', () => { + let listenerA: jest.Mock; + let listenerB: jest.Mock; + const payload = new Date(); + beforeEach(() => { + listenerA = jest.fn(); + listenerB = jest.fn(); + dated = createSignal(listenerA); + dated.subscribe(listenerB); + dated(payload); + }); + + it('when the signal fires, the listeners receive the payload', () => { + expect(listenerA).toHaveBeenCalledWith(payload); + expect(listenerB).toHaveBeenCalledWith(payload); + }); + }); + + describe('when removing a listener before firing', () => { + let listenerA: jest.Mock; + let removeA: Unsubscriber; + beforeEach(() => { + listenerA = jest.fn(); + removeA = dated.subscribe(listenerA); + removeA(); + dated(new Date()); + }); + + it('the listener is not called', () => { + expect(listenerA).not.toBeCalled(); + }); + }); + +}); + + + diff --git a/test/nanosignal-self-removal.test.ts b/test/signal0-remove-during-dispatch.test.ts similarity index 100% rename from test/nanosignal-self-removal.test.ts rename to test/signal0-remove-during-dispatch.test.ts diff --git a/test/nanosignal-signal0.test.ts b/test/signal0.test.ts similarity index 82% rename from test/nanosignal-signal0.test.ts rename to test/signal0.test.ts index a64a3f1..945d77f 100644 --- a/test/nanosignal-signal0.test.ts +++ b/test/signal0.test.ts @@ -1,6 +1,6 @@ import createSignal0, { Signal0, Unsubscriber } from '../src/nanosignal0'; -describe('signal with 0 arguments', () => { +describe('Signal0', () => { let happened: Signal0; beforeEach(() => { happened = createSignal0(); @@ -99,6 +99,23 @@ describe('signal with 0 arguments', () => { }); + describe('given a firstListener argument and then subscribe() a second listener', () => { + let listenerA: jest.Mock; + let listenerB: jest.Mock; + beforeEach(() => { + listenerA = jest.fn(); + listenerB = jest.fn(); + happened = createSignal0(listenerA); + happened.subscribe(listenerB); + happened(); + }); + + it('when the signal fires, the listeners are called', () => { + expect(listenerA).toHaveBeenCalledTimes(1); + expect(listenerB).toHaveBeenCalledTimes(1); + }); + }); + });