describe('Canvas 2D emulation', () => {
    let container;

    beforeEach(async () => {
        await LoadCanvasKit;
        container = document.createElement('div');
        container.innerHTML = `
            <canvas width=600 height=600 id=test></canvas>
            <canvas width=600 height=600 id=report></canvas>`;
        document.body.appendChild(container);
    });

    afterEach(() => {
        document.body.removeChild(container);
    });

    const expectColorCloseTo = (a, b) => {
        expect(a.length).toEqual(4);
        expect(b.length).toEqual(4);
        for (let i=0; i<4; i++) {
            expect(a[i]).toBeCloseTo(b[i], 3);
        }
    }

    describe('color strings', () => {
        const hex = (s) => {
            return parseInt(s, 16);
        }

        it('parses hex color strings', () => {
            const parseColor = CanvasKit.parseColorString;
            expectColorCloseTo(parseColor('#FED'),
                CanvasKit.Color(hex('FF'), hex('EE'), hex('DD'), 1));
            expectColorCloseTo(parseColor('#FEDC'),
                CanvasKit.Color(hex('FF'), hex('EE'), hex('DD'), hex('CC')/255));
            expectColorCloseTo(parseColor('#fed'),
                CanvasKit.Color(hex('FF'), hex('EE'), hex('DD'), 1));
            expectColorCloseTo(parseColor('#fedc'),
                CanvasKit.Color(hex('FF'), hex('EE'), hex('DD'), hex('CC')/255));
        });
        it('parses rgba color strings', () => {
            const parseColor = CanvasKit.parseColorString;
            expectColorCloseTo(parseColor('rgba(117, 33, 64, 0.75)'),
                CanvasKit.Color(117, 33, 64, 0.75));
            expectColorCloseTo(parseColor('rgb(117, 33, 64, 0.75)'),
                CanvasKit.Color(117, 33, 64, 0.75));
            expectColorCloseTo(parseColor('rgba(117,33,64)'),
                CanvasKit.Color(117, 33, 64, 1.0));
            expectColorCloseTo(parseColor('rgb(117,33, 64)'),
                CanvasKit.Color(117, 33, 64, 1.0));
            expectColorCloseTo(parseColor('rgb(117,33, 64, 32%)'),
                CanvasKit.Color(117, 33, 64, 0.32));
            expectColorCloseTo(parseColor('rgb(117,33, 64, 0.001)'),
                CanvasKit.Color(117, 33, 64, 0.001));
            expectColorCloseTo(parseColor('rgb(117,33,64,0)'),
                CanvasKit.Color(117, 33, 64, 0.0));
        });
        it('parses named color strings', () => {
            // Keep this one as the _testing version, because we don't include the large
            // color map by default.
            const parseColor = CanvasKit._testing.parseColor;
            expectColorCloseTo(parseColor('grey'),
                CanvasKit.Color(128, 128, 128, 1.0));
            expectColorCloseTo(parseColor('blanchedalmond'),
                CanvasKit.Color(255, 235, 205, 1.0));
            expectColorCloseTo(parseColor('transparent'),
                CanvasKit.Color(0, 0, 0, 0));
        });

        it('properly produces color strings', () => {
            const colorToString = CanvasKit._testing.colorToString;

            expect(colorToString(CanvasKit.Color(102, 51, 153, 1.0))).toEqual('#663399');

            expect(colorToString(CanvasKit.Color(255, 235, 205, 0.5))).toEqual(
                                           'rgba(255, 235, 205, 0.50000000)');
        });

        it('can multiply colors by alpha', () => {
            const multiplyByAlpha = CanvasKit.multiplyByAlpha;

            const testCases = [
                   {
                    inColor:  CanvasKit.Color(102, 51, 153, 1.0),
                    inAlpha:  1.0,
                    outColor: CanvasKit.Color(102, 51, 153, 1.0),
                },
                {
                    inColor:  CanvasKit.Color(102, 51, 153, 1.0),
                    inAlpha:  0.8,
                    outColor: CanvasKit.Color(102, 51, 153, 0.8),
                },
                {
                    inColor:  CanvasKit.Color(102, 51, 153, 0.8),
                    inAlpha:  0.7,
                    outColor: CanvasKit.Color(102, 51, 153, 0.56),
                },
                {
                    inColor:  CanvasKit.Color(102, 51, 153, 0.8),
                    inAlpha:  1000,
                    outColor: CanvasKit.Color(102, 51, 153, 1.0),
                },
            ];

            for (const tc of testCases) {
                // Print out the test case if the two don't match.
                expect(multiplyByAlpha(tc.inColor, tc.inAlpha))
                      .toEqual(tc.outColor, JSON.stringify(tc));
            }
        });
    }); // end describe('color string parsing')

    describe('fonts', () => {
        it('can parse font sizes', () => {
            const parseFontString = CanvasKit._testing.parseFontString;

            const tests = [{
                    'input': '10px monospace',
                    'output': {
                        'style': '',
                        'variant': '',
                        'weight': '',
                        'sizePx': 10,
                        'family': 'monospace',
                    }
                },
                {
                    'input': '15pt Arial',
                    'output': {
                        'style': '',
                        'variant': '',
                        'weight': '',
                        'sizePx': 20,
                        'family': 'Arial',
                    }
                },
                {
                    'input': '1.5in Arial, san-serif ',
                    'output': {
                        'style': '',
                        'variant': '',
                        'weight': '',
                        'sizePx': 144,
                        'family': 'Arial, san-serif',
                    }
                },
                {
                    'input': '1.5em SuperFont',
                    'output': {
                        'style': '',
                        'variant': '',
                        'weight': '',
                        'sizePx': 24,
                        'family': 'SuperFont',
                    }
                },
            ];

            for (let i = 0; i < tests.length; i++) {
                expect(parseFontString(tests[i].input)).toEqual(tests[i].output);
            }
        });

        it('can parse font attributes', () => {
            const parseFontString = CanvasKit._testing.parseFontString;

            const tests = [{
                    'input': 'bold 10px monospace',
                    'output': {
                        'style': '',
                        'variant': '',
                        'weight': 'bold',
                        'sizePx': 10,
                        'family': 'monospace',
                    }
                },
                {
                    'input': 'italic bold 10px monospace',
                    'output': {
                        'style': 'italic',
                        'variant': '',
                        'weight': 'bold',
                        'sizePx': 10,
                        'family': 'monospace',
                    }
                },
                {
                    'input': 'italic small-caps bold 10px monospace',
                    'output': {
                        'style': 'italic',
                        'variant': 'small-caps',
                        'weight': 'bold',
                        'sizePx': 10,
                        'family': 'monospace',
                    }
                },
                {
                    'input': 'small-caps bold 10px monospace',
                    'output': {
                        'style': '',
                        'variant': 'small-caps',
                        'weight': 'bold',
                        'sizePx': 10,
                        'family': 'monospace',
                    }
                },
                {
                    'input': 'italic 10px monospace',
                    'output': {
                        'style': 'italic',
                        'variant': '',
                        'weight': '',
                        'sizePx': 10,
                        'family': 'monospace',
                    }
                },
                {
                    'input': 'small-caps 10px monospace',
                    'output': {
                        'style': '',
                        'variant': 'small-caps',
                        'weight': '',
                        'sizePx': 10,
                        'family': 'monospace',
                    }
                },
                {
                    'input': 'normal bold 10px monospace',
                    'output': {
                        'style': 'normal',
                        'variant': '',
                        'weight': 'bold',
                        'sizePx': 10,
                        'family': 'monospace',
                    }
                },
            ];

            for (let i = 0; i < tests.length; i++) {
                expect(parseFontString(tests[i].input)).toEqual(tests[i].output);
            }
        });
    });

    const multipleCanvasTest = (testname, done, test) => {
        const skcanvas = CanvasKit.MakeCanvas(CANVAS_WIDTH, CANVAS_HEIGHT);
        skcanvas._config = 'software_canvas';
        const realCanvas = document.getElementById('test');
        realCanvas._config = 'html_canvas';
        realCanvas.width = CANVAS_WIDTH;
        realCanvas.height = CANVAS_HEIGHT;

        if (!done) {
            console.log('debugging canvaskit');
            test(realCanvas);
            test(skcanvas);
            const png = skcanvas.toDataURL();
            const img = document.createElement('img');
            document.body.appendChild(img);
            img.src = png;
            debugger;
            return;
        }

        let promises = [];

        for (let canvas of [skcanvas, realCanvas]) {
            test(canvas);
            // canvas has .toDataURL (even though skcanvas is not a real Canvas)
            // so this will work.
            promises.push(reportCanvas(canvas, testname, canvas._config));
        }
        Promise.all(promises).then(() => {
            skcanvas.dispose();
            done();
        }).catch(reportError(done));
    }

    describe('CanvasContext2D API', () => {
        multipleCanvasGM('all_line_drawing_operations', (canvas) => {
            const ctx = canvas.getContext('2d');
            ctx.scale(3.0, 3.0);
            ctx.moveTo(20, 5);
            ctx.lineTo(30, 20);
            ctx.lineTo(40, 10);
            ctx.lineTo(50, 20);
            ctx.lineTo(60, 0);
            ctx.lineTo(20, 5);

            ctx.moveTo(20, 80);
            ctx.bezierCurveTo(90, 10, 160, 150, 190, 10);

            ctx.moveTo(36, 148);
            ctx.quadraticCurveTo(66, 188, 120, 136);
            ctx.lineTo(36, 148);

            ctx.rect(5, 170, 20, 25);

            ctx.moveTo(150, 180);
            ctx.arcTo(150, 100, 50, 200, 20);
            ctx.lineTo(160, 160);

            ctx.moveTo(20, 120);
            ctx.arc(20, 120, 18, 0, 1.75 * Math.PI);
            ctx.lineTo(20, 120);

            ctx.moveTo(150, 5);
            ctx.ellipse(130, 25, 30, 10, -1*Math.PI/8, Math.PI/6, 1.5*Math.PI)

            ctx.lineWidth = 2;
            ctx.stroke();

            // Test edgecases and draw direction
            ctx.beginPath();
            ctx.arc(50, 100, 10, Math.PI, -Math.PI/2);
            ctx.stroke();
            ctx.beginPath();
            ctx.arc(75, 100, 10, Math.PI, -Math.PI/2, true);
            ctx.stroke();
            ctx.beginPath();
            ctx.arc(100, 100, 10, Math.PI, 100.1 * Math.PI, true);
            ctx.stroke();
            ctx.beginPath();
            ctx.arc(125, 100, 10, Math.PI, 100.1 * Math.PI, false);
            ctx.stroke();
            ctx.beginPath();
            ctx.ellipse(155, 100, 10, 15, Math.PI/8, 100.1 * Math.PI, Math.PI, true);
            ctx.stroke();
            ctx.beginPath();
            ctx.ellipse(180, 100, 10, 15, Math.PI/8, Math.PI, 100.1 * Math.PI, true);
            ctx.stroke();
        });

        multipleCanvasGM('all_matrix_operations', (canvas) => {
            const ctx = canvas.getContext('2d');
            ctx.rect(10, 10, 20, 20);

            ctx.scale(2.0, 4.0);
            ctx.rect(30, 10, 20, 20);
            ctx.resetTransform();

            ctx.rotate(Math.PI / 3);
            ctx.rect(50, 10, 20, 20);
            ctx.resetTransform();

            ctx.translate(30, -2);
            ctx.rect(70, 10, 20, 20);
            ctx.resetTransform();

            ctx.translate(60, 0);
            ctx.rotate(Math.PI / 6);
            ctx.transform(1.5, 0, 0, 0.5, 0, 0); // effectively scale
            ctx.rect(90, 10, 20, 20);
            ctx.resetTransform();

            ctx.save();
            ctx.setTransform(2, 0, -.5, 2.5, -40, 120);
            ctx.rect(110, 10, 20, 20);
            ctx.lineTo(110, 0);
            ctx.restore();
            ctx.lineTo(220, 120);

            ctx.scale(3.0, 3.0);
            ctx.font = '6pt Noto Mono';
            ctx.fillText('This text should be huge', 10, 80);
            ctx.resetTransform();

            ctx.strokeStyle = 'black';
            ctx.lineWidth = 2;
            ctx.stroke();

            ctx.beginPath();
            ctx.moveTo(250, 30);
            ctx.lineTo(250, 80);
            ctx.scale(3.0, 3.0);
            ctx.lineTo(280/3, 90/3);
            ctx.closePath();
            ctx.strokeStyle = 'black';
            ctx.lineWidth = 5;
            ctx.stroke();
        });

        multipleCanvasGM('shadows_and_save_restore', (canvas) => {
            const ctx = canvas.getContext('2d');
            ctx.strokeStyle = '#000';
            ctx.fillStyle = '#CCC';
            ctx.shadowColor = 'rebeccapurple';
            ctx.shadowBlur = 1;
            ctx.shadowOffsetX = 3;
            ctx.shadowOffsetY = -8;
            ctx.rect(10, 10, 30, 30);

            ctx.save();
            ctx.strokeStyle = '#C00';
            ctx.fillStyle = '#00C';
            ctx.shadowBlur = 0;
            ctx.shadowColor = 'transparent';

            ctx.stroke();

            ctx.restore();
            ctx.fill();

            ctx.beginPath();
            ctx.moveTo(36, 148);
            ctx.quadraticCurveTo(66, 188, 120, 136);
            ctx.closePath();
            ctx.stroke();

            ctx.beginPath();
            ctx.shadowColor = '#993366AA';
            ctx.shadowOffsetX = 8;
            ctx.shadowBlur = 5;
            ctx.setTransform(2, 0, -.5, 2.5, -40, 120);
            ctx.rect(110, 10, 20, 20);
            ctx.lineTo(110, 0);
            ctx.resetTransform();
            ctx.lineTo(220, 120);
            ctx.stroke();

            ctx.fillStyle = 'green';
            ctx.font = '16pt Noto Mono';
            ctx.fillText('This should be shadowed', 20, 80);

            ctx.beginPath();
            ctx.lineWidth = 6;
            ctx.ellipse(10, 290, 30, 30, 0, 0, Math.PI * 2);
            ctx.scale(2, 1);
            ctx.moveTo(10, 290)
            ctx.ellipse(10, 290, 30, 60, 0, 0, Math.PI * 2);
            ctx.resetTransform();
            ctx.shadowColor = '#993366AA';
            ctx.scale(3, 1);
            ctx.moveTo(10, 290)
            ctx.ellipse(10, 290, 30, 90, 0, 0, Math.PI * 2);
            ctx.stroke();
        });

        multipleCanvasGM('global_dashed_rects', (canvas) => {
            const ctx = canvas.getContext('2d');
            ctx.scale(1.1, 1.1);
            ctx.translate(10, 10);
            // Shouldn't impact the fillRect calls
            ctx.setLineDash([5, 3]);

            ctx.fillStyle = 'rgba(200, 0, 100, 0.81)';
            ctx.fillRect(20, 30, 100, 100);

            ctx.globalAlpha = 0.81;
            ctx.fillStyle = 'rgba(200, 0, 100, 1.0)';
            ctx.fillRect(120, 30, 100, 100);
            // This shouldn't do anything
            ctx.globalAlpha = 0.1;

            ctx.fillStyle = 'rgba(200, 0, 100, 0.9)';
            ctx.globalAlpha = 0.9;
            // Intentional no-op to check ordering
            ctx.clearRect(220, 30, 100, 100);
            ctx.fillRect(220, 30, 100, 100);

            ctx.fillRect(320, 30, 100, 100);
            ctx.clearRect(330, 40, 80, 80);

            ctx.strokeStyle = 'blue';
            ctx.lineWidth = 3;
            ctx.setLineDash([5, 3]);
            ctx.strokeRect(20, 150, 100, 100);
            ctx.setLineDash([50, 30]);
            ctx.strokeRect(125, 150, 100, 100);
            ctx.lineDashOffset = 25;
            ctx.strokeRect(230, 150, 100, 100);
            ctx.setLineDash([2, 5, 9]);
            ctx.strokeRect(335, 150, 100, 100);

            ctx.setLineDash([5, 2]);
            ctx.moveTo(336, 400);
            ctx.quadraticCurveTo(366, 488, 120, 450);
            ctx.lineTo(300, 400);
            ctx.stroke();

            ctx.font = '36pt Noto Mono';
            ctx.strokeText('Dashed', 20, 350);
            ctx.fillText('Not Dashed', 20, 400);
        });

        multipleCanvasGM('gradients_clip', (canvas) => {
            const ctx = canvas.getContext('2d');

            const rgradient = ctx.createRadialGradient(200, 300, 10, 100, 100, 300);

            rgradient.addColorStop(0, 'red');
            rgradient.addColorStop(.7, 'white');
            rgradient.addColorStop(1, 'blue');

            ctx.fillStyle = rgradient;
            ctx.globalAlpha = 0.7;
            ctx.fillRect(0,0,600,600);
            ctx.globalAlpha = 0.95;

            ctx.beginPath();
            ctx.arc(300, 100, 90, 0, Math.PI*1.66);
            ctx.closePath();
            ctx.strokeStyle = 'yellow';
            ctx.lineWidth = 5;
            ctx.stroke();
            ctx.save();
            ctx.clip();

            const lgradient = ctx.createLinearGradient(200, 20, 420, 40);

            lgradient.addColorStop(0, 'green');
            lgradient.addColorStop(.5, 'cyan');
            lgradient.addColorStop(1, 'orange');

            ctx.fillStyle = lgradient;

            ctx.fillRect(200, 30, 200, 300);

            ctx.restore();
            ctx.fillRect(550, 550, 40, 40);
        });

        multipleCanvasGM('get_put_imagedata', (canvas) => {
            const ctx = canvas.getContext('2d');
            // Make a gradient so we see if the pixels copying worked
            const grad = ctx.createLinearGradient(0, 0, CANVAS_WIDTH, CANVAS_HEIGHT);
            grad.addColorStop(0, 'yellow');
            grad.addColorStop(1, 'red');
            ctx.fillStyle = grad;
            ctx.fillRect(0, 0, CANVAS_WIDTH, CANVAS_HEIGHT);

            const iData = ctx.getImageData(400, 100, 200, 150);
            expect(iData.width).toBe(200);
            expect(iData.height).toBe(150);
            expect(iData.data.byteLength).toBe(200*150*4);
            ctx.putImageData(iData, 10, 10);
            ctx.putImageData(iData, 350, 350, 100, 75, 45, 40);
            ctx.strokeRect(350, 350, 200, 150);

            const box = ctx.createImageData(20, 40);
            ctx.putImageData(box, 10, 300);
            const biggerBox = ctx.createImageData(iData);
            ctx.putImageData(biggerBox, 10, 350);
            expect(biggerBox.width).toBe(iData.width);
            expect(biggerBox.height).toBe(iData.height);
        });

        multipleCanvasGM('shadows_with_rotate_skbug_9947', (canvas) => {
            const ctx = canvas.getContext('2d');
            const angle = 240;
            ctx.fillStyle = 'white';
            ctx.fillRect(0, 0, CANVAS_WIDTH, CANVAS_HEIGHT);
            ctx.save();
            ctx.translate(80, 80);
            ctx.rotate((angle * Math.PI) / 180);
            ctx.shadowOffsetX = 10;
            ctx.shadowOffsetY = 10;
            ctx.shadowColor = 'rgba(100,100,100,0.5)';
            ctx.shadowBlur = 1;
            ctx.fillStyle = 'black';
            ctx.strokeStyle = 'red';
            ctx.beginPath();
            ctx.rect(-20, -20, 40, 40);
            ctx.fill();
            ctx.fillRect(30, 30, 40, 40);
            ctx.strokeRect(30, -20, 40, 40);
            ctx.fillText('text', -20, -30);
            ctx.restore();
        });

        describe('using images', () => {
            let skImageData = null;
            let htmlImage = null;
            const skPromise = fetch('/assets/mandrill_512.png')
                .then((response) => response.arrayBuffer())
                .then((buffer) => {
                    skImageData = buffer;

                });
            const realPromise = fetch('/assets/mandrill_512.png')
                .then((response) => response.blob())
                .then((blob) => createImageBitmap(blob))
                .then((bitmap) => {
                    htmlImage = bitmap;
                });

            beforeEach(async () => {
                await skPromise;
                await realPromise;
            });

            multipleCanvasGM('draw_patterns', (canvas) => {
                const ctx = canvas.getContext('2d');
                let img = htmlImage;
                if (canvas._config === 'software_canvas') {
                    img = canvas.decodeImage(skImageData);
                }
                ctx.fillStyle = '#EEE';
                ctx.fillRect(0, 0, CANVAS_WIDTH, CANVAS_HEIGHT);
                ctx.lineWidth = 20;
                ctx.scale(0.2, 0.4);

                let pattern = ctx.createPattern(img, 'repeat');
                ctx.fillStyle = pattern;
                ctx.fillRect(0, 0, 1500, 750);

                pattern = ctx.createPattern(img, 'repeat-x');
                ctx.fillStyle = pattern;
                ctx.fillRect(1500, 0, 3000, 750);

                ctx.globalAlpha = 0.7
                pattern = ctx.createPattern(img, 'repeat-y');
                ctx.fillStyle = pattern;
                ctx.fillRect(0, 750, 1500, 1500);
                ctx.strokeRect(0, 750, 1500, 1500);

                pattern = ctx.createPattern(img, 'no-repeat');
                ctx.fillStyle = pattern;
                pattern.setTransform({a: 1, b: -.1, c:.1, d: 0.5, e: 1800, f:800});
                ctx.fillRect(0, 0, 3000, 1500);
            });

            multipleCanvasGM('draw_image', (canvas) => {
                let ctx = canvas.getContext('2d');
                let img = htmlImage;
                if (canvas._config === 'software_canvas') {
                    img = canvas.decodeImage(skImageData);
                }
                ctx.drawImage(img, 30, -200);

                ctx.globalAlpha = 0.7
                ctx.rotate(.1);
                ctx.imageSmoothingQuality = 'medium';
                ctx.drawImage(img, 200, 350, 150, 100);
                ctx.rotate(-.2);
                ctx.imageSmoothingEnabled = false;
                ctx.drawImage(img, 100, 150, 400, 350, 10, 400, 150, 100);
            });
        }); // end describe('using images')

        {
            const drawPoint = (ctx, x, y, color) => {
                ctx.fillStyle = color;
                ctx.fillRect(x, y, 1, 1);
            }
            const IN = 'purple';
            const OUT = 'orange';
            const SCALE = 8;

            // Check to see if these points are in or out on each of the
            // test configurations.
            const pts = [[3, 3], [4, 4], [5, 5], [10, 10], [8, 10], [6, 10],
                         [6.5, 9], [15, 10], [17, 10], [17, 11], [24, 24],
                         [25, 25], [26, 26], [27, 27]];
            const tests = [
                {
                    xOffset: 0,
                    yOffset: 0,
                    fillType: 'nonzero',
                    strokeWidth: 0,
                    testFn: (ctx, x, y) => ctx.isPointInPath(x * SCALE, y * SCALE, 'nonzero'),
                },
                {
                    xOffset: 30,
                    yOffset: 0,
                    fillType: 'evenodd',
                    strokeWidth: 0,
                    testFn: (ctx, x, y) => ctx.isPointInPath(x * SCALE, y * SCALE, 'evenodd'),
                },
                {
                    xOffset: 0,
                    yOffset: 30,
                    fillType: null,
                    strokeWidth: 1,
                    testFn: (ctx, x, y) => ctx.isPointInStroke(x * SCALE, y * SCALE),
                },
                {
                    xOffset: 30,
                    yOffset: 30,
                    fillType: null,
                    strokeWidth: 2,
                    testFn: (ctx, x, y) => ctx.isPointInStroke(x * SCALE, y * SCALE),
                },
            ];
            multipleCanvasGM('points_in_path_stroke', (canvas) => {
                const ctx = canvas.getContext('2d');
                ctx.font = '20px Noto Mono';
                // Draw some visual aids
                ctx.fillText('path-nonzero', 60, 30);
                ctx.fillText('path-evenodd', 300, 30);
                ctx.fillText('stroke-1px-wide', 60, 260);
                ctx.fillText('stroke-2px-wide', 300, 260);
                ctx.fillText('purple is IN, orange is OUT', 20, 560);

                // Scale up to make single pixels easier to see
                ctx.scale(SCALE, SCALE);
                for (const test of tests) {
                    ctx.beginPath();
                    const xOffset = test.xOffset;
                    const yOffset = test.yOffset;

                    ctx.fillStyle = '#AAA';
                    ctx.lineWidth = test.strokeWidth;
                    ctx.rect(5+xOffset, 5+yOffset, 20, 20);
                    ctx.arc(15+xOffset, 15+yOffset, 8, 0, Math.PI*2, false);
                    if (test.fillType) {
                        ctx.fill(test.fillType);
                    } else {
                        ctx.stroke();
                    }

                    for (const pt of pts) {
                        let [x, y] = pt;
                        x += xOffset;
                        y += yOffset;
                        // naively apply transform when querying because the points queried
                        // ignore the CTM.
                        if (test.testFn(ctx, x, y)) {
                          drawPoint(ctx, x, y, IN);
                        } else {
                          drawPoint(ctx, x, y, OUT);
                        }
                    }
                }
            });
        }

        describe('loading custom fonts', () => {
            const realFontLoaded = new FontFace('BungeeNonSystem', 'url(/assets/Bungee-Regular.ttf)', {
                'family': 'BungeeNonSystem', //Make sure the canvas does not use the system font
                'style': 'normal',
                'weight': '400',
            }).load().then((font) => {
                document.fonts.add(font);
            });

            let fontBuffer = null;
            const skFontLoaded = fetch('/assets/Bungee-Regular.ttf').then(
                (response) => response.arrayBuffer()).then(
                (buffer) => {
                    fontBuffer = buffer;
                });

            beforeEach(async () => {
                await realFontLoaded;
                await skFontLoaded;
            });

            multipleCanvasGM('custom_font', (canvas) => {
                if (canvas.loadFont) {
                    canvas.loadFont(fontBuffer, {
                        'family': 'BungeeNonSystem',
                        'style': 'normal',
                        'weight': '400',
                    });
                }
                const ctx = canvas.getContext('2d');

                ctx.font = '20px monospace';
                ctx.fillText('20 px monospace', 10, 30);

                ctx.font = '2.0em BungeeNonSystem';
                ctx.fillText('2.0em Bungee filled', 10, 80);
                ctx.strokeText('2.0em Bungee stroked', 10, 130);

                ctx.font = '40pt monospace';
                ctx.strokeText('40pt monospace', 10, 200);

                // bold wasn't defined, so should fallback to just the 400 weight
                ctx.font = 'bold 45px BungeeNonSystem';
                ctx.fillText('45px Bungee filled', 10, 260);
            });
        }); // describe('loading custom fonts')

        it('can read default properties', () => {
            const skcanvas = CanvasKit.MakeCanvas(CANVAS_WIDTH, CANVAS_HEIGHT);
            const realCanvas = document.getElementById('test');
            realCanvas.width = CANVAS_WIDTH;
            realCanvas.height = CANVAS_HEIGHT;

            const skcontext = skcanvas.getContext('2d');
            const realContext = realCanvas.getContext('2d');
            // The skia canvas only comes with a monospace font by default
            // Set the html canvas to be monospace too.
            realContext.font = '10px monospace';

            const toTest = ['font', 'lineWidth', 'strokeStyle', 'lineCap',
                            'lineJoin', 'miterLimit', 'shadowOffsetY',
                            'shadowBlur', 'shadowColor', 'shadowOffsetX',
                            'globalAlpha', 'globalCompositeOperation',
                            'lineDashOffset', 'imageSmoothingEnabled',
                            'imageFilterQuality'];

            // Compare all the default values of the properties of skcanvas
            // to the default values on the properties of a real canvas.
            for(let attr of toTest) {
                expect(skcontext[attr]).toBe(realContext[attr], attr);
            }

            skcanvas.dispose();
        });
    }); // end describe('CanvasContext2D API')

    describe('Path2D API', () => {
        multipleCanvasGM('path2d_line_drawing_operations', (canvas) => {
            const ctx = canvas.getContext('2d');
            let clock;
            let path;
            if (canvas.makePath2D) {
                clock = canvas.makePath2D('M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm.5-13H11v6l5.25 3.15.75-1.23-4.5-2.67z');
                path = canvas.makePath2D();
            } else {
                clock = new Path2D('M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm.5-13H11v6l5.25 3.15.75-1.23-4.5-2.67z')
                path = new Path2D();
            }
            path.moveTo(20, 5);
            path.lineTo(30, 20);
            path.lineTo(40, 10);
            path.lineTo(50, 20);
            path.lineTo(60, 0);
            path.lineTo(20, 5);

            path.moveTo(20, 80);
            path.bezierCurveTo(90, 10, 160, 150, 190, 10);

            path.moveTo(36, 148);
            path.quadraticCurveTo(66, 188, 120, 136);
            path.lineTo(36, 148);

            path.rect(5, 170, 20, 25);

            path.moveTo(150, 180);
            path.arcTo(150, 100, 50, 200, 20);
            path.lineTo(160, 160);

            path.moveTo(20, 120);
            path.arc(20, 120, 18, 0, 1.75 * Math.PI);
            path.lineTo(20, 120);

            path.moveTo(150, 5);
            path.ellipse(130, 25, 30, 10, -1*Math.PI/8, Math.PI/6, 1.5*Math.PI)

            ctx.lineWidth = 2;
            ctx.scale(3.0, 3.0);
            ctx.stroke(path);
            ctx.stroke(clock);
        });
    }); // end describe('Path2D API')
});
