Skip to content

Commit 955cd01

Browse files
committed
Add test for the map walker
1 parent 6162421 commit 955cd01

File tree

2 files changed

+185
-3
lines changed

2 files changed

+185
-3
lines changed

src/utils/walk-nested-map.test.ts

Lines changed: 182 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,182 @@
1+
import { describe, expect, it } from 'vitest'
2+
3+
import { walkNestedMap } from './walk-nested-map'
4+
5+
describe('walkNestedMap', () => {
6+
it('should walk a flat map', () => {
7+
expect(
8+
Array.from(
9+
walkNestedMap(
10+
new Map([
11+
['x', 1],
12+
['y', 2],
13+
['z', 3]
14+
])
15+
)
16+
)
17+
).toMatchInlineSnapshot(`
18+
[
19+
{
20+
"keys": [
21+
"x",
22+
],
23+
"value": 1,
24+
},
25+
{
26+
"keys": [
27+
"y",
28+
],
29+
"value": 2,
30+
},
31+
{
32+
"keys": [
33+
"z",
34+
],
35+
"value": 3,
36+
},
37+
]
38+
`)
39+
})
40+
41+
it('should walk a 2d map', () => {
42+
expect(
43+
Array.from(
44+
walkNestedMap(
45+
new Map([
46+
[
47+
'x',
48+
new Map([
49+
['x2', 1],
50+
['y2', 2],
51+
['z2', 3]
52+
])
53+
],
54+
[
55+
'y',
56+
new Map([
57+
['x3', 1],
58+
['y3', 2],
59+
['z3', 3]
60+
])
61+
]
62+
])
63+
)
64+
)
65+
).toMatchInlineSnapshot(`
66+
[
67+
{
68+
"keys": [
69+
"x",
70+
"x2",
71+
],
72+
"value": 1,
73+
},
74+
{
75+
"keys": [
76+
"x",
77+
"y2",
78+
],
79+
"value": 2,
80+
},
81+
{
82+
"keys": [
83+
"x",
84+
"z2",
85+
],
86+
"value": 3,
87+
},
88+
{
89+
"keys": [
90+
"y",
91+
"x3",
92+
],
93+
"value": 1,
94+
},
95+
{
96+
"keys": [
97+
"y",
98+
"y3",
99+
],
100+
"value": 2,
101+
},
102+
{
103+
"keys": [
104+
"y",
105+
"z3",
106+
],
107+
"value": 3,
108+
},
109+
]
110+
`)
111+
})
112+
113+
it('should walk a 3d map', () => {
114+
expect(
115+
Array.from(
116+
walkNestedMap(
117+
new Map([
118+
[
119+
'a',
120+
new Map([
121+
[
122+
'x',
123+
new Map([
124+
['x2', 1],
125+
['y2', 2],
126+
['z2', 3]
127+
])
128+
],
129+
[
130+
'y',
131+
new Map([
132+
['x3', 1],
133+
['y3', 2],
134+
['z3', 3]
135+
])
136+
]
137+
])
138+
],
139+
[
140+
'b',
141+
new Map([
142+
[
143+
'x',
144+
new Map([
145+
['x2', 1],
146+
['y2', 2],
147+
['z2', 3]
148+
])
149+
],
150+
[
151+
'y',
152+
new Map([
153+
['x3', 1],
154+
['y3', 2],
155+
['z3', 3]
156+
])
157+
]
158+
])
159+
]
160+
])
161+
)
162+
)
163+
// Makes test easier to read...
164+
.map(obj => JSON.stringify(obj))
165+
).toMatchInlineSnapshot(`
166+
[
167+
"{"keys":["a","x","x2"],"value":1}",
168+
"{"keys":["a","x","y2"],"value":2}",
169+
"{"keys":["a","x","z2"],"value":3}",
170+
"{"keys":["a","y","x3"],"value":1}",
171+
"{"keys":["a","y","y3"],"value":2}",
172+
"{"keys":["a","y","z3"],"value":3}",
173+
"{"keys":["b","x","x2"],"value":1}",
174+
"{"keys":["b","x","y2"],"value":2}",
175+
"{"keys":["b","x","z2"],"value":3}",
176+
"{"keys":["b","y","x3"],"value":1}",
177+
"{"keys":["b","y","y3"],"value":2}",
178+
"{"keys":["b","y","z3"],"value":3}",
179+
]
180+
`)
181+
})
182+
})

src/utils/walk-nested-map.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@ export function* walkNestedMap<T>(
44
map: NestedMap<T>,
55
keys: string[] = []
66
): Generator<{ keys: string[]; value: T }> {
7-
for (const [_key, value] of map.entries()) {
7+
for (const [key, value] of map.entries()) {
88
if (value instanceof Map) {
9-
yield* walkNestedMap(value as NestedMap<T>, keys.concat(_key))
9+
yield* walkNestedMap(value as NestedMap<T>, keys.concat(key))
1010
} else {
11-
yield { keys, value: value }
11+
yield { keys: keys.concat(key), value: value }
1212
}
1313
}
1414
}

0 commit comments

Comments
 (0)