blob: 35d8b252f721136df777293f75e29852f770028b [file] [log] [blame]
Kevin Lubick556350d2018-10-12 15:21:17 -04001
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 }).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});