1cb93a386Sopenharmony_cidescribe('PathKit\'s Path Behavior', function() { 2cb93a386Sopenharmony_ci 3cb93a386Sopenharmony_ci describe('Basic Path Features', function() { 4cb93a386Sopenharmony_ci function drawSimplePath() { 5cb93a386Sopenharmony_ci let path = PathKit.NewPath(); 6cb93a386Sopenharmony_ci path.moveTo(0, 0); 7cb93a386Sopenharmony_ci path.lineTo(10, 0); 8cb93a386Sopenharmony_ci path.lineTo(10, 10); 9cb93a386Sopenharmony_ci path.close(); 10cb93a386Sopenharmony_ci return path; 11cb93a386Sopenharmony_ci } 12cb93a386Sopenharmony_ci 13cb93a386Sopenharmony_ci it('supports.equals()', function(done) { 14cb93a386Sopenharmony_ci LoadPathKit.then(catchException(done, () => { 15cb93a386Sopenharmony_ci let path = drawSimplePath(); 16cb93a386Sopenharmony_ci let otherPath = drawSimplePath(); 17cb93a386Sopenharmony_ci let blank = PathKit.NewPath(); 18cb93a386Sopenharmony_ci 19cb93a386Sopenharmony_ci expect(path.equals(path)).toBe(true); 20cb93a386Sopenharmony_ci expect(otherPath.equals(path)).toBe(true); 21cb93a386Sopenharmony_ci expect(path.equals(otherPath)).toBe(true); 22cb93a386Sopenharmony_ci 23cb93a386Sopenharmony_ci expect(path.equals(blank)).toBe(false); 24cb93a386Sopenharmony_ci expect(otherPath.equals(blank)).toBe(false); 25cb93a386Sopenharmony_ci expect(blank.equals(path)).toBe(false); 26cb93a386Sopenharmony_ci expect(blank.equals(otherPath)).toBe(false); 27cb93a386Sopenharmony_ci 28cb93a386Sopenharmony_ci path.delete(); 29cb93a386Sopenharmony_ci otherPath.delete(); 30cb93a386Sopenharmony_ci blank.delete(); 31cb93a386Sopenharmony_ci done(); 32cb93a386Sopenharmony_ci })); 33cb93a386Sopenharmony_ci }); 34cb93a386Sopenharmony_ci 35cb93a386Sopenharmony_ci it('has a copy constructor', function(done) { 36cb93a386Sopenharmony_ci LoadPathKit.then(catchException(done, () => { 37cb93a386Sopenharmony_ci let orig = drawSimplePath(); 38cb93a386Sopenharmony_ci let copy = new PathKit.SkPath(orig); 39cb93a386Sopenharmony_ci 40cb93a386Sopenharmony_ci expect(orig.toSVGString()).toEqual(copy.toSVGString()); 41cb93a386Sopenharmony_ci expect(orig.equals(copy)).toBe(true); 42cb93a386Sopenharmony_ci 43cb93a386Sopenharmony_ci orig.delete(); 44cb93a386Sopenharmony_ci copy.delete(); 45cb93a386Sopenharmony_ci done(); 46cb93a386Sopenharmony_ci })); 47cb93a386Sopenharmony_ci }); 48cb93a386Sopenharmony_ci 49cb93a386Sopenharmony_ci it('has a copy method', function(done) { 50cb93a386Sopenharmony_ci LoadPathKit.then(catchException(done, () => { 51cb93a386Sopenharmony_ci let orig = drawSimplePath(); 52cb93a386Sopenharmony_ci let copy = orig.copy(); 53cb93a386Sopenharmony_ci 54cb93a386Sopenharmony_ci expect(orig.toSVGString()).toEqual(copy.toSVGString()); 55cb93a386Sopenharmony_ci expect(orig.equals(copy)).toBe(true); 56cb93a386Sopenharmony_ci 57cb93a386Sopenharmony_ci orig.delete(); 58cb93a386Sopenharmony_ci copy.delete(); 59cb93a386Sopenharmony_ci done(); 60cb93a386Sopenharmony_ci })); 61cb93a386Sopenharmony_ci }); 62cb93a386Sopenharmony_ci 63cb93a386Sopenharmony_ci it('can create a copy with MakePath', function(done) { 64cb93a386Sopenharmony_ci LoadPathKit.then(catchException(done, () => { 65cb93a386Sopenharmony_ci let orig = drawSimplePath(); 66cb93a386Sopenharmony_ci let copy = PathKit.NewPath(orig); 67cb93a386Sopenharmony_ci 68cb93a386Sopenharmony_ci expect(orig.toSVGString()).toEqual(copy.toSVGString()); 69cb93a386Sopenharmony_ci expect(orig.equals(copy)).toBe(true); 70cb93a386Sopenharmony_ci 71cb93a386Sopenharmony_ci orig.delete(); 72cb93a386Sopenharmony_ci copy.delete(); 73cb93a386Sopenharmony_ci done(); 74cb93a386Sopenharmony_ci })); 75cb93a386Sopenharmony_ci }); 76cb93a386Sopenharmony_ci }); 77cb93a386Sopenharmony_ci 78cb93a386Sopenharmony_ci function ExpectRectsToBeEqual(actual, expected) { 79cb93a386Sopenharmony_ci if (PathKit.usingWasm) { 80cb93a386Sopenharmony_ci // exact match 81cb93a386Sopenharmony_ci expect(actual).toEqual(expected); 82cb93a386Sopenharmony_ci } else { 83cb93a386Sopenharmony_ci // floats get rounded a little bit 84cb93a386Sopenharmony_ci expect(actual.fLeft).toBeCloseTo(expected.fLeft, 4); 85cb93a386Sopenharmony_ci expect(actual.fTop).toBeCloseTo(expected.fTop, 4); 86cb93a386Sopenharmony_ci expect(actual.fRight).toBeCloseTo(expected.fRight, 4); 87cb93a386Sopenharmony_ci expect(actual.fBottom).toBeCloseTo(expected.fBottom, 4); 88cb93a386Sopenharmony_ci } 89cb93a386Sopenharmony_ci } 90cb93a386Sopenharmony_ci 91cb93a386Sopenharmony_ci function bits2float(str) { 92cb93a386Sopenharmony_ci return PathKit.SkBits2FloatUnsigned(parseInt(str)) 93cb93a386Sopenharmony_ci } 94cb93a386Sopenharmony_ci 95cb93a386Sopenharmony_ci describe('bounds and rect', function(){ 96cb93a386Sopenharmony_ci it('dynamically updates getBounds()', function(done){ 97cb93a386Sopenharmony_ci LoadPathKit.then(catchException(done, () => { 98cb93a386Sopenharmony_ci // Based on test_bounds_crbug_513799 99cb93a386Sopenharmony_ci let path = PathKit.NewPath(); 100cb93a386Sopenharmony_ci expect(path.getBounds()).toEqual(PathKit.LTRBRect(0, 0, 0, 0)); 101cb93a386Sopenharmony_ci path.moveTo(-5, -8); 102cb93a386Sopenharmony_ci expect(path.getBounds()).toEqual(PathKit.LTRBRect(-5, -8, -5, -8)); 103cb93a386Sopenharmony_ci path.rect(1, 2, 2, 2); 104cb93a386Sopenharmony_ci expect(path.getBounds()).toEqual(PathKit.LTRBRect(-5, -8, 3, 4)); 105cb93a386Sopenharmony_ci path.moveTo(1, 2); 106cb93a386Sopenharmony_ci expect(path.getBounds()).toEqual(PathKit.LTRBRect(-5, -8, 3, 4)); 107cb93a386Sopenharmony_ci path.delete(); 108cb93a386Sopenharmony_ci done(); 109cb93a386Sopenharmony_ci })); 110cb93a386Sopenharmony_ci }); 111cb93a386Sopenharmony_ci 112cb93a386Sopenharmony_ci it('has getBounds() and computeTightBounds()', function(done){ 113cb93a386Sopenharmony_ci LoadPathKit.then(catchException(done, () => { 114cb93a386Sopenharmony_ci // Based on PathOpsTightBoundsIllBehaved 115cb93a386Sopenharmony_ci let path = PathKit.NewPath(); 116cb93a386Sopenharmony_ci path.moveTo(1, 1); 117cb93a386Sopenharmony_ci path.quadraticCurveTo(4, 3, 2, 2); 118cb93a386Sopenharmony_ci expect(path.getBounds()).toEqual(PathKit.LTRBRect(1, 1, 4, 3)); 119cb93a386Sopenharmony_ci ExpectRectsToBeEqual(path.computeTightBounds(), 120cb93a386Sopenharmony_ci PathKit.LTRBRect(1, 1, 121cb93a386Sopenharmony_ci bits2float("0x40333334"), // 2.8 122cb93a386Sopenharmony_ci bits2float("0x40155556"))); // 2.3333333 123cb93a386Sopenharmony_ci path.delete(); 124cb93a386Sopenharmony_ci 125cb93a386Sopenharmony_ci done(); 126cb93a386Sopenharmony_ci })); 127cb93a386Sopenharmony_ci }); 128cb93a386Sopenharmony_ci }); 129cb93a386Sopenharmony_ci 130cb93a386Sopenharmony_ci function ExpectCmdsToBeEqual(actual, expected) { 131cb93a386Sopenharmony_ci if (PathKit.usingWasm) { 132cb93a386Sopenharmony_ci // exact match 133cb93a386Sopenharmony_ci expect(actual).toEqual(expected); 134cb93a386Sopenharmony_ci } else { 135cb93a386Sopenharmony_ci // lossy match 136cb93a386Sopenharmony_ci actual.every((cmd, cmdIdx) => { 137cb93a386Sopenharmony_ci cmd.every((arg, argIdx) => { 138cb93a386Sopenharmony_ci // The asm.js code is close to the wasm/c++ output, but not quite. 139cb93a386Sopenharmony_ci expect(arg).toBeCloseTo(expected[cmdIdx][argIdx], 4) 140cb93a386Sopenharmony_ci }); 141cb93a386Sopenharmony_ci }); 142cb93a386Sopenharmony_ci } 143cb93a386Sopenharmony_ci } 144cb93a386Sopenharmony_ci 145cb93a386Sopenharmony_ci describe('Command arrays', function(){ 146cb93a386Sopenharmony_ci it('does NOT approximates conics when dumping as toCmds', function(done) { 147cb93a386Sopenharmony_ci LoadPathKit.then(catchException(done, () => { 148cb93a386Sopenharmony_ci let path = PathKit.NewPath(); 149cb93a386Sopenharmony_ci path.moveTo(20, 120); 150cb93a386Sopenharmony_ci path.arc(20, 120, 18, 0, 1.75 * Math.PI); 151cb93a386Sopenharmony_ci path.lineTo(20, 120); 152cb93a386Sopenharmony_ci 153cb93a386Sopenharmony_ci let expectedCmds = [ 154cb93a386Sopenharmony_ci [PathKit.MOVE_VERB, 20, 120], 155cb93a386Sopenharmony_ci [PathKit.LINE_VERB, 38, 120], 156cb93a386Sopenharmony_ci [PathKit.CONIC_VERB, 38, 138, 20, 138, bits2float("0x3f3504f3)")], // 0.707107f 157cb93a386Sopenharmony_ci [PathKit.CONIC_VERB, 2, 138, 2, 120, bits2float("0x3f3504f3)")], // 0.707107f 158cb93a386Sopenharmony_ci [PathKit.CONIC_VERB, 2, 102, 20, 102, bits2float("0x3f3504f3)")], // 0.707107f 159cb93a386Sopenharmony_ci [PathKit.CONIC_VERB, bits2float("0x41dba58e"), 102, bits2float("0x4202e962"), bits2float("0x42d68b4d"), bits2float("0x3f6c8361")], // 27.4558, 102, 32.7279, 107.272, 0.92388 160cb93a386Sopenharmony_ci [PathKit.LINE_VERB, 20, 120], 161cb93a386Sopenharmony_ci ]; 162cb93a386Sopenharmony_ci ExpectCmdsToBeEqual(path.toCmds(), expectedCmds); 163cb93a386Sopenharmony_ci 164cb93a386Sopenharmony_ci path.delete(); 165cb93a386Sopenharmony_ci done(); 166cb93a386Sopenharmony_ci })); 167cb93a386Sopenharmony_ci }); 168cb93a386Sopenharmony_ci }); 169cb93a386Sopenharmony_ci 170cb93a386Sopenharmony_ci}); 171