xref: /aosp_15_r20/external/skia/modules/pathkit/tests/svg.spec.js (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
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