diff options
Diffstat (limited to 'src/shapex.test.ts')
| -rw-r--r-- | src/shapex.test.ts | 89 |
1 files changed, 81 insertions, 8 deletions
diff --git a/src/shapex.test.ts b/src/shapex.test.ts index aadeea7..d605c3a 100644 --- a/src/shapex.test.ts +++ b/src/shapex.test.ts @@ -6,6 +6,7 @@ describe("EventX", () => { test("subscribes to an event", () => { const $ = ShapeX({ counter: 1 }); const id = $.subscribe("test-event", (state) => ({ state })); + expect(id).toBe(1); expect($.subscriptionCount("test-event")).toBe(1); }); @@ -13,16 +14,17 @@ describe("EventX", () => { test("subscribes to an event once", () => { const $ = ShapeX({ counter: 1 }); const id = $.subscribeOnce("test-event", (state) => ({ state })); + expect(id).toBe(1); expect($.subscriptionCount("test-event")).toBe(1); - // Dispatch the event to trigger the one-time subscription $.dispatch("test-event"); expect($.subscriptionCount("test-event")).toBe(0); }); test("unsubscribes from an event", () => { const $ = ShapeX({ counter: 1 }); + $.subscribe("test-event", (state) => ({ state })); expect($.subscriptionCount("test-event")).toBe(1); @@ -58,7 +60,8 @@ describe("EventX", () => { const $ = ShapeX({ counter: 1 }); const stateChangeSpy = vi.fn((state) => ({ state })); - $.subscribe("$counter", stateChangeSpy); + $.subscribe("$.counter", stateChangeSpy); + $.subscribe("increment", (state) => ({ state: { ...state, counter: state.counter + 1 }, })); @@ -74,6 +77,7 @@ describe("EventX", () => { const nestedEventSpy = vi.fn((state) => ({ state })); $.subscribe("nested-event", nestedEventSpy); + $.subscribe("parent-event", (state) => ({ state, dispatch: { eventName: "nested-event" }, @@ -90,7 +94,9 @@ describe("EventX", () => { const nestedEvent2Spy = vi.fn((state) => ({ state })); $.subscribe("nested-event-1", nestedEvent1Spy); + $.subscribe("nested-event-2", nestedEvent2Spy); + $.subscribe("parent-event", (state) => ({ state, dispatch: [{ eventName: "nested-event-1" }, { eventName: "nested-event-2" }], @@ -107,6 +113,7 @@ describe("EventX", () => { const nestedEventSpy = vi.fn((state, arg) => ({ state })); $.subscribe("nested-event", nestedEventSpy); + $.subscribe("parent-event", (state) => ({ state, dispatch: { eventName: "nested-event", args: ["arg-value"] }, @@ -124,7 +131,8 @@ describe("EventX", () => { const $ = ShapeX({ counter: 1, nested: { value: "test" } }); const counterChangeSpy = vi.fn((state) => ({ state })); - $.subscribe("$counter", counterChangeSpy); + $.subscribe("$.counter", counterChangeSpy); + $.subscribe("change-counter", (state) => ({ state: { ...state, counter: 2 }, })); @@ -139,28 +147,90 @@ describe("EventX", () => { const $ = ShapeX({ counter: 1, nested: { value: "test" } }); const nestedValueChangeSpy = vi.fn((state) => ({ state })); - $.subscribe("$nested.value", nestedValueChangeSpy); + $.subscribe("$.nested.value", nestedValueChangeSpy); + $.subscribe("change-nested-value", (state) => ({ state: { ...state, - nested: { ...state.nested, value: "changed" }, + nested: { ...state.nested, value: "new value" }, + }, + })); + + $.subscribe("change-nested-value-again", (state) => ({ + state: { + ...state, + nested: { ...state.nested, value: "new value again" }, }, })); $.dispatch("change-nested-value"); + $.dispatch("change-nsted-value-again"); expect(nestedValueChangeSpy).toHaveBeenCalledTimes(1); expect(nestedValueChangeSpy).toHaveBeenCalledWith({ counter: 1, - nested: { value: "changed" }, + nested: { value: "new value" }, + }); + }); + + test("detects addition in state", () => { + const $ = ShapeX({} as { view?: string }); + const additionChangeSpy = vi.fn((state) => ({ state })); + + $.subscribe("$.view", additionChangeSpy); + + $.subscribe("set-view", (state) => { + return { + state: { + ...state, + view: "test", + }, + }; + }); + + $.dispatch("set-view"); + + expect(additionChangeSpy).toHaveBeenCalledTimes(1); + }); + + test("detects nested addition in state", () => { + const $ = ShapeX({} as { nested?: { value?: string } }); + const additionChangeSpy = vi.fn((state) => ({ state })); + const additionChangeSpy2 = vi.fn((state) => ({ state })); + + $.subscribe("$.nested", additionChangeSpy); + $.subscribe("$.nested.value", additionChangeSpy2); + + $.subscribe("set-nested-value", (state) => { + return { + state: { + ...state, + nested: { value: "test" }, + }, + }; + }); + + $.subscribe("set-nested-value-again", (state) => { + return { + state: { + ...state, + nested: { value: "test-again" }, + }, + }; }); + + $.dispatch("set-nested-value"); + $.dispatch("set-nested-value-again"); + + expect(additionChangeSpy).toHaveBeenCalledTimes(2); + expect(additionChangeSpy2).toHaveBeenCalledTimes(2); }); test("detects deleted properties in state", () => { const $ = ShapeX({ counter: 1, toDelete: "value" } as { counter: number; toDelete?: string }); const deleteChangeSpy = vi.fn((state) => ({ state })); - $.subscribe("$toDelete", deleteChangeSpy); + $.subscribe("$.toDelete", deleteChangeSpy); $.subscribe("delete-property", (state) => { const newState = { counter: state.counter }; return { state: newState }; @@ -175,7 +245,7 @@ describe("EventX", () => { const $ = ShapeX({ counter: 1 } as { counter: string | number }); const counterChangeSpy = vi.fn((state) => ({ state })); - $.subscribe("$counter", counterChangeSpy); + $.subscribe("$.counter", counterChangeSpy); $.subscribe("change-counter-type", (state) => ({ state: { ...state, counter: "string now" }, })); @@ -189,10 +259,12 @@ describe("EventX", () => { describe("utility methods", () => { test("returns all subscription names", () => { const $ = ShapeX({ counter: 1 }); + $.subscribe("event1", (state) => ({ state })); $.subscribe("event2", (state) => ({ state })); const subs = $.subscriptions(); + expect(subs).toContain("event1"); expect(subs).toContain("event2"); expect(subs.length).toBe(2); @@ -200,6 +272,7 @@ describe("EventX", () => { test("returns subscription count for specific event", () => { const $ = ShapeX({ counter: 1 }); + $.subscribe("event1", (state) => ({ state })); $.subscribe("event1", (state) => ({ state })); $.subscribe("event2", (state) => ({ state })); |
