jasmine.DEFAULT_TIMEOUT_INTERVAL = 20000;
describe('PathKit\'s SVG Behavior', function() {
    // Note, don't try to print the PathKit object - it can cause Karma/Jasmine to lock up.
    var PathKit = null;
    const LoadPathKit = new Promise(function(resolve, reject) {
        if (PathKit) {
            resolve();
        } else {
            PathKitInit({
                locateFile: (file) => '/pathkit/'+file,
            }).ready().then((_PathKit) => {
                PathKit = _PathKit;
                resolve();
            });
        }
    });

    it('can create a path from an SVG string', function(done) {
        LoadPathKit.then(catchException(done, () => {
            //.This is a parallelagram from
            // https://upload.wikimedia.org/wikipedia/commons/e/e7/Simple_parallelogram.svg
            let path = PathKit.FromSVGString('M 205,5 L 795,5 L 595,295 L 5,295 L 205,5 z');

            let cmds = path.toCmds();
            expect(cmds).toBeTruthy();
            // 1 move, 4 lines, 1 close
            // each element in cmds is an array, with index 0 being the verb, and the rest being args
            expect(cmds.length).toBe(6);
            expect(cmds).toEqual([[PathKit.MOVE_VERB, 205, 5],
                                  [PathKit.LINE_VERB, 795, 5],
                                  [PathKit.LINE_VERB, 595, 295],
                                  [PathKit.LINE_VERB, 5, 295],
                                  [PathKit.LINE_VERB, 205, 5],
                                  [PathKit.CLOSE_VERB]]);
            path.delete();
            done();
        }));
    });

    it('can create an SVG string from a path', function(done) {
        LoadPathKit.then(catchException(done, () => {
            let cmds = [[PathKit.MOVE_VERB, 205, 5],
                       [PathKit.LINE_VERB, 795, 5],
                       [PathKit.LINE_VERB, 595, 295],
                       [PathKit.LINE_VERB, 5, 295],
                       [PathKit.LINE_VERB, 205, 5],
                       [PathKit.CLOSE_VERB]];
            let path = PathKit.FromCmds(cmds);

            let svgStr = path.toSVGString();
            // We output it in terse form, which is different than Wikipedia's version
            expect(svgStr).toEqual('M205 5L795 5L595 295L5 295L205 5Z');
            path.delete();
            done();
        }));
    });

    it('can create an SVG string from hex values', function(done) {
        LoadPathKit.then(catchException(done, () => {
            let cmds = [[PathKit.MOVE_VERB, "0x15e80300", "0x400004dc"], // 9.37088e-26f, 2.0003f
                       [PathKit.LINE_VERB, 795, 5],
                       [PathKit.LINE_VERB, 595, 295],
                       [PathKit.LINE_VERB, 5, 295],
                       [PathKit.LINE_VERB, "0x15e80300", "0x400004dc"], // 9.37088e-26f, 2.0003f
                       [PathKit.CLOSE_VERB]];
            let path = PathKit.FromCmds(cmds);

            let svgStr = path.toSVGString();
            expect(svgStr).toEqual('M9.37088e-26 2.0003L795 5L595 295L5 295L9.37088e-26 2.0003Z');
            path.delete();
            done();
        }));
    });

    it('should have input and the output be the same', function(done) {
        LoadPathKit.then(catchException(done, () => {
            let testCases = [
                'M0 0L1075 0L1075 242L0 242L0 0Z'
            ];

            for(let svg of testCases) {
                let path = PathKit.FromSVGString(svg);
                let output = path.toSVGString();

                expect(svg).toEqual(output);

                path.delete();
            }
            done();
        }));
    });

    it('approximates arcs (conics) with quads', function(done) {
        LoadPathKit.then(catchException(done, () => {
            let path = PathKit.NewPath();
            path.moveTo(50, 120);
            path.arc(50, 120, 45, 0, 1.75 * Math.PI);
            path.lineTo(50, 120);
            let svgStr = path.toSVGString();
            // Q stands for quad.  No need to check the whole path, as that's more
            // what the gold correctness tests are for (can account for changes we make
            // to the approximation algorithms).
            expect(svgStr).toContain('Q');
            path.delete();

             reportSVGString(svgStr, 'conics_quads_approx').then(() => {
                done();
            }).catch(reportError(done));
        }));
    });

});
