// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

library worker_test;

import 'package:expect/legacy/async_minitest.dart'; // ignore: deprecated_member_use
import 'dart:html';

main() {
  var workerScript = '''postMessage('WorkerMessage');''';

  test('unsupported', () {
    if (!Worker.supported) {
      expect(() => new Worker('worker.js'), throws);
    } else {
      new Worker('worker.js').onError.first.then(
        expectAsync((e) {
          // This event is expected, "worker.js" doesn't exist.  But the event
          // *sometimes* propagates to window.onerror in Firefox which causes
          // this test to fail, so let's stop any further propagation:
          e.preventDefault();
          e.stopImmediatePropagation();
        }),
      );
    }
  });

  if (!Worker.supported) return;

  test('works', () {
    // Use Blob to make a local URL so we don't have to have a separate file.
    // This does not work on browsers using CSP (Content Security Policy).
    var blob = new Blob([workerScript], 'text/javascript');
    var url = Url.createObjectUrl(blob);
    var worker = new Worker(url);
    var test = expectAsync((e) {
      expect(e.data, 'WorkerMessage');
    });
    worker.onMessage.first.then(test);
  });
}
