// 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:async_helper/async_minitest.dart';
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);
  });
}
