1
2
3describe('PathKit\'s Path Behavior', function() {
4    // Note, don't try to print the PathKit object - it can cause Karma/Jasmine to lock up.
5    var PathKit = null;
6    const LoadPathKit = new Promise(function(resolve, reject) {
7        if (PathKit) {
8            resolve();
9        } else {
10            PathKitInit({
11                locateFile: (file) => '/pathkit/'+file,
12            }).ready().then((_PathKit) => {
13                PathKit = _PathKit;
14                resolve();
15            });
16        }
17    });
18
19    function drawPath() {
20        let path = PathKit.NewPath();
21        path.moveTo(20, 5);
22        path.lineTo(30, 20);
23        path.lineTo(40, 10);
24        path.lineTo(50, 20);
25        path.lineTo(60, 0);
26        path.lineTo(20, 5);
27
28        path.moveTo(20, 80);
29        path.bezierCurveTo(90, 10, 160, 150, 190, 10);
30
31        path.moveTo(36, 148);
32        path.quadraticCurveTo(66, 188, 120, 136);
33        path.lineTo(36, 148);
34
35        path.rect(5, 170, 20, 20);
36
37        path.moveTo(150, 180);
38        path.arcTo(150, 100, 50, 200, 20);
39        path.lineTo(160, 160);
40
41        path.moveTo(20, 120);
42        path.arc(20, 120, 18, 0, 1.75 * Math.PI);
43        path.lineTo(20, 120);
44
45        let secondPath = PathKit.NewPath();
46        secondPath.ellipse(130, 25, 30, 10, -1*Math.PI/8, Math.PI/6, 1.5*Math.PI, false);
47
48        path.addPath(secondPath);
49
50        let m = document.createElementNS('http://www.w3.org/2000/svg', 'svg').createSVGMatrix();
51        m.a = 1; m.b = 0;
52        m.c = 0; m.d = 1;
53        m.e = 0; m.f = 20.5;
54
55        path.addPath(secondPath, m);
56        secondPath.delete();
57        return path;
58    }
59
60    it('path_path2dapi', function(done) {
61        function setup(ctx) { }
62
63        function test(ctx) {
64            path = drawPath();
65            path.delete();
66        }
67
68        function teardown(ctx) { }
69
70        LoadPathKit.then(() => {
71            benchmarkAndReport('path_path2dapi', setup, test, teardown).then(() => {
72                done();
73            }).catch(reportError(done));
74        });
75    });
76
77    describe('import options', function() {
78        it('path_copy', function(done) {
79            function setup(ctx) {
80                ctx.path = PathKit.FromSVGString('M 205,5 L 795,5 L 595,295 L 5,295 L 205,5 z');
81            }
82
83            function test(ctx) {
84                let p = ctx.path.copy();
85                p.delete();
86            }
87
88            function teardown(ctx) {
89                ctx.path.delete();
90            }
91
92            LoadPathKit.then(() => {
93                benchmarkAndReport('path_copy', setup, test, teardown).then(() => {
94                    done();
95                }).catch(reportError(done));
96            });
97        });
98
99        it('path_from_api_calls', function(done) {
100            function setup(ctx) { }
101
102            function test(ctx) {
103                let p = PathKit.NewPath()
104                               .moveTo(205, 5)
105                               .lineTo(795, 5)
106                               .lineTo(595, 295)
107                               .lineTo(5, 295)
108                               .lineTo(205, 5)
109                               .close();
110                p.delete();
111            }
112
113            function teardown(ctx) { }
114
115            LoadPathKit.then(() => {
116                benchmarkAndReport('path_from_api_calls', setup, test, teardown).then(() => {
117                    done();
118                }).catch(reportError(done));
119            });
120        });
121
122        it('path_fromCmds', function(done) {
123            function setup(ctx) { }
124
125            function test(ctx) {
126                let p = PathKit.FromCmds(
127                    [[PathKit.MOVE_VERB, 205, 5],
128                    [PathKit.LINE_VERB, 795, 5],
129                    [PathKit.LINE_VERB, 595, 295],
130                    [PathKit.LINE_VERB, 5, 295],
131                    [PathKit.LINE_VERB, 205, 5],
132                    [PathKit.CLOSE_VERB]]);
133                p.delete();
134            }
135
136            function teardown(ctx) { }
137
138            LoadPathKit.then(() => {
139                benchmarkAndReport('path_fromCmds', setup, test, teardown).then(() => {
140                    done();
141                }).catch(reportError(done));
142            });
143        });
144
145        it('path_fromSVGString', function(done) {
146            function setup(ctx) {}
147
148            function test(ctx) {
149                // https://upload.wikimedia.org/wikipedia/commons/e/e7/Simple_parallelogram.svg
150                let p = PathKit.FromSVGString('M 205,5 L 795,5 L 595,295 L 5,295 L 205,5 z');
151                p.delete();
152            }
153
154            function teardown(ctx) { }
155
156            LoadPathKit.then(() => {
157                benchmarkAndReport('path_fromSVGString', setup, test, teardown).then(() => {
158                    done();
159                }).catch(reportError(done));
160            });
161        });
162    });
163
164    describe('export options', function() {
165        it('path_toCmds', function(done) {
166            function setup(ctx) {
167                ctx.path = drawPath();
168            }
169
170            function test(ctx) {
171                ctx.path.toCmds();
172            }
173
174            function teardown(ctx) {
175                ctx.path.delete();
176            }
177
178            LoadPathKit.then(() => {
179                benchmarkAndReport('path_toCmds', setup, test, teardown).then(() => {
180                    done();
181                }).catch(reportError(done));
182            });
183        });
184
185        it('path_toPath2D', function(done) {
186            function setup(ctx) {
187                ctx.path = drawPath();
188            }
189
190            function test(ctx) {
191                ctx.path.toPath2D();
192            }
193
194            function teardown(ctx) {
195                ctx.path.delete();
196            }
197
198            LoadPathKit.then(() => {
199                benchmarkAndReport('path_toPath2D', setup, test, teardown).then(() => {
200                    done();
201                }).catch(reportError(done));
202            });
203        });
204
205        it('path_toSVGString', function(done) {
206            function setup(ctx) {
207                ctx.path = drawPath();
208            }
209
210            function test(ctx) {
211                ctx.path.toSVGString();
212            }
213
214            function teardown(ctx) {
215                ctx.path.delete();
216            }
217
218            LoadPathKit.then(() => {
219                benchmarkAndReport('path_toSVGString', setup, test, teardown).then(() => {
220                    done();
221                }).catch(reportError(done));
222            });
223        });
224    });
225
226    describe('matrix options', function() {
227        function drawTriangle() {
228            let path = PathKit.NewPath();
229            path.moveTo(0, 0);
230            path.lineTo(10, 0);
231            path.lineTo(10, 10);
232            path.close();
233            return path;
234        }
235
236        it('path_add_path_svgmatrix', function(done) {
237            function setup(ctx) {
238                ctx.path = drawTriangle();
239            }
240
241            function test(ctx) {
242                let path = PathKit.NewPath();
243                let m = document.createElementNS('http://www.w3.org/2000/svg', 'svg').createSVGMatrix();
244                m.a = 1; m.b = 0;
245                m.c = 0; m.d = 1;
246                m.e = 0; m.f = 20.5;
247                path.addPath(ctx.path, m);
248                path.delete();
249            }
250
251            function teardown(ctx) {
252                ctx.path.delete();
253            }
254
255            LoadPathKit.then(() => {
256                benchmarkAndReport('path_add_path_svgmatrix', setup, test, teardown).then(() => {
257                    done();
258                }).catch(reportError(done));
259            });
260        });
261
262        it('path_add_path_svgmatrix_reuse', function(done) {
263            function setup(ctx) {
264                ctx.path = drawTriangle();
265                let m = document.createElementNS('http://www.w3.org/2000/svg', 'svg').createSVGMatrix();
266                ctx.matrix = m;
267            }
268
269            function test(ctx) {
270                let path = PathKit.NewPath();
271                let m = ctx.matrix
272                m.a = 1; m.b = 0;
273                m.c = 0; m.d = 1;
274                m.e = 0; m.f = 20.5;
275                path.addPath(ctx.path, m);
276                path.delete();
277            }
278
279            function teardown(ctx) {
280                ctx.path.delete();
281            }
282
283            LoadPathKit.then(() => {
284                benchmarkAndReport('path_add_path_svgmatrix_reuse', setup, test, teardown).then(() => {
285                    done();
286                }).catch(reportError(done));
287            });
288        });
289
290        it('path_add_path_svgmatrix_bare', function(done) {
291            function setup(ctx) {
292                ctx.path = drawTriangle();
293            }
294
295            function test(ctx) {
296                let path = PathKit.NewPath();
297                path.addPath(ctx.path, 1, 0, 0, 1, 0, 20.5);
298                path.delete();
299            }
300
301            function teardown(ctx) {
302                ctx.path.delete();
303            }
304
305            LoadPathKit.then(() => {
306                benchmarkAndReport('path_add_path_svgmatrix_bare', setup, test, teardown).then(() => {
307                    done();
308                }).catch(reportError(done));
309            });
310        });
311    });
312
313});