// 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 '../../pkg/unittest/lib/unittest.dart';
import '../../pkg/unittest/lib/html_individual_config.dart';
import 'dart:html';

main() {
  useHtmlIndividualConfiguration();

  group('supported', () {
    test('supported', () {
      expect(Worker.supported, isTrue);
    });
  });

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

  group('functional', () {

    test('unsupported', () {
      var expectation = Worker.supported ? returnsNormally : throws;

      expect(() {
        new Worker('worker.js');
      }, expectation);
    });

    if (!Worker.supported) {
      return;
    }

    test('works', () {
      // Use Blob to make a local URL so we don't have to have a separate file.
      var blob = new Blob([workerScript], 'text/javascript');
      var url = Url.createObjectUrl(blob);
      var worker = new Worker(url);
      var test = expectAsync1((e) {
        expect(e.data, 'WorkerMessage');
      });
      worker.onMessage.first.then(test);
    });
  });
}

