<!DOCTYPE html>
<!--
  Copyright 2022 The Cobalt Authors. All Rights Reserved.

  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->
<!--
  Note: This is a very basic test of the existing minimal Web Worker
  functionality. This can be expanded as more functionality is implemented,
  but probably will be superseded by Web Platform Tests.
-->
<head>
    <title>Cobalt Web Worker Test</title>
    <script src='black_box_js_test_utils.js'></script>
</head>

<body>
<script>
    var window_error_event_count = 0;
    window.onerror = function (message) {
        window_error_event_count += 1;
        assertIncludes('TypeError: self.Foo is not a function', message);
        console.log('window got onerror', message);
    };

    var message_event_count = 0;
    console.log('running');

    // This is expected trigger a an error event on window.
    var worker_with_error = new Worker('web_worker_test_with_syntax_error.js',
        { name : 'worker_with_error'});

    var worker = new Worker('web_worker_test.js', { name : 'test_worker'});
    console.log(worker);
    worker.onmessage = function (event) {
        message_event_count += 1;
        console.log('window got message', message_event_count, 'from worker:', event.data);
        switch (message_event_count) {
            case 1:
                assertEqual('web worker test loaded', event.data);
                break;
            case 2:
                // The first script is expected to execute even though the next
                // one has a syntax error.
                assertEqual('Imported Script 1', event.data);
                break;
            case 3:
                assertEqual('Imported Script Before Syntax Error', event.data);
                break;
            case 4:
                assertEqual('Expected exception message 4: SyntaxError', event.data);
                break;
            case 5:
                assertEqual('Expected exception message 5: SyntaxError', event.data);
                worker.postMessage('import scripts now');
                worker.postMessage('just some data');
                worker.postMessage('a special message');
                break;
            case 6:
                // Scripts loaded with importScripts are guaranteed to execute
                // in order.
                assertEqual('Imported Script 1', event.data);
                break;
            case 7:
                assertEqual('Imported Script 2', event.data);
                break;
            case 8:
                assertEqual('Imported Script 3', event.data);
                break;
            case 9:
                assertEqual('worker received import scripts now', event.data);
                break;
            case 10:
                assertEqual('IMPORT SCRIPTS NOW', event.data);
                break;
            case 11:
                assertEqual('worker received just some data', event.data);
                break;
            case 12:
                assertEqual('JUST SOME DATA', event.data);
                break;
            case 13:
                assertEqual('worker received a special message', event.data);
                break;
            case 14:
                assertEqual('A SPECIAL MESSAGE', event.data);
                worker.terminate();
                window.setTimeout(
                    () => {
                        assertEqual(14, message_event_count);
                        assertEqual(1, window_error_event_count);
                        onEndTest();
                    }, 250);
                break;
        }
    };
    worker.onerror = function (event) {
        console.log('window got onerror');
        notReached();
    };
    console.log('end');
</script>
</body>
