171 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
			
		
		
	
	
			171 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
| describe('PathKit\'s Path Behavior', function() {
 | |
| 
 | |
|     describe('Basic Path Features', function() {
 | |
|         function drawSimplePath() {
 | |
|             let path = PathKit.NewPath();
 | |
|             path.moveTo(0, 0);
 | |
|             path.lineTo(10, 0);
 | |
|             path.lineTo(10, 10);
 | |
|             path.close();
 | |
|             return path;
 | |
|         }
 | |
| 
 | |
|         it('supports.equals()', function(done) {
 | |
|             LoadPathKit.then(catchException(done, () => {
 | |
|                 let path = drawSimplePath();
 | |
|                 let otherPath = drawSimplePath();
 | |
|                 let blank = PathKit.NewPath();
 | |
| 
 | |
|                 expect(path.equals(path)).toBe(true);
 | |
|                 expect(otherPath.equals(path)).toBe(true);
 | |
|                 expect(path.equals(otherPath)).toBe(true);
 | |
| 
 | |
|                 expect(path.equals(blank)).toBe(false);
 | |
|                 expect(otherPath.equals(blank)).toBe(false);
 | |
|                 expect(blank.equals(path)).toBe(false);
 | |
|                 expect(blank.equals(otherPath)).toBe(false);
 | |
| 
 | |
|                 path.delete();
 | |
|                 otherPath.delete();
 | |
|                 blank.delete();
 | |
|                 done();
 | |
|             }));
 | |
|         });
 | |
| 
 | |
|         it('has a copy constructor', function(done) {
 | |
|             LoadPathKit.then(catchException(done, () => {
 | |
|                 let orig = drawSimplePath();
 | |
|                 let copy = new PathKit.SkPath(orig);
 | |
| 
 | |
|                 expect(orig.toSVGString()).toEqual(copy.toSVGString());
 | |
|                 expect(orig.equals(copy)).toBe(true);
 | |
| 
 | |
|                 orig.delete();
 | |
|                 copy.delete();
 | |
|                 done();
 | |
|             }));
 | |
|         });
 | |
| 
 | |
|         it('has a copy method', function(done) {
 | |
|             LoadPathKit.then(catchException(done, () => {
 | |
|                 let orig = drawSimplePath();
 | |
|                 let copy = orig.copy();
 | |
| 
 | |
|                 expect(orig.toSVGString()).toEqual(copy.toSVGString());
 | |
|                 expect(orig.equals(copy)).toBe(true);
 | |
| 
 | |
|                 orig.delete();
 | |
|                 copy.delete();
 | |
|                 done();
 | |
|             }));
 | |
|         });
 | |
| 
 | |
|         it('can create a copy with MakePath', function(done) {
 | |
|             LoadPathKit.then(catchException(done, () => {
 | |
|                 let orig = drawSimplePath();
 | |
|                 let copy = PathKit.NewPath(orig);
 | |
| 
 | |
|                 expect(orig.toSVGString()).toEqual(copy.toSVGString());
 | |
|                 expect(orig.equals(copy)).toBe(true);
 | |
| 
 | |
|                 orig.delete();
 | |
|                 copy.delete();
 | |
|                 done();
 | |
|             }));
 | |
|         });
 | |
|     });
 | |
| 
 | |
|     function ExpectRectsToBeEqual(actual, expected) {
 | |
|         if (PathKit.usingWasm) {
 | |
|             // exact match
 | |
|             expect(actual).toEqual(expected);
 | |
|         } else {
 | |
|             // floats get rounded a little bit
 | |
|             expect(actual.fLeft).toBeCloseTo(expected.fLeft, 4);
 | |
|             expect(actual.fTop).toBeCloseTo(expected.fTop, 4);
 | |
|             expect(actual.fRight).toBeCloseTo(expected.fRight, 4);
 | |
|             expect(actual.fBottom).toBeCloseTo(expected.fBottom, 4);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     function bits2float(str) {
 | |
|         return PathKit.SkBits2FloatUnsigned(parseInt(str))
 | |
|     }
 | |
| 
 | |
|     describe('bounds and rect', function(){
 | |
|         it('dynamically updates getBounds()', function(done){
 | |
|             LoadPathKit.then(catchException(done, () => {
 | |
|                 // Based on test_bounds_crbug_513799
 | |
|                 let path = PathKit.NewPath();
 | |
|                 expect(path.getBounds()).toEqual(PathKit.LTRBRect(0, 0, 0, 0));
 | |
|                 path.moveTo(-5, -8);
 | |
|                 expect(path.getBounds()).toEqual(PathKit.LTRBRect(-5, -8, -5, -8));
 | |
|                 path.rect(1, 2, 2, 2);
 | |
|                 expect(path.getBounds()).toEqual(PathKit.LTRBRect(-5, -8, 3, 4));
 | |
|                 path.moveTo(1, 2);
 | |
|                 expect(path.getBounds()).toEqual(PathKit.LTRBRect(-5, -8, 3, 4));
 | |
|                 path.delete();
 | |
|                 done();
 | |
|             }));
 | |
|         });
 | |
| 
 | |
|         it('has getBounds() and computeTightBounds()', function(done){
 | |
|             LoadPathKit.then(catchException(done, () => {
 | |
|                 // Based on PathOpsTightBoundsIllBehaved
 | |
|                 let path = PathKit.NewPath();
 | |
|                 path.moveTo(1, 1);
 | |
|                 path.quadraticCurveTo(4, 3, 2, 2);
 | |
|                 expect(path.getBounds()).toEqual(PathKit.LTRBRect(1, 1, 4, 3));
 | |
|                 ExpectRectsToBeEqual(path.computeTightBounds(),
 | |
|                                      PathKit.LTRBRect(1, 1,
 | |
|                                         bits2float("0x40333334"),  // 2.8
 | |
|                                         bits2float("0x40155556"))); // 2.3333333
 | |
|                 path.delete();
 | |
| 
 | |
|                 done();
 | |
|             }));
 | |
|         });
 | |
|     });
 | |
| 
 | |
|     function ExpectCmdsToBeEqual(actual, expected) {
 | |
|         if (PathKit.usingWasm) {
 | |
|             // exact match
 | |
|             expect(actual).toEqual(expected);
 | |
|         } else {
 | |
|             // lossy match
 | |
|             actual.every((cmd, cmdIdx) => {
 | |
|                 cmd.every((arg, argIdx) => {
 | |
|                     // The asm.js code is close to the wasm/c++ output, but not quite.
 | |
|                     expect(arg).toBeCloseTo(expected[cmdIdx][argIdx], 4)
 | |
|                 });
 | |
|             });
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     describe('Command arrays', function(){
 | |
|         it('does NOT approximates conics when dumping as toCmds', function(done) {
 | |
|             LoadPathKit.then(catchException(done, () => {
 | |
|                 let path = PathKit.NewPath();
 | |
|                 path.moveTo(20, 120);
 | |
|                 path.arc(20, 120, 18, 0, 1.75 * Math.PI);
 | |
|                 path.lineTo(20, 120);
 | |
| 
 | |
|                 let expectedCmds = [
 | |
|                     [PathKit.MOVE_VERB, 20, 120],
 | |
|                     [PathKit.LINE_VERB, 38, 120],
 | |
|                     [PathKit.CONIC_VERB, 38, 138, 20, 138, bits2float("0x3f3504f3)")], // 0.707107f
 | |
|                     [PathKit.CONIC_VERB, 2, 138, 2, 120, bits2float("0x3f3504f3)")],   // 0.707107f
 | |
|                     [PathKit.CONIC_VERB, 2, 102, 20, 102, bits2float("0x3f3504f3)")],  // 0.707107f
 | |
|                     [PathKit.CONIC_VERB, bits2float("0x41dba58e"), 102, bits2float("0x4202e962"), bits2float("0x42d68b4d"), bits2float("0x3f6c8361")],  // 27.4558, 102, 32.7279, 107.272, 0.92388
 | |
|                     [PathKit.LINE_VERB, 20, 120],
 | |
|                 ];
 | |
|                 ExpectCmdsToBeEqual(path.toCmds(), expectedCmds);
 | |
| 
 | |
|                 path.delete();
 | |
|                 done();
 | |
|             }));
 | |
|         });
 | |
|     });
 | |
| 
 | |
| });
 |