<!DOCTYPE html>
<html>
<head>
<script>
function runner(tests) {
    if (window.testRunner) {
        testRunner.waitUntilDone();
        testRunner.dumpAsText();
    }

    tests.reduce(function(chain, obj) {
        return chain.then(function() {
            if (obj.expectedError) {
                console.log('The worklet should throw an error with: "' + obj.expectedError + '"');
            } else if (obj.expectedMessage) {
                console.log('The worklet should log a warning with: "' + obj.expectedMessage + '"');
            } else {
                console.log('The worklet should not throw an error.');
            }
            var blob = new Blob([obj.script], {type: 'text/javascript'});
            return paintWorklet.import(URL.createObjectURL(blob));
        });
    }, Promise.resolve()).then(function() {
        if (window.testRunner) {
            testRunner.notifyDone();
        }
    });
}

function runTest() {
    runner([{
        expectedError: "A class with name:'foo' is already registered.",
        script: "registerPaint('foo', class { paint() { } }); registerPaint('foo', class { paint() { } });",
    }, {
        expectedError: "The empty string is not a valid name.",
        script: "registerPaint('', class { });",
    }, {
        expectedError: "failed!",
        script: "registerPaint('foo3', class { static get inputProperties() { throw Error('failed!'); } });",
    }, {
        expectedError: "The value provided is neither an array, nor does it have indexed properties.",
        script: "registerPaint('foo4', class { static get inputProperties() { return 42; } });",
    }, {
        expectedError: "The 'prototype' object on the class does not exist.",
        script: "var a = function() { }; a.prototype = undefined; registerPaint('foo5', a);",
    }, {
        expectedError: "The 'prototype' property on the class is not an object.",
        script: "var b = function() { }; b.prototype = 42; registerPaint('foo6', b);",
    }, {
        expectedError: "The 'paint' function on the prototype does not exist.",
        script: "registerPaint('foo7', class { });",
    }, {
        expectedError: "The 'paint' property on the prototype is not a function.",
        script: "registerPaint('foo8', class { get paint() { return 42; } });",
    }, {
        script: "registerPaint('foo9', class { paint() { } }); console.log('Success for \\'foo9\\'.');",
    }, {
        script: "var c = function() { }; c.prototype.paint = function() { }; registerPaint('foo10', c); console.log('Success for \\'foo10\\'.');",
    }, {
        script: "registerPaint('foo11', class { static get inputProperties() { return ['-webkit-border-radius']; } paint() { } }); console.log('Success for \\'foo11\\'.');"
    }, {
        expectedError: "The 'alpha' property on the class is not a boolean.",
        script: "registerPaint('foo12', class { static get alpha() { return 42; } });",
    }, {
        script: "registerPaint('foo13', class { static get alpha() { return true; } paint() { } }); console.log('Success for \\'foo13\\'.');",
    }]);
}
</script>
</head>
<body onload="runTest()">
<p>This tests a series of PaintWorkletGlobalScope#registerPaint calls.</p>
<p>See the devtools console for test output.</p>
</body>
</html>
