<!DOCTYPE html>
<html>
<head>
    <script src="../resources/testharness.js"></script>
    <script src="../resources/testharnessreport.js"></script>
</head>
<body>
<script>
    promise_test(function() {

        return paintWorklet.import('resources/empty-worklet-script.js').then(function(undefined_arg) {
            assert_equals(undefined_arg, undefined, 'Promise should resolve with no arguments.');
        }).catch(function(error) {
            assert_unreached('unexpected rejection: ' + error);
        });

    }, 'Importing a script resolves the given promise.');

    promise_test(function() {

        return paintWorklet.import('resources/throwing-worklet-script.js').then(function(undefined_arg) {
            assert_equals(undefined_arg, undefined, 'Promise should resolve with no arguments.');
        }).catch(function(error) {
            assert_unreached('unexpected rejection: ' + error);
        });

    }, 'Importing a script which throws should still resolve the given promise.');

    promise_test(function() {

        return paintWorklet.import('non-existant-worklet-script.js').then(function() {
            assert_unreached('import should fail.');
        }).catch(function(error) {
            assert_equals(error.name, 'NetworkError', 'error should be a NetworkError.');
        });

    }, 'Importing a non-existant script rejects the given promise with a NetworkError.');

    promise_test(function() {

        return paintWorklet.import('http://invalid:123$').then(function() {
            assert_unreached('import should fail.');
        }).catch(function(error) {
            assert_equals(error.name, 'SyntaxError', 'error should be a SyntaxError.');
        });

    }, 'Attempting to resolve an invalid URL should reject the given promise with a SyntaxError.');

</script>
</body>
</html>
