wyreframe 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +692 -0
- package/README.md +65 -5
- package/package.json +8 -7
- package/src/index.ts +425 -0
- package/src/renderer/Renderer.gen.tsx +49 -0
- package/src/renderer/Renderer.mjs +41 -1
- package/src/renderer/Renderer.res +78 -0
- package/src/test/Expect.mjs +9 -0
- package/src/parser/Core/__tests__/Bounds_test.mjs +0 -326
- package/src/parser/Core/__tests__/Bounds_test.res +0 -412
- package/src/parser/Core/__tests__/Grid_test.mjs +0 -322
- package/src/parser/Core/__tests__/Grid_test.res +0 -319
- package/src/parser/Core/__tests__/Types_test.mjs +0 -614
- package/src/parser/Core/__tests__/Types_test.res +0 -650
- package/src/parser/Detector/__tests__/BoxTracer_test.mjs +0 -70
- package/src/parser/Detector/__tests__/BoxTracer_test.res +0 -92
- package/src/parser/Detector/__tests__/HierarchyBuilder_test.mjs +0 -489
- package/src/parser/Detector/__tests__/HierarchyBuilder_test.res +0 -849
- package/src/parser/Detector/__tests__/ShapeDetector_test.mjs +0 -377
- package/src/parser/Detector/__tests__/ShapeDetector_test.res +0 -563
- package/src/parser/Interactions/__tests__/InteractionMerger_test.mjs +0 -576
- package/src/parser/Interactions/__tests__/InteractionMerger_test.res +0 -646
- package/src/parser/Scanner/__tests__/Grid_manual.mjs +0 -214
- package/src/parser/Scanner/__tests__/Grid_manual.res +0 -141
- package/src/parser/Semantic/Elements/__tests__/ButtonParser_test.mjs +0 -189
- package/src/parser/Semantic/Elements/__tests__/ButtonParser_test.res +0 -257
- package/src/parser/Semantic/Elements/__tests__/CheckboxParser_test.mjs +0 -202
- package/src/parser/Semantic/Elements/__tests__/CheckboxParser_test.res +0 -250
- package/src/parser/Semantic/Elements/__tests__/CodeTextParser_manual.mjs +0 -293
- package/src/parser/Semantic/Elements/__tests__/CodeTextParser_manual.res +0 -134
- package/src/parser/Semantic/Elements/__tests__/InputParser_test.mjs +0 -253
- package/src/parser/Semantic/Elements/__tests__/InputParser_test.res +0 -304
- package/src/parser/Semantic/Elements/__tests__/LinkParser_test.mjs +0 -289
- package/src/parser/Semantic/Elements/__tests__/LinkParser_test.res +0 -402
- package/src/parser/Semantic/Elements/__tests__/TextParser_test.mjs +0 -149
- package/src/parser/Semantic/Elements/__tests__/TextParser_test.res +0 -167
- package/src/parser/Semantic/__tests__/ASTBuilder_test.mjs +0 -187
- package/src/parser/Semantic/__tests__/ASTBuilder_test.res +0 -192
- package/src/parser/Semantic/__tests__/ParserRegistry_test.mjs +0 -154
- package/src/parser/Semantic/__tests__/ParserRegistry_test.res +0 -191
- package/src/parser/Semantic/__tests__/SemanticParser_integration_test.mjs +0 -768
- package/src/parser/Semantic/__tests__/SemanticParser_integration_test.res +0 -1069
- package/src/parser/Semantic/__tests__/SemanticParser_manual.mjs +0 -1329
- package/src/parser/Semantic/__tests__/SemanticParser_manual.res +0 -544
- package/src/parser/__tests__/GridScanner_integration.test.mjs +0 -632
- package/src/parser/__tests__/GridScanner_integration.test.res +0 -816
- package/src/parser/__tests__/Performance.test.mjs +0 -244
- package/src/parser/__tests__/Performance.test.res +0 -371
- package/src/parser/__tests__/PerformanceFixtures.mjs +0 -200
- package/src/parser/__tests__/PerformanceFixtures.res +0 -284
- package/src/parser/__tests__/WyreframeParser_integration.test.mjs +0 -770
- package/src/parser/__tests__/WyreframeParser_integration.test.res +0 -1008
- package/src/parser/__tests__/fixtures/alignment-test.txt +0 -9
- package/src/parser/__tests__/fixtures/all-elements.txt +0 -16
- package/src/parser/__tests__/fixtures/login-scene.txt +0 -17
- package/src/parser/__tests__/fixtures/multi-scene.txt +0 -25
- package/src/parser/__tests__/fixtures/nested-boxes.txt +0 -15
- package/src/parser/__tests__/fixtures/simple-box.txt +0 -5
- package/src/parser/__tests__/fixtures/with-dividers.txt +0 -14
|
@@ -1,377 +0,0 @@
|
|
|
1
|
-
// Generated by ReScript, PLEASE EDIT WITH CARE
|
|
2
|
-
|
|
3
|
-
import * as Grid from "../../Core/Grid.mjs";
|
|
4
|
-
import * as Types from "../../Core/Types.mjs";
|
|
5
|
-
import * as Vitest from "rescript-vitest/src/Vitest.mjs";
|
|
6
|
-
import * as ErrorTypes from "../../Errors/ErrorTypes.mjs";
|
|
7
|
-
import * as Core__Option from "@rescript/core/src/Core__Option.mjs";
|
|
8
|
-
import * as ShapeDetector from "../ShapeDetector.mjs";
|
|
9
|
-
|
|
10
|
-
function makeGrid(wireframe) {
|
|
11
|
-
return Grid.fromLines(wireframe.trim().split("\n"));
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
function expectOkWithBoxCount(t, result, expectedCount) {
|
|
15
|
-
if (result.TAG === "Ok") {
|
|
16
|
-
let boxes = result._0;
|
|
17
|
-
t.expect(boxes.length).toBe(expectedCount);
|
|
18
|
-
return boxes;
|
|
19
|
-
}
|
|
20
|
-
console.error("Expected Ok but got Error:");
|
|
21
|
-
result._0.forEach(err => {
|
|
22
|
-
console.error(ErrorTypes.getCodeName(err.code));
|
|
23
|
-
});
|
|
24
|
-
t.expect(true).toBe(false);
|
|
25
|
-
return [];
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
function expectErrorWithCount(t, result, minErrorCount) {
|
|
29
|
-
if (result.TAG === "Ok") {
|
|
30
|
-
t.expect(true).toBe(false);
|
|
31
|
-
return [];
|
|
32
|
-
}
|
|
33
|
-
let errors = result._0;
|
|
34
|
-
t.expect(errors.length).toBeGreaterThanOrEqual(minErrorCount);
|
|
35
|
-
return errors;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
Vitest.describe("ShapeDetector - Single Box", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, () => {
|
|
39
|
-
Vitest.test("SD-01: detects a simple box", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, t => {
|
|
40
|
-
let grid = makeGrid(`
|
|
41
|
-
+------+
|
|
42
|
-
| |
|
|
43
|
-
+------+
|
|
44
|
-
`);
|
|
45
|
-
let result = ShapeDetector.detect(grid);
|
|
46
|
-
let boxes = expectOkWithBoxCount(t, result, 1);
|
|
47
|
-
let box = Core__Option.getExn(boxes[0], undefined);
|
|
48
|
-
t.expect(box.children.length).toBe(0);
|
|
49
|
-
t.expect(box.name).toBe(undefined);
|
|
50
|
-
});
|
|
51
|
-
Vitest.test("SD-01b: handles boxes with different dimensions", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, t => {
|
|
52
|
-
let grid = makeGrid(`
|
|
53
|
-
+----------+
|
|
54
|
-
| |
|
|
55
|
-
| |
|
|
56
|
-
+----------+
|
|
57
|
-
`);
|
|
58
|
-
let result = ShapeDetector.detect(grid);
|
|
59
|
-
expectOkWithBoxCount(t, result, 1);
|
|
60
|
-
});
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
Vitest.describe("ShapeDetector - Nested Boxes", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, () => {
|
|
64
|
-
Vitest.test("SD-02: detects 2-level nested boxes", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, t => {
|
|
65
|
-
let grid = makeGrid(`
|
|
66
|
-
+----------+
|
|
67
|
-
| +----+ |
|
|
68
|
-
| | | |
|
|
69
|
-
| +----+ |
|
|
70
|
-
+----------+
|
|
71
|
-
`);
|
|
72
|
-
let result = ShapeDetector.detect(grid);
|
|
73
|
-
let boxes = expectOkWithBoxCount(t, result, 1);
|
|
74
|
-
let outer = Core__Option.getExn(boxes[0], undefined);
|
|
75
|
-
t.expect(outer.children.length).toBe(1);
|
|
76
|
-
let inner = Core__Option.getExn(outer.children[0], undefined);
|
|
77
|
-
t.expect(Types.Bounds.contains(outer.bounds, inner.bounds)).toBe(true);
|
|
78
|
-
});
|
|
79
|
-
Vitest.test("SD-03: detects 3-level nested boxes", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, t => {
|
|
80
|
-
let grid = makeGrid(`
|
|
81
|
-
+--------------+
|
|
82
|
-
| +----------+ |
|
|
83
|
-
| | +------+ | |
|
|
84
|
-
| | | | | |
|
|
85
|
-
| | +------+ | |
|
|
86
|
-
| +----------+ |
|
|
87
|
-
+--------------+
|
|
88
|
-
`);
|
|
89
|
-
let result = ShapeDetector.detect(grid);
|
|
90
|
-
let boxes = expectOkWithBoxCount(t, result, 1);
|
|
91
|
-
let outer = Core__Option.getExn(boxes[0], undefined);
|
|
92
|
-
t.expect(outer.children.length).toBe(1);
|
|
93
|
-
let middle = Core__Option.getExn(outer.children[0], undefined);
|
|
94
|
-
t.expect(middle.children.length).toBe(1);
|
|
95
|
-
let inner = Core__Option.getExn(middle.children[0], undefined);
|
|
96
|
-
t.expect(inner.children.length).toBe(0);
|
|
97
|
-
let total = ShapeDetector.countBoxes(boxes);
|
|
98
|
-
t.expect(total).toBe(3);
|
|
99
|
-
});
|
|
100
|
-
});
|
|
101
|
-
|
|
102
|
-
Vitest.describe("ShapeDetector - Sibling Boxes", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, () => Vitest.test("SD-04: detects sibling boxes at same level", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, t => {
|
|
103
|
-
let grid = makeGrid(`
|
|
104
|
-
+-----+ +-----+
|
|
105
|
-
| | | |
|
|
106
|
-
+-----+ +-----+
|
|
107
|
-
`);
|
|
108
|
-
let result = ShapeDetector.detect(grid);
|
|
109
|
-
let boxes = expectOkWithBoxCount(t, result, 2);
|
|
110
|
-
let box1 = Core__Option.getExn(boxes[0], undefined);
|
|
111
|
-
let box2 = Core__Option.getExn(boxes[1], undefined);
|
|
112
|
-
t.expect(Types.Bounds.contains(box1.bounds, box2.bounds)).toBe(false);
|
|
113
|
-
t.expect(Types.Bounds.contains(box2.bounds, box1.bounds)).toBe(false);
|
|
114
|
-
t.expect(Types.Bounds.overlaps(box1.bounds, box2.bounds)).toBe(false);
|
|
115
|
-
t.expect(box1.children.length).toBe(0);
|
|
116
|
-
t.expect(box2.children.length).toBe(0);
|
|
117
|
-
}));
|
|
118
|
-
|
|
119
|
-
Vitest.describe("ShapeDetector - Dividers", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, () => {
|
|
120
|
-
Vitest.test("SD-05: handles box with single divider", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, t => {
|
|
121
|
-
let grid = makeGrid(`
|
|
122
|
-
+-----+
|
|
123
|
-
| |
|
|
124
|
-
+=====+
|
|
125
|
-
| |
|
|
126
|
-
+-----+
|
|
127
|
-
`);
|
|
128
|
-
let result = ShapeDetector.detect(grid);
|
|
129
|
-
expectOkWithBoxCount(t, result, 1);
|
|
130
|
-
});
|
|
131
|
-
Vitest.test("SD-06: handles box with multiple dividers", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, t => {
|
|
132
|
-
let grid = makeGrid(`
|
|
133
|
-
+-----+
|
|
134
|
-
| |
|
|
135
|
-
+=====+
|
|
136
|
-
| |
|
|
137
|
-
+=====+
|
|
138
|
-
| |
|
|
139
|
-
+-----+
|
|
140
|
-
`);
|
|
141
|
-
let result = ShapeDetector.detect(grid);
|
|
142
|
-
expectOkWithBoxCount(t, result, 1);
|
|
143
|
-
});
|
|
144
|
-
});
|
|
145
|
-
|
|
146
|
-
Vitest.describe("ShapeDetector - Box Names", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, () => {
|
|
147
|
-
Vitest.test("SD-07: extracts box name from top border", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, t => {
|
|
148
|
-
let grid = makeGrid(`
|
|
149
|
-
+--Login--+
|
|
150
|
-
| |
|
|
151
|
-
+---------+
|
|
152
|
-
`);
|
|
153
|
-
let result = ShapeDetector.detect(grid);
|
|
154
|
-
let boxes = expectOkWithBoxCount(t, result, 1);
|
|
155
|
-
let box = Core__Option.getExn(boxes[0], undefined);
|
|
156
|
-
t.expect(box.name).toEqual("Login");
|
|
157
|
-
});
|
|
158
|
-
Vitest.test("SD-08: handles multiple named boxes", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, t => {
|
|
159
|
-
let grid = makeGrid(`
|
|
160
|
-
+--Header--+
|
|
161
|
-
| |
|
|
162
|
-
+----------+
|
|
163
|
-
|
|
164
|
-
+--Content-+
|
|
165
|
-
| |
|
|
166
|
-
+----------+
|
|
167
|
-
`);
|
|
168
|
-
let result = ShapeDetector.detect(grid);
|
|
169
|
-
let boxes = expectOkWithBoxCount(t, result, 2);
|
|
170
|
-
let hasHeader = boxes.some(box => {
|
|
171
|
-
let match = box.name;
|
|
172
|
-
return match === "Header";
|
|
173
|
-
});
|
|
174
|
-
let hasContent = boxes.some(box => {
|
|
175
|
-
let match = box.name;
|
|
176
|
-
return match === "Content";
|
|
177
|
-
});
|
|
178
|
-
t.expect(hasHeader).toBe(true);
|
|
179
|
-
t.expect(hasContent).toBe(true);
|
|
180
|
-
});
|
|
181
|
-
});
|
|
182
|
-
|
|
183
|
-
Vitest.describe("ShapeDetector - Error Cases", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, () => {
|
|
184
|
-
Vitest.test("SD-09: detects unclosed box - missing top corner", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, t => {
|
|
185
|
-
let grid = makeGrid(`
|
|
186
|
-
+-----
|
|
187
|
-
| |
|
|
188
|
-
+-----+
|
|
189
|
-
`);
|
|
190
|
-
let result = ShapeDetector.detect(grid);
|
|
191
|
-
let errors = expectErrorWithCount(t, result, 1);
|
|
192
|
-
let hasUncloseError = errors.some(err => {
|
|
193
|
-
let match = err.code;
|
|
194
|
-
if (match.TAG === "UncloseBox") {
|
|
195
|
-
return match.direction === "top";
|
|
196
|
-
} else {
|
|
197
|
-
return false;
|
|
198
|
-
}
|
|
199
|
-
});
|
|
200
|
-
t.expect(hasUncloseError).toBe(true);
|
|
201
|
-
});
|
|
202
|
-
Vitest.test("SD-10: detects unclosed box - missing bottom corner", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, t => {
|
|
203
|
-
let grid = makeGrid(`
|
|
204
|
-
+-----+
|
|
205
|
-
| |
|
|
206
|
-
+-----
|
|
207
|
-
`);
|
|
208
|
-
let result = ShapeDetector.detect(grid);
|
|
209
|
-
let errors = expectErrorWithCount(t, result, 1);
|
|
210
|
-
let hasUncloseError = errors.some(err => {
|
|
211
|
-
let match = err.code;
|
|
212
|
-
if (match.TAG === "UncloseBox") {
|
|
213
|
-
return match.direction === "bottom";
|
|
214
|
-
} else {
|
|
215
|
-
return false;
|
|
216
|
-
}
|
|
217
|
-
});
|
|
218
|
-
t.expect(hasUncloseError).toBe(true);
|
|
219
|
-
});
|
|
220
|
-
Vitest.test("SD-11: detects mismatched width", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, t => {
|
|
221
|
-
let grid = makeGrid(`
|
|
222
|
-
+-----+
|
|
223
|
-
| |
|
|
224
|
-
+-------+
|
|
225
|
-
`);
|
|
226
|
-
let result = ShapeDetector.detect(grid);
|
|
227
|
-
let errors = expectErrorWithCount(t, result, 1);
|
|
228
|
-
let hasMismatchError = errors.some(err => {
|
|
229
|
-
let match = err.code;
|
|
230
|
-
return match.TAG === "MismatchedWidth";
|
|
231
|
-
});
|
|
232
|
-
t.expect(hasMismatchError).toBe(true);
|
|
233
|
-
});
|
|
234
|
-
Vitest.test("SD-12: detects unclosed box - misaligned left edge", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, t => {
|
|
235
|
-
let grid = makeGrid(`
|
|
236
|
-
+-----+
|
|
237
|
-
| |
|
|
238
|
-
| |
|
|
239
|
-
+-----+
|
|
240
|
-
`);
|
|
241
|
-
let result = ShapeDetector.detect(grid);
|
|
242
|
-
let errors = expectErrorWithCount(t, result, 1);
|
|
243
|
-
let hasUncloseError = errors.some(err => {
|
|
244
|
-
let match = err.code;
|
|
245
|
-
if (match.TAG === "UncloseBox") {
|
|
246
|
-
return match.direction === "left";
|
|
247
|
-
} else {
|
|
248
|
-
return false;
|
|
249
|
-
}
|
|
250
|
-
});
|
|
251
|
-
t.expect(hasUncloseError).toBe(true);
|
|
252
|
-
});
|
|
253
|
-
});
|
|
254
|
-
|
|
255
|
-
Vitest.describe("ShapeDetector - Edge Cases", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, () => Vitest.test("SD-14: handles empty grid with no boxes", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, t => {
|
|
256
|
-
let grid = makeGrid(`
|
|
257
|
-
abc
|
|
258
|
-
def
|
|
259
|
-
ghi
|
|
260
|
-
`);
|
|
261
|
-
let result = ShapeDetector.detect(grid);
|
|
262
|
-
expectOkWithBoxCount(t, result, 0);
|
|
263
|
-
}));
|
|
264
|
-
|
|
265
|
-
Vitest.describe("ShapeDetector - Complex Integration", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, () => Vitest.test("SD-15: handles nested structure with sibling inner boxes", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, t => {
|
|
266
|
-
let grid = makeGrid(`
|
|
267
|
-
+----------+
|
|
268
|
-
| +--+ +--+|
|
|
269
|
-
| | | | ||
|
|
270
|
-
| +--+ +--+|
|
|
271
|
-
+----------+
|
|
272
|
-
`);
|
|
273
|
-
let result = ShapeDetector.detect(grid);
|
|
274
|
-
let boxes = expectOkWithBoxCount(t, result, 1);
|
|
275
|
-
let outer = Core__Option.getExn(boxes[0], undefined);
|
|
276
|
-
t.expect(outer.children.length).toBe(2);
|
|
277
|
-
let total = ShapeDetector.countBoxes(boxes);
|
|
278
|
-
t.expect(total).toBe(3);
|
|
279
|
-
}));
|
|
280
|
-
|
|
281
|
-
Vitest.describe("ShapeDetector - Deduplication & Error Recovery", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, () => {
|
|
282
|
-
Vitest.test("SD-16: deduplicates boxes traced from multiple corners", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, t => {
|
|
283
|
-
let grid = makeGrid(`
|
|
284
|
-
+-----+
|
|
285
|
-
| |
|
|
286
|
-
+-----+
|
|
287
|
-
`);
|
|
288
|
-
t.expect(grid.cornerIndex.length).toBe(4);
|
|
289
|
-
let result = ShapeDetector.detect(grid);
|
|
290
|
-
expectOkWithBoxCount(t, result, 1);
|
|
291
|
-
});
|
|
292
|
-
Vitest.test("SD-17: returns valid boxes when some traces succeed (REQ-28)", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, t => {
|
|
293
|
-
let grid = makeGrid(`
|
|
294
|
-
+---+ +-----
|
|
295
|
-
| | | |
|
|
296
|
-
+---+ +-----+
|
|
297
|
-
|
|
298
|
-
+-----+
|
|
299
|
-
| |
|
|
300
|
-
+-------+
|
|
301
|
-
`);
|
|
302
|
-
let result = ShapeDetector.detect(grid);
|
|
303
|
-
let boxes = expectOkWithBoxCount(t, result, 1);
|
|
304
|
-
t.expect(boxes.length).toBeGreaterThanOrEqual(1);
|
|
305
|
-
});
|
|
306
|
-
});
|
|
307
|
-
|
|
308
|
-
Vitest.describe("ShapeDetector - Helper Functions", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, () => {
|
|
309
|
-
Vitest.test("SD-18a: countBoxes counts all boxes including nested", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, t => {
|
|
310
|
-
let grid = makeGrid(`
|
|
311
|
-
+----------+
|
|
312
|
-
| +------+ |
|
|
313
|
-
| | +--+ | |
|
|
314
|
-
| | | | | |
|
|
315
|
-
| | +--+ | |
|
|
316
|
-
| +------+ |
|
|
317
|
-
+----------+
|
|
318
|
-
`);
|
|
319
|
-
let result = ShapeDetector.detect(grid);
|
|
320
|
-
let boxes = expectOkWithBoxCount(t, result, 1);
|
|
321
|
-
let total = ShapeDetector.countBoxes(boxes);
|
|
322
|
-
t.expect(total).toBe(3);
|
|
323
|
-
});
|
|
324
|
-
Vitest.test("SD-18b: flattenBoxes returns all boxes in flat array", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, t => {
|
|
325
|
-
let grid = makeGrid(`
|
|
326
|
-
+----------+
|
|
327
|
-
| +------+ |
|
|
328
|
-
| | +--+ | |
|
|
329
|
-
| | | | | |
|
|
330
|
-
| | +--+ | |
|
|
331
|
-
| +------+ |
|
|
332
|
-
+----------+
|
|
333
|
-
`);
|
|
334
|
-
let result = ShapeDetector.detect(grid);
|
|
335
|
-
let boxes = expectOkWithBoxCount(t, result, 1);
|
|
336
|
-
let flat = ShapeDetector.flattenBoxes(boxes);
|
|
337
|
-
t.expect(flat.length).toBe(3);
|
|
338
|
-
});
|
|
339
|
-
Vitest.test("SD-18c: getStats returns formatted statistics for Ok result", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, t => {
|
|
340
|
-
let grid = makeGrid(`
|
|
341
|
-
+-----+
|
|
342
|
-
| |
|
|
343
|
-
+-----+
|
|
344
|
-
`);
|
|
345
|
-
let result = ShapeDetector.detect(grid);
|
|
346
|
-
let stats = ShapeDetector.getStats(result);
|
|
347
|
-
t.expect(stats.includes("Success")).toBe(true);
|
|
348
|
-
t.expect(stats.includes("Root boxes: 1")).toBe(true);
|
|
349
|
-
});
|
|
350
|
-
Vitest.test("SD-18d: getStats returns formatted statistics for Error result", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, t => {
|
|
351
|
-
let grid = makeGrid(`
|
|
352
|
-
+-----
|
|
353
|
-
| |
|
|
354
|
-
+-----+
|
|
355
|
-
`);
|
|
356
|
-
let result = ShapeDetector.detect(grid);
|
|
357
|
-
let stats = ShapeDetector.getStats(result);
|
|
358
|
-
t.expect(stats.includes("Failed")).toBe(true);
|
|
359
|
-
});
|
|
360
|
-
Vitest.test("SD-18e: countBoxes handles empty array", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, t => {
|
|
361
|
-
let emptyBoxes = [];
|
|
362
|
-
let count = ShapeDetector.countBoxes(emptyBoxes);
|
|
363
|
-
t.expect(count).toBe(0);
|
|
364
|
-
});
|
|
365
|
-
Vitest.test("SD-18f: flattenBoxes handles empty array", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, t => {
|
|
366
|
-
let emptyBoxes = [];
|
|
367
|
-
let flat = ShapeDetector.flattenBoxes(emptyBoxes);
|
|
368
|
-
t.expect(flat.length).toBe(0);
|
|
369
|
-
});
|
|
370
|
-
});
|
|
371
|
-
|
|
372
|
-
export {
|
|
373
|
-
makeGrid,
|
|
374
|
-
expectOkWithBoxCount,
|
|
375
|
-
expectErrorWithCount,
|
|
376
|
-
}
|
|
377
|
-
/* Not a pure module */
|