Skip to content

Commit ae81727

Browse files
committed
add loop store test
1 parent 6b287f9 commit ae81727

2 files changed

Lines changed: 162 additions & 6 deletions

File tree

tests/flow-store.test.ts

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,13 @@
1-
import { beforeEach, describe, expect, mock, test } from "bun:test";
1+
import { beforeEach, describe, expect, test } from "bun:test";
22

33
import { LEVELS } from "~/lib/game/core/levels";
44
import { useFlowStore } from "~/lib/node-editor/node-store/flow-store";
55

6-
mock.module("../editor-components/Toast", () => ({
7-
toast: mock(() => {}),
8-
}));
9-
106
describe("useFlowStore", () => {
117
beforeEach(() => {
128
localStorage.clear();
139
localStorage.setItem("level", "calculator");
1410
useFlowStore.getState().reset("calculator");
15-
mock.restore();
1611
});
1712

1813
test("should reset to initial level state", () => {

tests/loop-store.test.ts

Lines changed: 161 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,161 @@
1+
import { beforeEach, describe, expect, test } from "bun:test";
2+
3+
import { useLoopStore } from "~/lib/node-editor/node-store/loop-store";
4+
5+
describe("useLoopStore", () => {
6+
beforeEach(() => {
7+
localStorage.clear();
8+
localStorage.setItem("level", "calculator");
9+
useLoopStore.getState().reset();
10+
});
11+
12+
test("should initialize with empty loops", () => {
13+
const state = useLoopStore.getState();
14+
expect(state.loops.size).toBe(0);
15+
});
16+
17+
test("should add handle to new loop", () => {
18+
const store = useLoopStore.getState();
19+
20+
const handleId = store.addHandle("loop1", "input");
21+
22+
expect(store.loops.has("loop1")).toBe(true);
23+
expect(store.loops.get("loop1")!.get("input")).toBe(handleId);
24+
expect(isUUIDv4WithoutDashes(store.loops.get("loop1")!.get("input")!)).toBe(
25+
true
26+
);
27+
});
28+
29+
test("should add multiple handles to same loop", () => {
30+
const store = useLoopStore.getState();
31+
32+
store.addHandle("loop1", "input");
33+
store.addHandle("loop1", "output");
34+
35+
const loop = store.loops.get("loop1")!;
36+
expect(loop.size).toBe(2);
37+
expect(loop.has("input")).toBe(true);
38+
expect(loop.has("output")).toBe(true);
39+
});
40+
41+
test("should not add duplicate handles with same label", () => {
42+
const store = useLoopStore.getState();
43+
44+
store.addHandle("loop1", "input");
45+
store.addHandle("loop1", "input");
46+
47+
const loop = store.loops.get("loop1")!;
48+
expect(loop.size).toBe(1);
49+
});
50+
51+
test("should remove handle from loop", () => {
52+
const store = useLoopStore.getState();
53+
54+
store.addHandle("loop1", "input");
55+
store.addHandle("loop1", "output");
56+
store.removeHandle("loop1", "input");
57+
58+
const loop = store.loops.get("loop1")!;
59+
expect(loop.size).toBe(1);
60+
expect(loop.has("input")).toBe(false);
61+
expect(loop.has("output")).toBe(true);
62+
});
63+
64+
test("should handle removing from non-existent loop", () => {
65+
const store = useLoopStore.getState();
66+
67+
// Should not throw error
68+
store.removeHandle("non-existent", "input");
69+
70+
expect(store.loops.size).toBe(0);
71+
});
72+
73+
test("should get handles for loop", () => {
74+
const store = useLoopStore.getState();
75+
76+
store.addHandle("loop1", "input");
77+
store.addHandle("loop1", "output");
78+
79+
const handles = store.getHandles("loop1");
80+
81+
expect(handles.size).toBe(2);
82+
expect(isUUIDv4WithoutDashes(handles.get("input")!)).toBe(true);
83+
expect(isUUIDv4WithoutDashes(handles.get("output")!)).toBe(true);
84+
});
85+
86+
test("should return empty map for non-existent loop", () => {
87+
const store = useLoopStore.getState();
88+
89+
const handles = store.getHandles("non-existent");
90+
91+
expect(handles.size).toBe(0);
92+
});
93+
94+
test("should save state to localStorage", () => {
95+
const store = useLoopStore.getState();
96+
97+
store.addHandle("loop1", "input");
98+
store.addHandle("loop1", "output");
99+
store.addHandle("loop2", "data");
100+
store.save();
101+
102+
const savedData = JSON.parse(
103+
localStorage.getItem("loop-store-calculator")!
104+
);
105+
106+
expect(savedData).toBeDefined();
107+
expect(savedData.loops).toHaveLength(2);
108+
expect(savedData.loops[0][0]).toBe("loop1");
109+
expect(savedData.loops[0][1]).toHaveLength(2);
110+
});
111+
112+
test("should initialize from localStorage", () => {
113+
// Setup localStorage data
114+
const testData = {
115+
loops: [
116+
[
117+
"loop1",
118+
[
119+
["input", "handle1"],
120+
["output", "handle2"],
121+
],
122+
],
123+
["loop2", [["data", "handle3"]]],
124+
],
125+
};
126+
localStorage.setItem("loop-store-calculator", JSON.stringify(testData));
127+
128+
useLoopStore.getState().init();
129+
const state = useLoopStore.getState();
130+
131+
expect(state.loops.size).toBe(2);
132+
expect(state.loops.get("loop1")!.get("input")).toBe("handle1");
133+
expect(state.loops.get("loop1")!.get("output")).toBe("handle2");
134+
expect(state.loops.get("loop2")!.get("data")).toBe("handle3");
135+
});
136+
137+
test("should reset when no localStorage data exists", () => {
138+
useLoopStore.getState().addHandle("loop1", "input");
139+
expect(useLoopStore.getState().loops.size).toBe(1);
140+
141+
useLoopStore.getState().init();
142+
143+
expect(useLoopStore.getState().loops.size).toBe(0);
144+
});
145+
146+
test("should reset loops to empty state", () => {
147+
useLoopStore.getState().addHandle("loop1", "input");
148+
useLoopStore.getState().addHandle("loop2", "output");
149+
expect(useLoopStore.getState().loops.size).toBe(2);
150+
151+
useLoopStore.getState().reset();
152+
153+
expect(useLoopStore.getState().loops.size).toBe(0);
154+
});
155+
});
156+
157+
function isUUIDv4WithoutDashes(str: string): boolean {
158+
const regex =
159+
/^[0-9a-f]{8}[0-9a-f]{4}4[0-9a-f]{3}[89ab][0-9a-f]{3}[0-9a-f]{12}$/i;
160+
return regex.test(str);
161+
}

0 commit comments

Comments
 (0)