@twick/2d 0.14.0 → 1.14.3
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 +21 -21
- package/editor/editor/tsconfig.build.tsbuildinfo +1 -1
- package/lib/components/Audio.d.ts.map +1 -1
- package/lib/components/Audio.js +33 -3
- package/lib/components/CodeBlock.d.ts +1 -1
- package/lib/components/Img.js +23 -23
- package/lib/components/Line.js +31 -31
- package/lib/components/Media.d.ts +6 -0
- package/lib/components/Media.d.ts.map +1 -1
- package/lib/components/Media.js +277 -61
- package/lib/components/Node.d.ts +1 -1
- package/lib/components/Path.d.ts +1 -1
- package/lib/components/SVG.d.ts +1 -1
- package/lib/components/Shape.d.ts +1 -1
- package/lib/components/Spline.js +25 -25
- package/lib/components/Video.d.ts +0 -1
- package/lib/components/Video.d.ts.map +1 -1
- package/lib/components/Video.js +70 -65
- package/lib/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +4 -5
- package/src/editor/NodeInspectorConfig.tsx +76 -76
- package/src/editor/PreviewOverlayConfig.tsx +67 -67
- package/src/editor/Provider.tsx +93 -93
- package/src/editor/SceneGraphTabConfig.tsx +81 -81
- package/src/editor/icons/CircleIcon.tsx +7 -7
- package/src/editor/icons/CodeBlockIcon.tsx +8 -8
- package/src/editor/icons/CurveIcon.tsx +7 -7
- package/src/editor/icons/GridIcon.tsx +7 -7
- package/src/editor/icons/IconMap.ts +35 -35
- package/src/editor/icons/ImgIcon.tsx +8 -8
- package/src/editor/icons/LayoutIcon.tsx +9 -9
- package/src/editor/icons/LineIcon.tsx +7 -7
- package/src/editor/icons/NodeIcon.tsx +7 -7
- package/src/editor/icons/RayIcon.tsx +7 -7
- package/src/editor/icons/RectIcon.tsx +7 -7
- package/src/editor/icons/ShapeIcon.tsx +7 -7
- package/src/editor/icons/TxtIcon.tsx +8 -8
- package/src/editor/icons/VideoIcon.tsx +7 -7
- package/src/editor/icons/View2DIcon.tsx +10 -10
- package/src/editor/index.ts +17 -17
- package/src/editor/tree/DetachedRoot.tsx +23 -23
- package/src/editor/tree/NodeElement.tsx +74 -74
- package/src/editor/tree/TreeElement.tsx +72 -72
- package/src/editor/tree/TreeRoot.tsx +10 -10
- package/src/editor/tree/ViewRoot.tsx +20 -20
- package/src/editor/tree/index.module.scss +38 -38
- package/src/editor/tree/index.ts +3 -3
- package/src/editor/tsconfig.build.json +5 -5
- package/src/editor/tsconfig.json +12 -12
- package/src/editor/tsdoc.json +4 -4
- package/src/editor/vite-env.d.ts +1 -1
- package/src/lib/code/CodeCursor.ts +445 -445
- package/src/lib/code/CodeDiffer.ts +78 -78
- package/src/lib/code/CodeFragment.ts +97 -97
- package/src/lib/code/CodeHighlighter.ts +75 -75
- package/src/lib/code/CodeMetrics.ts +47 -47
- package/src/lib/code/CodeRange.test.ts +74 -74
- package/src/lib/code/CodeRange.ts +216 -216
- package/src/lib/code/CodeScope.ts +101 -101
- package/src/lib/code/CodeSelection.ts +24 -24
- package/src/lib/code/CodeSignal.ts +327 -327
- package/src/lib/code/CodeTokenizer.ts +54 -54
- package/src/lib/code/DefaultHighlightStyle.ts +98 -98
- package/src/lib/code/LezerHighlighter.ts +113 -113
- package/src/lib/code/diff.test.ts +311 -311
- package/src/lib/code/diff.ts +319 -319
- package/src/lib/code/extractRange.ts +126 -126
- package/src/lib/code/index.ts +13 -13
- package/src/lib/components/Audio.ts +168 -131
- package/src/lib/components/Bezier.ts +105 -105
- package/src/lib/components/Circle.ts +266 -266
- package/src/lib/components/Code.ts +526 -526
- package/src/lib/components/CodeBlock.ts +576 -576
- package/src/lib/components/CubicBezier.ts +112 -112
- package/src/lib/components/Curve.ts +455 -455
- package/src/lib/components/Grid.ts +135 -135
- package/src/lib/components/Icon.ts +96 -96
- package/src/lib/components/Img.ts +319 -319
- package/src/lib/components/Knot.ts +157 -157
- package/src/lib/components/Latex.ts +122 -122
- package/src/lib/components/Layout.ts +1092 -1092
- package/src/lib/components/Line.ts +429 -429
- package/src/lib/components/Media.ts +576 -346
- package/src/lib/components/Node.ts +1940 -1940
- package/src/lib/components/Path.ts +137 -137
- package/src/lib/components/Polygon.ts +171 -171
- package/src/lib/components/QuadBezier.ts +100 -100
- package/src/lib/components/Ray.ts +125 -125
- package/src/lib/components/Rect.ts +187 -187
- package/src/lib/components/Rive.ts +156 -156
- package/src/lib/components/SVG.ts +797 -797
- package/src/lib/components/Shape.ts +143 -143
- package/src/lib/components/Spline.ts +344 -344
- package/src/lib/components/Txt.test.tsx +81 -81
- package/src/lib/components/Txt.ts +203 -203
- package/src/lib/components/TxtLeaf.ts +205 -205
- package/src/lib/components/Video.ts +461 -462
- package/src/lib/components/View2D.ts +98 -98
- package/src/lib/components/__tests__/children.test.tsx +142 -142
- package/src/lib/components/__tests__/clone.test.tsx +126 -126
- package/src/lib/components/__tests__/generatorTest.ts +28 -28
- package/src/lib/components/__tests__/mockScene2D.ts +45 -45
- package/src/lib/components/__tests__/query.test.tsx +122 -122
- package/src/lib/components/__tests__/state.test.tsx +60 -60
- package/src/lib/components/index.ts +28 -28
- package/src/lib/components/types.ts +35 -35
- package/src/lib/curves/ArcSegment.ts +159 -159
- package/src/lib/curves/CircleSegment.ts +77 -77
- package/src/lib/curves/CubicBezierSegment.ts +78 -78
- package/src/lib/curves/CurveDrawingInfo.ts +11 -11
- package/src/lib/curves/CurvePoint.ts +15 -15
- package/src/lib/curves/CurveProfile.ts +7 -7
- package/src/lib/curves/KnotInfo.ts +10 -10
- package/src/lib/curves/LineSegment.ts +62 -62
- package/src/lib/curves/Polynomial.ts +355 -355
- package/src/lib/curves/Polynomial2D.ts +62 -62
- package/src/lib/curves/PolynomialSegment.ts +124 -124
- package/src/lib/curves/QuadBezierSegment.ts +64 -64
- package/src/lib/curves/Segment.ts +17 -17
- package/src/lib/curves/UniformPolynomialCurveSampler.ts +94 -94
- package/src/lib/curves/createCurveProfileLerp.ts +471 -471
- package/src/lib/curves/getBezierSplineProfile.ts +223 -223
- package/src/lib/curves/getCircleProfile.ts +86 -86
- package/src/lib/curves/getPathProfile.ts +178 -178
- package/src/lib/curves/getPointAtDistance.ts +21 -21
- package/src/lib/curves/getPolylineProfile.test.ts +21 -21
- package/src/lib/curves/getPolylineProfile.ts +89 -89
- package/src/lib/curves/getRectProfile.ts +139 -139
- package/src/lib/curves/index.ts +16 -16
- package/src/lib/decorators/canvasStyleSignal.ts +16 -16
- package/src/lib/decorators/colorSignal.ts +9 -9
- package/src/lib/decorators/compound.ts +72 -72
- package/src/lib/decorators/computed.ts +18 -18
- package/src/lib/decorators/defaultStyle.ts +18 -18
- package/src/lib/decorators/filtersSignal.ts +136 -136
- package/src/lib/decorators/index.ts +10 -10
- package/src/lib/decorators/initializers.ts +32 -32
- package/src/lib/decorators/nodeName.ts +13 -13
- package/src/lib/decorators/signal.test.ts +90 -90
- package/src/lib/decorators/signal.ts +345 -345
- package/src/lib/decorators/spacingSignal.ts +15 -15
- package/src/lib/decorators/vector2Signal.ts +30 -30
- package/src/lib/globals.d.ts +2 -2
- package/src/lib/index.ts +8 -8
- package/src/lib/jsx-dev-runtime.ts +2 -2
- package/src/lib/jsx-runtime.ts +46 -46
- package/src/lib/parse-svg-path.d.ts +14 -14
- package/src/lib/partials/Filter.ts +180 -180
- package/src/lib/partials/Gradient.ts +102 -102
- package/src/lib/partials/Pattern.ts +34 -34
- package/src/lib/partials/ShaderConfig.ts +117 -117
- package/src/lib/partials/index.ts +4 -4
- package/src/lib/partials/types.ts +58 -58
- package/src/lib/scenes/Scene2D.ts +242 -242
- package/src/lib/scenes/index.ts +3 -3
- package/src/lib/scenes/makeScene2D.ts +16 -16
- package/src/lib/scenes/useScene2D.ts +6 -6
- package/src/lib/tsconfig.build.json +5 -5
- package/src/lib/tsconfig.json +10 -10
- package/src/lib/tsdoc.json +4 -4
- package/src/lib/utils/CanvasUtils.ts +306 -306
- package/src/lib/utils/diff.test.ts +453 -453
- package/src/lib/utils/diff.ts +148 -148
- package/src/lib/utils/index.ts +2 -2
- package/src/lib/utils/is.ts +11 -11
- package/src/lib/utils/makeSignalExtensions.ts +30 -30
- package/src/lib/utils/video/declarations.d.ts +1 -1
- package/src/lib/utils/video/ffmpeg-client.ts +50 -50
- package/src/lib/utils/video/mp4-parser-manager.ts +72 -72
- package/src/lib/utils/video/parser/index.ts +1 -1
- package/src/lib/utils/video/parser/parser.ts +257 -257
- package/src/lib/utils/video/parser/sampler.ts +72 -72
- package/src/lib/utils/video/parser/segment.ts +302 -302
- package/src/lib/utils/video/parser/sink.ts +29 -29
- package/src/lib/utils/video/parser/utils.ts +31 -31
- package/src/tsconfig.base.json +19 -19
- package/src/tsconfig.build.json +8 -8
- package/src/tsconfig.json +5 -5
- package/tsconfig.project.json +7 -7
- package/lib/components/utils/waitUntil.d.ts +0 -7
- package/lib/components/utils/waitUntil.d.ts.map +0 -1
- package/lib/components/utils/waitUntil.js +0 -15
- package/lib/utils/waitUntil.d.ts +0 -7
- package/lib/utils/waitUntil.d.ts.map +0 -1
- package/lib/utils/waitUntil.js +0 -15
- package/src/lib/utils/waitUntil.ts +0 -18
|
@@ -1,126 +1,126 @@
|
|
|
1
|
-
import {Vector2, createSignal, range} from '@twick/core';
|
|
2
|
-
import {describe, expect, it} from 'vitest';
|
|
3
|
-
import {Circle} from '../Circle';
|
|
4
|
-
import {Node} from '../Node';
|
|
5
|
-
import {mockScene2D} from './mockScene2D';
|
|
6
|
-
|
|
7
|
-
describe('clone', () => {
|
|
8
|
-
mockScene2D();
|
|
9
|
-
|
|
10
|
-
it('Normal clone', () => {
|
|
11
|
-
const signal = createSignal(45);
|
|
12
|
-
const template = (
|
|
13
|
-
<Circle lineWidth={8} startAngle={signal} end={0.5} />
|
|
14
|
-
) as Circle;
|
|
15
|
-
const clone = template.clone({end: 0});
|
|
16
|
-
|
|
17
|
-
expect(clone.lineWidth()).toBe(8);
|
|
18
|
-
expect(clone.startAngle()).toBe(45);
|
|
19
|
-
expect(clone.end()).toBe(0);
|
|
20
|
-
expect(clone.startArrow.context.isInitial()).toBe(true);
|
|
21
|
-
|
|
22
|
-
signal(90);
|
|
23
|
-
|
|
24
|
-
expect(clone.startAngle()).toBe(90);
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
it('Reactive clone', () => {
|
|
28
|
-
const signal = createSignal(45);
|
|
29
|
-
const template = (
|
|
30
|
-
<Circle lineWidth={8} startAngle={signal} end={0.5} />
|
|
31
|
-
) as Circle;
|
|
32
|
-
const clone = template.reactiveClone({end: 0});
|
|
33
|
-
|
|
34
|
-
expect(clone.lineWidth()).toBe(8);
|
|
35
|
-
expect(clone.startAngle()).toBe(45);
|
|
36
|
-
expect(clone.end()).toBe(0);
|
|
37
|
-
expect(clone.startArrow.context.isInitial()).toBe(false);
|
|
38
|
-
|
|
39
|
-
template.lineWidth(16);
|
|
40
|
-
template.startArrow(true);
|
|
41
|
-
template.end(0.25);
|
|
42
|
-
signal(90);
|
|
43
|
-
|
|
44
|
-
expect(clone.lineWidth()).toBe(16);
|
|
45
|
-
expect(clone.startAngle()).toBe(90);
|
|
46
|
-
expect(clone.startArrow()).toBe(true);
|
|
47
|
-
expect(clone.end()).toBe(0);
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
it('Snapshot clone', () => {
|
|
51
|
-
const signal = createSignal(45);
|
|
52
|
-
const template = (
|
|
53
|
-
<Circle lineWidth={8} startAngle={signal} end={0.5} />
|
|
54
|
-
) as Circle;
|
|
55
|
-
const clone = template.snapshotClone({end: 0});
|
|
56
|
-
|
|
57
|
-
expect(clone.lineWidth()).toBe(8);
|
|
58
|
-
expect(clone.startAngle()).toBe(45);
|
|
59
|
-
expect(clone.end()).toBe(0);
|
|
60
|
-
expect(clone.startArrow.context.isInitial()).toBe(true);
|
|
61
|
-
|
|
62
|
-
template.lineWidth(16);
|
|
63
|
-
template.startArrow(true);
|
|
64
|
-
signal(90);
|
|
65
|
-
|
|
66
|
-
expect(clone.lineWidth()).toBe(8);
|
|
67
|
-
expect(clone.startAngle()).toBe(45);
|
|
68
|
-
expect(clone.startArrow()).toBe(false);
|
|
69
|
-
});
|
|
70
|
-
|
|
71
|
-
it('Clone compound signal', () => {
|
|
72
|
-
const signal = Vector2.createSignal(200);
|
|
73
|
-
const template = (<Circle offset={1} position={signal} />) as Circle;
|
|
74
|
-
const clone = template.clone({x: 100, offsetY: -1});
|
|
75
|
-
|
|
76
|
-
expect(clone.x()).toBe(100);
|
|
77
|
-
expect(clone.y()).toBe(200);
|
|
78
|
-
expect(clone.offset.x()).toBe(1);
|
|
79
|
-
expect(clone.offset.y()).toBe(-1);
|
|
80
|
-
|
|
81
|
-
signal([300, 400]);
|
|
82
|
-
|
|
83
|
-
expect(clone.x()).toBe(100);
|
|
84
|
-
expect(clone.y()).toBe(400);
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
it('Clone children', () => {
|
|
88
|
-
const signal = createSignal(45);
|
|
89
|
-
const template = (
|
|
90
|
-
<Node>
|
|
91
|
-
<Circle lineWidth={8} startAngle={signal} />
|
|
92
|
-
</Node>
|
|
93
|
-
);
|
|
94
|
-
const clone = template.clone();
|
|
95
|
-
|
|
96
|
-
expect(clone.children().length).toBe(1);
|
|
97
|
-
expect(clone.childAs(0)).not.toBe(template.childAs(0));
|
|
98
|
-
expect(clone.childAs<Circle>(0)!.lineWidth()).toBe(8);
|
|
99
|
-
expect(clone.childAs<Circle>(0)!.startAngle()).toBe(45);
|
|
100
|
-
|
|
101
|
-
signal(90);
|
|
102
|
-
|
|
103
|
-
expect(clone.childAs<Circle>(0)!.startAngle()).toBe(90);
|
|
104
|
-
});
|
|
105
|
-
|
|
106
|
-
it('Clone spawner', () => {
|
|
107
|
-
const count = createSignal(3);
|
|
108
|
-
const template = (
|
|
109
|
-
<Node>
|
|
110
|
-
{() =>
|
|
111
|
-
range(count()).map(() => (
|
|
112
|
-
<Circle lineWidth={8} startAngle={count} end={0.5} />
|
|
113
|
-
))
|
|
114
|
-
}
|
|
115
|
-
</Node>
|
|
116
|
-
);
|
|
117
|
-
const clone = template.clone();
|
|
118
|
-
|
|
119
|
-
expect(clone.children().length).toBe(3);
|
|
120
|
-
expect(clone.childAs(0)).not.toBe(template.childAs(0));
|
|
121
|
-
|
|
122
|
-
count(5);
|
|
123
|
-
|
|
124
|
-
expect(clone.children().length).toBe(5);
|
|
125
|
-
});
|
|
126
|
-
});
|
|
1
|
+
import {Vector2, createSignal, range} from '@twick/core';
|
|
2
|
+
import {describe, expect, it} from 'vitest';
|
|
3
|
+
import {Circle} from '../Circle';
|
|
4
|
+
import {Node} from '../Node';
|
|
5
|
+
import {mockScene2D} from './mockScene2D';
|
|
6
|
+
|
|
7
|
+
describe('clone', () => {
|
|
8
|
+
mockScene2D();
|
|
9
|
+
|
|
10
|
+
it('Normal clone', () => {
|
|
11
|
+
const signal = createSignal(45);
|
|
12
|
+
const template = (
|
|
13
|
+
<Circle lineWidth={8} startAngle={signal} end={0.5} />
|
|
14
|
+
) as Circle;
|
|
15
|
+
const clone = template.clone({end: 0});
|
|
16
|
+
|
|
17
|
+
expect(clone.lineWidth()).toBe(8);
|
|
18
|
+
expect(clone.startAngle()).toBe(45);
|
|
19
|
+
expect(clone.end()).toBe(0);
|
|
20
|
+
expect(clone.startArrow.context.isInitial()).toBe(true);
|
|
21
|
+
|
|
22
|
+
signal(90);
|
|
23
|
+
|
|
24
|
+
expect(clone.startAngle()).toBe(90);
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
it('Reactive clone', () => {
|
|
28
|
+
const signal = createSignal(45);
|
|
29
|
+
const template = (
|
|
30
|
+
<Circle lineWidth={8} startAngle={signal} end={0.5} />
|
|
31
|
+
) as Circle;
|
|
32
|
+
const clone = template.reactiveClone({end: 0});
|
|
33
|
+
|
|
34
|
+
expect(clone.lineWidth()).toBe(8);
|
|
35
|
+
expect(clone.startAngle()).toBe(45);
|
|
36
|
+
expect(clone.end()).toBe(0);
|
|
37
|
+
expect(clone.startArrow.context.isInitial()).toBe(false);
|
|
38
|
+
|
|
39
|
+
template.lineWidth(16);
|
|
40
|
+
template.startArrow(true);
|
|
41
|
+
template.end(0.25);
|
|
42
|
+
signal(90);
|
|
43
|
+
|
|
44
|
+
expect(clone.lineWidth()).toBe(16);
|
|
45
|
+
expect(clone.startAngle()).toBe(90);
|
|
46
|
+
expect(clone.startArrow()).toBe(true);
|
|
47
|
+
expect(clone.end()).toBe(0);
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
it('Snapshot clone', () => {
|
|
51
|
+
const signal = createSignal(45);
|
|
52
|
+
const template = (
|
|
53
|
+
<Circle lineWidth={8} startAngle={signal} end={0.5} />
|
|
54
|
+
) as Circle;
|
|
55
|
+
const clone = template.snapshotClone({end: 0});
|
|
56
|
+
|
|
57
|
+
expect(clone.lineWidth()).toBe(8);
|
|
58
|
+
expect(clone.startAngle()).toBe(45);
|
|
59
|
+
expect(clone.end()).toBe(0);
|
|
60
|
+
expect(clone.startArrow.context.isInitial()).toBe(true);
|
|
61
|
+
|
|
62
|
+
template.lineWidth(16);
|
|
63
|
+
template.startArrow(true);
|
|
64
|
+
signal(90);
|
|
65
|
+
|
|
66
|
+
expect(clone.lineWidth()).toBe(8);
|
|
67
|
+
expect(clone.startAngle()).toBe(45);
|
|
68
|
+
expect(clone.startArrow()).toBe(false);
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
it('Clone compound signal', () => {
|
|
72
|
+
const signal = Vector2.createSignal(200);
|
|
73
|
+
const template = (<Circle offset={1} position={signal} />) as Circle;
|
|
74
|
+
const clone = template.clone({x: 100, offsetY: -1});
|
|
75
|
+
|
|
76
|
+
expect(clone.x()).toBe(100);
|
|
77
|
+
expect(clone.y()).toBe(200);
|
|
78
|
+
expect(clone.offset.x()).toBe(1);
|
|
79
|
+
expect(clone.offset.y()).toBe(-1);
|
|
80
|
+
|
|
81
|
+
signal([300, 400]);
|
|
82
|
+
|
|
83
|
+
expect(clone.x()).toBe(100);
|
|
84
|
+
expect(clone.y()).toBe(400);
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
it('Clone children', () => {
|
|
88
|
+
const signal = createSignal(45);
|
|
89
|
+
const template = (
|
|
90
|
+
<Node>
|
|
91
|
+
<Circle lineWidth={8} startAngle={signal} />
|
|
92
|
+
</Node>
|
|
93
|
+
);
|
|
94
|
+
const clone = template.clone();
|
|
95
|
+
|
|
96
|
+
expect(clone.children().length).toBe(1);
|
|
97
|
+
expect(clone.childAs(0)).not.toBe(template.childAs(0));
|
|
98
|
+
expect(clone.childAs<Circle>(0)!.lineWidth()).toBe(8);
|
|
99
|
+
expect(clone.childAs<Circle>(0)!.startAngle()).toBe(45);
|
|
100
|
+
|
|
101
|
+
signal(90);
|
|
102
|
+
|
|
103
|
+
expect(clone.childAs<Circle>(0)!.startAngle()).toBe(90);
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
it('Clone spawner', () => {
|
|
107
|
+
const count = createSignal(3);
|
|
108
|
+
const template = (
|
|
109
|
+
<Node>
|
|
110
|
+
{() =>
|
|
111
|
+
range(count()).map(() => (
|
|
112
|
+
<Circle lineWidth={8} startAngle={count} end={0.5} />
|
|
113
|
+
))
|
|
114
|
+
}
|
|
115
|
+
</Node>
|
|
116
|
+
);
|
|
117
|
+
const clone = template.clone();
|
|
118
|
+
|
|
119
|
+
expect(clone.children().length).toBe(3);
|
|
120
|
+
expect(clone.childAs(0)).not.toBe(template.childAs(0));
|
|
121
|
+
|
|
122
|
+
count(5);
|
|
123
|
+
|
|
124
|
+
expect(clone.children().length).toBe(5);
|
|
125
|
+
});
|
|
126
|
+
});
|
|
@@ -1,28 +1,28 @@
|
|
|
1
|
-
import type {ThreadGeneratorFactory} from '@twick/core';
|
|
2
|
-
import {threads} from '@twick/core';
|
|
3
|
-
import {useScene2D} from '../../scenes';
|
|
4
|
-
import type {View2D} from '../View2D';
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Turn a generator factory into a test function.
|
|
8
|
-
*
|
|
9
|
-
* @example
|
|
10
|
-
* ```ts
|
|
11
|
-
* it(
|
|
12
|
-
* 'Example test',
|
|
13
|
-
* generatorTest(function* () {
|
|
14
|
-
* yield* waitFor(1);
|
|
15
|
-
* expect(useTime()).toBe(1);
|
|
16
|
-
* }),
|
|
17
|
-
* );
|
|
18
|
-
* ```
|
|
19
|
-
*
|
|
20
|
-
* @param factory - The generator factory to test.
|
|
21
|
-
*/
|
|
22
|
-
export function generatorTest(factory: ThreadGeneratorFactory<View2D>) {
|
|
23
|
-
return () => {
|
|
24
|
-
const view = useScene2D().getView();
|
|
25
|
-
const tasks = threads(() => factory(view));
|
|
26
|
-
[...tasks];
|
|
27
|
-
};
|
|
28
|
-
}
|
|
1
|
+
import type {ThreadGeneratorFactory} from '@twick/core';
|
|
2
|
+
import {threads} from '@twick/core';
|
|
3
|
+
import {useScene2D} from '../../scenes';
|
|
4
|
+
import type {View2D} from '../View2D';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Turn a generator factory into a test function.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```ts
|
|
11
|
+
* it(
|
|
12
|
+
* 'Example test',
|
|
13
|
+
* generatorTest(function* () {
|
|
14
|
+
* yield* waitFor(1);
|
|
15
|
+
* expect(useTime()).toBe(1);
|
|
16
|
+
* }),
|
|
17
|
+
* );
|
|
18
|
+
* ```
|
|
19
|
+
*
|
|
20
|
+
* @param factory - The generator factory to test.
|
|
21
|
+
*/
|
|
22
|
+
export function generatorTest(factory: ThreadGeneratorFactory<View2D>) {
|
|
23
|
+
return () => {
|
|
24
|
+
const view = useScene2D().getView();
|
|
25
|
+
const tasks = threads(() => factory(view));
|
|
26
|
+
[...tasks];
|
|
27
|
+
};
|
|
28
|
+
}
|
|
@@ -1,45 +1,45 @@
|
|
|
1
|
-
import type {FullSceneDescription, ThreadGeneratorFactory} from '@twick/core';
|
|
2
|
-
import {
|
|
3
|
-
PlaybackManager,
|
|
4
|
-
PlaybackStatus,
|
|
5
|
-
Vector2,
|
|
6
|
-
endPlayback,
|
|
7
|
-
endScene,
|
|
8
|
-
startPlayback,
|
|
9
|
-
startScene,
|
|
10
|
-
} from '@twick/core';
|
|
11
|
-
import {afterAll, beforeAll, beforeEach} from 'vitest';
|
|
12
|
-
import {Scene2D, makeScene2D} from '../../scenes';
|
|
13
|
-
import type {View2D} from '../View2D';
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* Set up the test environment to support creating nodes.
|
|
17
|
-
*
|
|
18
|
-
* @remarks
|
|
19
|
-
* Should be called inside a `describe()` block.
|
|
20
|
-
* Due to js-dom limitations, layouts are not correctly computed.
|
|
21
|
-
*/
|
|
22
|
-
export function mockScene2D() {
|
|
23
|
-
const playback = new PlaybackManager();
|
|
24
|
-
const status = new PlaybackStatus(playback);
|
|
25
|
-
const description = {
|
|
26
|
-
...makeScene2D('scene 1', function* () {
|
|
27
|
-
// do nothing
|
|
28
|
-
}),
|
|
29
|
-
name: 'test',
|
|
30
|
-
size: new Vector2(1920, 1080),
|
|
31
|
-
resolutionScale: 1,
|
|
32
|
-
playback: status,
|
|
33
|
-
} as unknown as FullSceneDescription<ThreadGeneratorFactory<View2D>>;
|
|
34
|
-
const scene = new Scene2D(description);
|
|
35
|
-
|
|
36
|
-
beforeAll(() => {
|
|
37
|
-
startScene(scene);
|
|
38
|
-
startPlayback(status);
|
|
39
|
-
});
|
|
40
|
-
afterAll(() => {
|
|
41
|
-
endPlayback(status);
|
|
42
|
-
endScene(scene);
|
|
43
|
-
});
|
|
44
|
-
beforeEach(() => scene.reset());
|
|
45
|
-
}
|
|
1
|
+
import type {FullSceneDescription, ThreadGeneratorFactory} from '@twick/core';
|
|
2
|
+
import {
|
|
3
|
+
PlaybackManager,
|
|
4
|
+
PlaybackStatus,
|
|
5
|
+
Vector2,
|
|
6
|
+
endPlayback,
|
|
7
|
+
endScene,
|
|
8
|
+
startPlayback,
|
|
9
|
+
startScene,
|
|
10
|
+
} from '@twick/core';
|
|
11
|
+
import {afterAll, beforeAll, beforeEach} from 'vitest';
|
|
12
|
+
import {Scene2D, makeScene2D} from '../../scenes';
|
|
13
|
+
import type {View2D} from '../View2D';
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Set up the test environment to support creating nodes.
|
|
17
|
+
*
|
|
18
|
+
* @remarks
|
|
19
|
+
* Should be called inside a `describe()` block.
|
|
20
|
+
* Due to js-dom limitations, layouts are not correctly computed.
|
|
21
|
+
*/
|
|
22
|
+
export function mockScene2D() {
|
|
23
|
+
const playback = new PlaybackManager();
|
|
24
|
+
const status = new PlaybackStatus(playback);
|
|
25
|
+
const description = {
|
|
26
|
+
...makeScene2D('scene 1', function* () {
|
|
27
|
+
// do nothing
|
|
28
|
+
}),
|
|
29
|
+
name: 'test',
|
|
30
|
+
size: new Vector2(1920, 1080),
|
|
31
|
+
resolutionScale: 1,
|
|
32
|
+
playback: status,
|
|
33
|
+
} as unknown as FullSceneDescription<ThreadGeneratorFactory<View2D>>;
|
|
34
|
+
const scene = new Scene2D(description);
|
|
35
|
+
|
|
36
|
+
beforeAll(() => {
|
|
37
|
+
startScene(scene);
|
|
38
|
+
startPlayback(status);
|
|
39
|
+
});
|
|
40
|
+
afterAll(() => {
|
|
41
|
+
endPlayback(status);
|
|
42
|
+
endScene(scene);
|
|
43
|
+
});
|
|
44
|
+
beforeEach(() => scene.reset());
|
|
45
|
+
}
|
|
@@ -1,122 +1,122 @@
|
|
|
1
|
-
import {createRef, createRefArray} from '@twick/core';
|
|
2
|
-
import {describe, expect, it} from 'vitest';
|
|
3
|
-
import {useScene2D} from '../../scenes';
|
|
4
|
-
import {is} from '../../utils';
|
|
5
|
-
import {Circle} from '../Circle';
|
|
6
|
-
import {Rect} from '../Rect';
|
|
7
|
-
import {mockScene2D} from './mockScene2D';
|
|
8
|
-
|
|
9
|
-
describe('query', () => {
|
|
10
|
-
mockScene2D();
|
|
11
|
-
|
|
12
|
-
it('Query items based on their type', () => {
|
|
13
|
-
const view = useScene2D().getView();
|
|
14
|
-
const circles = createRefArray<Circle>();
|
|
15
|
-
view.add(
|
|
16
|
-
<>
|
|
17
|
-
<Rect />
|
|
18
|
-
<Circle ref={circles} />
|
|
19
|
-
<Rect />
|
|
20
|
-
<Circle ref={circles} />
|
|
21
|
-
<Rect />
|
|
22
|
-
</>,
|
|
23
|
-
);
|
|
24
|
-
|
|
25
|
-
const query = view.findAll(is(Circle));
|
|
26
|
-
expect(query.length).toBe(2);
|
|
27
|
-
expect(query).toEqual([...circles]);
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
it('Query items based on a custom predicate', () => {
|
|
31
|
-
const view = useScene2D().getView();
|
|
32
|
-
const nodes = createRefArray<Node>();
|
|
33
|
-
view.add(
|
|
34
|
-
<>
|
|
35
|
-
<Rect ref={nodes} scale={2} />
|
|
36
|
-
<Rect />
|
|
37
|
-
<Circle />
|
|
38
|
-
<Circle ref={nodes} scale={2} />
|
|
39
|
-
</>,
|
|
40
|
-
);
|
|
41
|
-
|
|
42
|
-
const query = view.findAll(node => node.scale.x() === 2);
|
|
43
|
-
expect(query.length).toBe(2);
|
|
44
|
-
expect(query).toEqual([...nodes]);
|
|
45
|
-
});
|
|
46
|
-
|
|
47
|
-
it('Query the first matching child', () => {
|
|
48
|
-
const view = useScene2D().getView();
|
|
49
|
-
const match = createRef<Circle>();
|
|
50
|
-
view.add(
|
|
51
|
-
<>
|
|
52
|
-
<Rect />
|
|
53
|
-
<Rect>
|
|
54
|
-
<Rect />
|
|
55
|
-
<Circle ref={match} />
|
|
56
|
-
</Rect>
|
|
57
|
-
<Circle />
|
|
58
|
-
<Rect />
|
|
59
|
-
</>,
|
|
60
|
-
);
|
|
61
|
-
|
|
62
|
-
const query = view.findFirst(is(Circle));
|
|
63
|
-
expect(query).toBe(match());
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
it('Query the last matching child', () => {
|
|
67
|
-
const view = useScene2D().getView();
|
|
68
|
-
const match = createRef<Circle>();
|
|
69
|
-
view.add(
|
|
70
|
-
<>
|
|
71
|
-
<Rect />
|
|
72
|
-
<Circle />
|
|
73
|
-
<Circle>
|
|
74
|
-
<Circle />
|
|
75
|
-
<Rect />
|
|
76
|
-
<Circle ref={match} />
|
|
77
|
-
</Circle>
|
|
78
|
-
<Rect />
|
|
79
|
-
</>,
|
|
80
|
-
);
|
|
81
|
-
|
|
82
|
-
const query = view.findLast(is(Circle));
|
|
83
|
-
expect(query?.key).toBe(match().key);
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
it('Query the first matching ancestor', () => {
|
|
87
|
-
const view = useScene2D().getView();
|
|
88
|
-
const child = createRef<Circle>();
|
|
89
|
-
const match = createRef<Circle>();
|
|
90
|
-
view.add(
|
|
91
|
-
<Circle>
|
|
92
|
-
<Circle ref={match}>
|
|
93
|
-
<Rect>
|
|
94
|
-
<Circle />
|
|
95
|
-
<Circle ref={child} />
|
|
96
|
-
<Circle />
|
|
97
|
-
</Rect>
|
|
98
|
-
</Circle>
|
|
99
|
-
</Circle>,
|
|
100
|
-
);
|
|
101
|
-
|
|
102
|
-
const query = child().findAncestor(is(Circle));
|
|
103
|
-
expect(query).toBe(match());
|
|
104
|
-
});
|
|
105
|
-
|
|
106
|
-
it('Retrieve a node by its key', () => {
|
|
107
|
-
const view = useScene2D().getView();
|
|
108
|
-
const match = createRef<Circle>();
|
|
109
|
-
view.add(
|
|
110
|
-
<>
|
|
111
|
-
<Circle>
|
|
112
|
-
<Rect />
|
|
113
|
-
<Circle ref={match} key="test-key" />
|
|
114
|
-
</Circle>
|
|
115
|
-
<Rect />
|
|
116
|
-
</>,
|
|
117
|
-
);
|
|
118
|
-
|
|
119
|
-
const query = view.findKey('test-key');
|
|
120
|
-
expect(query).toBe(match());
|
|
121
|
-
});
|
|
122
|
-
});
|
|
1
|
+
import {createRef, createRefArray} from '@twick/core';
|
|
2
|
+
import {describe, expect, it} from 'vitest';
|
|
3
|
+
import {useScene2D} from '../../scenes';
|
|
4
|
+
import {is} from '../../utils';
|
|
5
|
+
import {Circle} from '../Circle';
|
|
6
|
+
import {Rect} from '../Rect';
|
|
7
|
+
import {mockScene2D} from './mockScene2D';
|
|
8
|
+
|
|
9
|
+
describe('query', () => {
|
|
10
|
+
mockScene2D();
|
|
11
|
+
|
|
12
|
+
it('Query items based on their type', () => {
|
|
13
|
+
const view = useScene2D().getView();
|
|
14
|
+
const circles = createRefArray<Circle>();
|
|
15
|
+
view.add(
|
|
16
|
+
<>
|
|
17
|
+
<Rect />
|
|
18
|
+
<Circle ref={circles} />
|
|
19
|
+
<Rect />
|
|
20
|
+
<Circle ref={circles} />
|
|
21
|
+
<Rect />
|
|
22
|
+
</>,
|
|
23
|
+
);
|
|
24
|
+
|
|
25
|
+
const query = view.findAll(is(Circle));
|
|
26
|
+
expect(query.length).toBe(2);
|
|
27
|
+
expect(query).toEqual([...circles]);
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
it('Query items based on a custom predicate', () => {
|
|
31
|
+
const view = useScene2D().getView();
|
|
32
|
+
const nodes = createRefArray<Node>();
|
|
33
|
+
view.add(
|
|
34
|
+
<>
|
|
35
|
+
<Rect ref={nodes} scale={2} />
|
|
36
|
+
<Rect />
|
|
37
|
+
<Circle />
|
|
38
|
+
<Circle ref={nodes} scale={2} />
|
|
39
|
+
</>,
|
|
40
|
+
);
|
|
41
|
+
|
|
42
|
+
const query = view.findAll(node => node.scale.x() === 2);
|
|
43
|
+
expect(query.length).toBe(2);
|
|
44
|
+
expect(query).toEqual([...nodes]);
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
it('Query the first matching child', () => {
|
|
48
|
+
const view = useScene2D().getView();
|
|
49
|
+
const match = createRef<Circle>();
|
|
50
|
+
view.add(
|
|
51
|
+
<>
|
|
52
|
+
<Rect />
|
|
53
|
+
<Rect>
|
|
54
|
+
<Rect />
|
|
55
|
+
<Circle ref={match} />
|
|
56
|
+
</Rect>
|
|
57
|
+
<Circle />
|
|
58
|
+
<Rect />
|
|
59
|
+
</>,
|
|
60
|
+
);
|
|
61
|
+
|
|
62
|
+
const query = view.findFirst(is(Circle));
|
|
63
|
+
expect(query).toBe(match());
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
it('Query the last matching child', () => {
|
|
67
|
+
const view = useScene2D().getView();
|
|
68
|
+
const match = createRef<Circle>();
|
|
69
|
+
view.add(
|
|
70
|
+
<>
|
|
71
|
+
<Rect />
|
|
72
|
+
<Circle />
|
|
73
|
+
<Circle>
|
|
74
|
+
<Circle />
|
|
75
|
+
<Rect />
|
|
76
|
+
<Circle ref={match} />
|
|
77
|
+
</Circle>
|
|
78
|
+
<Rect />
|
|
79
|
+
</>,
|
|
80
|
+
);
|
|
81
|
+
|
|
82
|
+
const query = view.findLast(is(Circle));
|
|
83
|
+
expect(query?.key).toBe(match().key);
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
it('Query the first matching ancestor', () => {
|
|
87
|
+
const view = useScene2D().getView();
|
|
88
|
+
const child = createRef<Circle>();
|
|
89
|
+
const match = createRef<Circle>();
|
|
90
|
+
view.add(
|
|
91
|
+
<Circle>
|
|
92
|
+
<Circle ref={match}>
|
|
93
|
+
<Rect>
|
|
94
|
+
<Circle />
|
|
95
|
+
<Circle ref={child} />
|
|
96
|
+
<Circle />
|
|
97
|
+
</Rect>
|
|
98
|
+
</Circle>
|
|
99
|
+
</Circle>,
|
|
100
|
+
);
|
|
101
|
+
|
|
102
|
+
const query = child().findAncestor(is(Circle));
|
|
103
|
+
expect(query).toBe(match());
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
it('Retrieve a node by its key', () => {
|
|
107
|
+
const view = useScene2D().getView();
|
|
108
|
+
const match = createRef<Circle>();
|
|
109
|
+
view.add(
|
|
110
|
+
<>
|
|
111
|
+
<Circle>
|
|
112
|
+
<Rect />
|
|
113
|
+
<Circle ref={match} key="test-key" />
|
|
114
|
+
</Circle>
|
|
115
|
+
<Rect />
|
|
116
|
+
</>,
|
|
117
|
+
);
|
|
118
|
+
|
|
119
|
+
const query = view.findKey('test-key');
|
|
120
|
+
expect(query).toBe(match());
|
|
121
|
+
});
|
|
122
|
+
});
|