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