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));
        }));
    });

});