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