1*c8dee2aaSAndroid Build Coastguard Workerdescribe('PathKit\'s SVG Behavior', function() { 2*c8dee2aaSAndroid Build Coastguard Worker it('can create a path from an SVG string', function(done) { 3*c8dee2aaSAndroid Build Coastguard Worker LoadPathKit.then(catchException(done, () => { 4*c8dee2aaSAndroid Build Coastguard Worker //.This is a parallelagram from 5*c8dee2aaSAndroid Build Coastguard Worker // https://upload.wikimedia.org/wikipedia/commons/e/e7/Simple_parallelogram.svg 6*c8dee2aaSAndroid Build Coastguard Worker let path = PathKit.FromSVGString('M 205,5 L 795,5 L 595,295 L 5,295 L 205,5 z'); 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker let cmds = path.toCmds(); 9*c8dee2aaSAndroid Build Coastguard Worker expect(cmds).toBeTruthy(); 10*c8dee2aaSAndroid Build Coastguard Worker // 1 move, 4 lines, 1 close 11*c8dee2aaSAndroid Build Coastguard Worker // each element in cmds is an array, with index 0 being the verb, and the rest being args 12*c8dee2aaSAndroid Build Coastguard Worker expect(cmds.length).toBe(6); 13*c8dee2aaSAndroid Build Coastguard Worker expect(cmds).toEqual([[PathKit.MOVE_VERB, 205, 5], 14*c8dee2aaSAndroid Build Coastguard Worker [PathKit.LINE_VERB, 795, 5], 15*c8dee2aaSAndroid Build Coastguard Worker [PathKit.LINE_VERB, 595, 295], 16*c8dee2aaSAndroid Build Coastguard Worker [PathKit.LINE_VERB, 5, 295], 17*c8dee2aaSAndroid Build Coastguard Worker [PathKit.LINE_VERB, 205, 5], 18*c8dee2aaSAndroid Build Coastguard Worker [PathKit.CLOSE_VERB]]); 19*c8dee2aaSAndroid Build Coastguard Worker path.delete(); 20*c8dee2aaSAndroid Build Coastguard Worker done(); 21*c8dee2aaSAndroid Build Coastguard Worker })); 22*c8dee2aaSAndroid Build Coastguard Worker }); 23*c8dee2aaSAndroid Build Coastguard Worker 24*c8dee2aaSAndroid Build Coastguard Worker it('can create an SVG string from a path', function(done) { 25*c8dee2aaSAndroid Build Coastguard Worker LoadPathKit.then(catchException(done, () => { 26*c8dee2aaSAndroid Build Coastguard Worker let cmds = [[PathKit.MOVE_VERB, 205, 5], 27*c8dee2aaSAndroid Build Coastguard Worker [PathKit.LINE_VERB, 795, 5], 28*c8dee2aaSAndroid Build Coastguard Worker [PathKit.LINE_VERB, 595, 295], 29*c8dee2aaSAndroid Build Coastguard Worker [PathKit.LINE_VERB, 5, 295], 30*c8dee2aaSAndroid Build Coastguard Worker [PathKit.LINE_VERB, 205, 5], 31*c8dee2aaSAndroid Build Coastguard Worker [PathKit.CLOSE_VERB]]; 32*c8dee2aaSAndroid Build Coastguard Worker let path = PathKit.FromCmds(cmds); 33*c8dee2aaSAndroid Build Coastguard Worker 34*c8dee2aaSAndroid Build Coastguard Worker let svgStr = path.toSVGString(); 35*c8dee2aaSAndroid Build Coastguard Worker // We output it in terse form, which is different than Wikipedia's version 36*c8dee2aaSAndroid Build Coastguard Worker expect(svgStr).toEqual('M205 5L795 5L595 295L5 295L205 5Z'); 37*c8dee2aaSAndroid Build Coastguard Worker path.delete(); 38*c8dee2aaSAndroid Build Coastguard Worker done(); 39*c8dee2aaSAndroid Build Coastguard Worker })); 40*c8dee2aaSAndroid Build Coastguard Worker }); 41*c8dee2aaSAndroid Build Coastguard Worker 42*c8dee2aaSAndroid Build Coastguard Worker it('can create an SVG string from hex values', function(done) { 43*c8dee2aaSAndroid Build Coastguard Worker LoadPathKit.then(catchException(done, () => { 44*c8dee2aaSAndroid Build Coastguard Worker let cmds = [[PathKit.MOVE_VERB, "0x15e80300", "0x400004dc"], // 9.37088e-26f, 2.0003f 45*c8dee2aaSAndroid Build Coastguard Worker [PathKit.LINE_VERB, 795, 5], 46*c8dee2aaSAndroid Build Coastguard Worker [PathKit.LINE_VERB, 595, 295], 47*c8dee2aaSAndroid Build Coastguard Worker [PathKit.LINE_VERB, 5, 295], 48*c8dee2aaSAndroid Build Coastguard Worker [PathKit.LINE_VERB, "0x15e80300", "0x400004dc"], // 9.37088e-26f, 2.0003f 49*c8dee2aaSAndroid Build Coastguard Worker [PathKit.CLOSE_VERB]]; 50*c8dee2aaSAndroid Build Coastguard Worker let path = PathKit.FromCmds(cmds); 51*c8dee2aaSAndroid Build Coastguard Worker 52*c8dee2aaSAndroid Build Coastguard Worker let svgStr = path.toSVGString(); 53*c8dee2aaSAndroid Build Coastguard Worker expect(svgStr).toEqual('M9.3708787e-26 2.0002966L795 5L595 295L5 295L9.3708787e-26 2.0002966Z'); 54*c8dee2aaSAndroid Build Coastguard Worker path.delete(); 55*c8dee2aaSAndroid Build Coastguard Worker done(); 56*c8dee2aaSAndroid Build Coastguard Worker })); 57*c8dee2aaSAndroid Build Coastguard Worker }); 58*c8dee2aaSAndroid Build Coastguard Worker 59*c8dee2aaSAndroid Build Coastguard Worker it('should have input and the output be the same', function(done) { 60*c8dee2aaSAndroid Build Coastguard Worker LoadPathKit.then(catchException(done, () => { 61*c8dee2aaSAndroid Build Coastguard Worker let testCases = [ 62*c8dee2aaSAndroid Build Coastguard Worker 'M0 0L1075 0L1075 242L0 242L0 0Z' 63*c8dee2aaSAndroid Build Coastguard Worker ]; 64*c8dee2aaSAndroid Build Coastguard Worker 65*c8dee2aaSAndroid Build Coastguard Worker for(let svg of testCases) { 66*c8dee2aaSAndroid Build Coastguard Worker let path = PathKit.FromSVGString(svg); 67*c8dee2aaSAndroid Build Coastguard Worker let output = path.toSVGString(); 68*c8dee2aaSAndroid Build Coastguard Worker 69*c8dee2aaSAndroid Build Coastguard Worker expect(svg).toEqual(output); 70*c8dee2aaSAndroid Build Coastguard Worker 71*c8dee2aaSAndroid Build Coastguard Worker path.delete(); 72*c8dee2aaSAndroid Build Coastguard Worker } 73*c8dee2aaSAndroid Build Coastguard Worker done(); 74*c8dee2aaSAndroid Build Coastguard Worker })); 75*c8dee2aaSAndroid Build Coastguard Worker }); 76*c8dee2aaSAndroid Build Coastguard Worker 77*c8dee2aaSAndroid Build Coastguard Worker it('approximates arcs (conics) with quads', function(done) { 78*c8dee2aaSAndroid Build Coastguard Worker LoadPathKit.then(catchException(done, () => { 79*c8dee2aaSAndroid Build Coastguard Worker let path = PathKit.NewPath(); 80*c8dee2aaSAndroid Build Coastguard Worker path.moveTo(50, 120); 81*c8dee2aaSAndroid Build Coastguard Worker path.arc(50, 120, 45, 0, 1.75 * Math.PI); 82*c8dee2aaSAndroid Build Coastguard Worker path.lineTo(50, 120); 83*c8dee2aaSAndroid Build Coastguard Worker let svgStr = path.toSVGString(); 84*c8dee2aaSAndroid Build Coastguard Worker // Q stands for quad. No need to check the whole path, as that's more 85*c8dee2aaSAndroid Build Coastguard Worker // what the gold correctness tests are for (can account for changes we make 86*c8dee2aaSAndroid Build Coastguard Worker // to the approximation algorithms). 87*c8dee2aaSAndroid Build Coastguard Worker expect(svgStr).toContain('Q'); 88*c8dee2aaSAndroid Build Coastguard Worker path.delete(); 89*c8dee2aaSAndroid Build Coastguard Worker 90*c8dee2aaSAndroid Build Coastguard Worker reportSVGString(svgStr, 'conics_quads_approx').then(() => { 91*c8dee2aaSAndroid Build Coastguard Worker done(); 92*c8dee2aaSAndroid Build Coastguard Worker }).catch(reportError(done)); 93*c8dee2aaSAndroid Build Coastguard Worker })); 94*c8dee2aaSAndroid Build Coastguard Worker }); 95*c8dee2aaSAndroid Build Coastguard Worker 96*c8dee2aaSAndroid Build Coastguard Worker}); 97