

describe('PathKit\'s Pathops', 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,
            }).then((_PathKit) => {
                PathKit = _PathKit;
                resolve();
            });
        }
    });

    // see https://fiddle.skia.org/c/@discrete_path
    function drawStar(X=128, Y=128, R=116) {
        let p = PathKit.NewPath();
        p.moveTo(X + R, Y);
        for (let i = 1; i < 8; i++) {
          let a = 2.6927937 * i;
          p.lineTo(X + R * Math.cos(a), Y + R * Math.sin(a));
        }
        p.closePath();
        return p;
    }

    it('pathops_simplify', function(done) {
        function setup(ctx) {
            ctx.path = drawStar();
        }

        function test(ctx) {
            let path = ctx.path.copy().simplify();
            path.delete();
        }

        function teardown(ctx) {
            ctx.path.delete();
        }

        LoadPathKit.then(() => {
            benchmarkAndReport('pathops_simplify', setup, test, teardown).then(() => {
                done();
            }).catch(reportError(done));
        });
    });

    it('pathops_diff', function(done) {
        function setup(ctx) {
            // Values chosen abitrarily to have some overlap and some not.
            ctx.path1 = drawStar(X=120, Y=120);
            ctx.path2 = drawStar(X=140, Y=145);
        }

        function test(ctx) {
            let path = PathKit.MakeFromOp(ctx.path1, ctx.path2, PathKit.PathOp.DIFFERENCE);
            path.delete();
        }

        function teardown(ctx) {
            ctx.path1.delete();
            ctx.path2.delete();
        }

        LoadPathKit.then(() => {
            benchmarkAndReport('pathops_diff', setup, test, teardown).then(() => {
                done();
            }).catch(reportError(done));
        });
    });

    it('pathops_intersect', function(done) {
        function setup(ctx) {
            // Values chosen abitrarily to have some overlap and some not.
            ctx.path1 = drawStar(X=120, Y=120);
            ctx.path2 = drawStar(X=140, Y=145);
        }

        function test(ctx) {
            let path = PathKit.MakeFromOp(ctx.path1, ctx.path2, PathKit.PathOp.INTERSECT);
            path.delete();
        }

        function teardown(ctx) {
            ctx.path1.delete();
            ctx.path2.delete();
        }

        LoadPathKit.then(() => {
            benchmarkAndReport('pathops_intersect', setup, test, teardown).then(() => {
                done();
            }).catch(reportError(done));
        });
    });

    it('pathops_union', function(done) {
        function setup(ctx) {
            // Values chosen abitrarily to have some overlap and some not.
            ctx.path1 = drawStar(X=120, Y=120);
            ctx.path2 = drawStar(X=140, Y=145);
        }

        function test(ctx) {
            let path = PathKit.MakeFromOp(ctx.path1, ctx.path2, PathKit.PathOp.UNION);
            path.delete();
        }

        function teardown(ctx) {
            ctx.path1.delete();
            ctx.path2.delete();
        }

        LoadPathKit.then(() => {
            benchmarkAndReport('pathops_union', setup, test, teardown).then(() => {
                done();
            }).catch(reportError(done));
        });
    });

    it('pathops_xor', function(done) {
        function setup(ctx) {
            // Values chosen abitrarily to have some overlap and some not.
            ctx.path1 = drawStar(X=120, Y=120);
            ctx.path2 = drawStar(X=140, Y=145);
        }

        function test(ctx) {
            let path = PathKit.MakeFromOp(ctx.path1, ctx.path2, PathKit.PathOp.XOR);
            path.delete();
        }

        function teardown(ctx) {
            ctx.path1.delete();
            ctx.path2.delete();
        }

        LoadPathKit.then(() => {
            benchmarkAndReport('pathops_xor', setup, test, teardown).then(() => {
                done();
            }).catch(reportError(done));
        });
    });

    it('pathops_reverse_diff', function(done) {
        function setup(ctx) {
            // Values chosen abitrarily to have some overlap and some not.
            ctx.path1 = drawStar(X=120, Y=120);
            ctx.path2 = drawStar(X=140, Y=145);
        }

        function test(ctx) {
            let path = PathKit.MakeFromOp(ctx.path1, ctx.path2, PathKit.PathOp.REVERSE_DIFFERENCE);
            path.delete();
        }

        function teardown(ctx) {
            ctx.path1.delete();
            ctx.path2.delete();
        }

        LoadPathKit.then(() => {
            benchmarkAndReport('pathops_reverse_diff', setup, test, teardown).then(() => {
                done();
            }).catch(reportError(done));
        });
    });

});