// Copyright (c) 2015, 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.

@TestOn("vm")
@Tags(const ["content-shell"])
import 'package:scheduled_test/descriptor.dart' as d;
import 'package:scheduled_test/scheduled_stream.dart';
import 'package:scheduled_test/scheduled_test.dart';
import 'package:test/src/runner/browser/content_shell.dart';

import '../../io.dart';
import '../../utils.dart';
import 'code_server.dart';

void main() {
  useSandbox();

  test("starts content shell with the given URL", () {
    var server = new CodeServer();

    schedule(() async {
      var contentShell = new ContentShell(await server.url);
      currentSchedule.onComplete
          .schedule(() async => (await contentShell).close());
    });

    server.handleDart('''
var webSocket = new WebSocket(
    window.location.href.replaceFirst("http://", "ws://"));
await webSocket.onOpen.first;
webSocket.send("loaded!");
''');

    var webSocket = server.handleWebSocket();

    schedule(() async {
      expect(await (await webSocket).stream.first, equals("loaded!"));
    });
  }, skip: "Failing with mysterious WebSocket issues.");

  test("a process can be killed synchronously after it's started", () async {
    var server = new CodeServer();

    schedule(() async {
      var contentShell = new ContentShell(await server.url);
      await contentShell.close();
    });
  });

  test("reports an error in onExit", () {
    var contentShell =
        new ContentShell("http://dart-lang.org", executable: "_does_not_exist");
    expect(
        contentShell.onExit,
        throwsA(isApplicationException(
            startsWith("Failed to run Content Shell: $noSuchFileMessage"))));
  });

  test("can run successful tests", () {
    d
        .file(
            "test.dart",
            """
import 'package:test/test.dart';

void main() {
  test("success", () {});
}
""")
        .create();

    var test = runTest(["-p", "content-shell", "test.dart"]);
    test.stdout.expect(consumeThrough(contains("+1: All tests passed!")));
    test.shouldExit(0);
  });

  test("can run failing tests", () {
    d
        .file(
            "test.dart",
            """
import 'package:test/test.dart';

void main() {
  test("failure", () => throw new TestFailure("oh no"));
}
""")
        .create();

    var test = runTest(["-p", "content-shell", "test.dart"]);
    test.stdout.expect(consumeThrough(contains("-1: Some tests failed.")));
    test.shouldExit(1);
  });
}
