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