// 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")

import 'dart:async';

import 'package:test_descriptor/test_descriptor.dart' as d;

import 'package:test/src/util/io.dart';
import 'package:test/test.dart';

import '../io.dart';

void main() {
  group("for suite", () {
    test("runs a test suite on a matching platform", () async {
      await _writeTestFile("vm_test.dart", suiteTestOn: "vm");

      var test = await runTest(["vm_test.dart"]);
      expect(test.stdout, emitsThrough(contains("All tests passed!")));
      await test.shouldExit(0);
    });

    test("doesn't run a test suite on a non-matching platform", () async {
      await _writeTestFile("vm_test.dart", suiteTestOn: "vm");

      var test = await runTest(["--platform", "content-shell", "vm_test.dart"]);
      expect(test.stdout, emitsThrough(contains("No tests ran.")));
      await test.shouldExit(0);
    }, tags: 'content-shell');

    test("runs a test suite on a matching operating system", () async {
      await _writeTestFile("os_test.dart", suiteTestOn: currentOS.identifier);

      var test = await runTest(["os_test.dart"]);
      expect(test.stdout, emitsThrough(contains("All tests passed!")));
      await test.shouldExit(0);
    });

    test("doesn't run a test suite on a non-matching operating system",
        () async {
      await _writeTestFile("os_test.dart",
          suiteTestOn: otherOS, loadable: false);

      var test = await runTest(["os_test.dart"]);
      expect(test.stdout, emitsThrough(contains("No tests ran.")));
      await test.shouldExit(0);
    });

    test("only loads matching files when loading as a group", () async {
      await _writeTestFile("vm_test.dart", suiteTestOn: "vm");
      await _writeTestFile("browser_test.dart",
          suiteTestOn: "browser", loadable: false);
      await _writeTestFile("this_os_test.dart",
          suiteTestOn: currentOS.identifier);
      await _writeTestFile("other_os_test.dart",
          suiteTestOn: otherOS, loadable: false);

      var test = await runTest(["."]);
      expect(test.stdout, emitsThrough(contains("+2: All tests passed!")));
      await test.shouldExit(0);
    });
  });

  group("for group", () {
    test("runs a VM group on the VM", () async {
      await _writeTestFile("vm_test.dart", groupTestOn: "vm");

      var test = await runTest(["vm_test.dart"]);
      expect(test.stdout, emitsThrough(contains("All tests passed!")));
      await test.shouldExit(0);
    });

    test("doesn't run a Browser group on the VM", () async {
      await _writeTestFile("browser_test.dart", groupTestOn: "browser");

      var test = await runTest(["browser_test.dart"]);
      expect(test.stdout, emitsThrough(contains("No tests ran.")));
      await test.shouldExit(0);
    });

    test("runs a browser group on a browser", () async {
      await _writeTestFile("browser_test.dart", groupTestOn: "browser");

      var test =
          await runTest(["--platform", "content-shell", "browser_test.dart"]);
      expect(test.stdout, emitsThrough(contains("All tests passed!")));
      await test.shouldExit(0);
    }, tags: 'content-shell');

    test("doesn't run a VM group on a browser", () async {
      await _writeTestFile("vm_test.dart", groupTestOn: "vm");

      var test = await runTest(["--platform", "content-shell", "vm_test.dart"]);
      expect(test.stdout, emitsThrough(contains("No tests ran.")));
      await test.shouldExit(0);
    }, tags: 'content-shell');
  });

  group("for test", () {
    test("runs a VM test on the VM", () async {
      await _writeTestFile("vm_test.dart", testTestOn: "vm");

      var test = await runTest(["vm_test.dart"]);
      expect(test.stdout, emitsThrough(contains("All tests passed!")));
      await test.shouldExit(0);
    });

    test("doesn't run a browser test on the VM", () async {
      await _writeTestFile("browser_test.dart", testTestOn: "browser");

      var test = await runTest(["browser_test.dart"]);
      expect(test.stdout, emitsThrough(contains("No tests ran.")));
      await test.shouldExit(0);
    });

    test("runs a browser test on a browser", () async {
      await _writeTestFile("browser_test.dart", testTestOn: "browser");

      var test =
          await runTest(["--platform", "content-shell", "browser_test.dart"]);
      expect(test.stdout, emitsThrough(contains("All tests passed!")));
      await test.shouldExit(0);
    }, tags: 'content-shell');

    test("doesn't run a VM test on a browser", () async {
      await _writeTestFile("vm_test.dart", testTestOn: "vm");

      var test = await runTest(["--platform", "content-shell", "vm_test.dart"]);
      expect(test.stdout, emitsThrough(contains("No tests ran.")));
      await test.shouldExit(0);
    }, tags: 'content-shell');
  });

  group("with suite, group, and test selectors", () {
    test("runs the test if all selectors match", () async {
      await _writeTestFile("vm_test.dart",
          suiteTestOn: "!browser", groupTestOn: "!js", testTestOn: "vm");

      var test = await runTest(["vm_test.dart"]);
      expect(test.stdout, emitsThrough(contains("All tests passed!")));
      await test.shouldExit(0);
    });

    test("doesn't runs the test if the suite doesn't match", () async {
      await _writeTestFile("vm_test.dart",
          suiteTestOn: "browser", groupTestOn: "!js", testTestOn: "vm");

      var test = await runTest(["vm_test.dart"]);
      expect(test.stdout, emitsThrough(contains("No tests ran.")));
      await test.shouldExit(0);
    });

    test("doesn't runs the test if the group doesn't match", () async {
      await _writeTestFile("vm_test.dart",
          suiteTestOn: "!browser", groupTestOn: "browser", testTestOn: "vm");

      var test = await runTest(["vm_test.dart"]);
      expect(test.stdout, emitsThrough(contains("No tests ran.")));
      await test.shouldExit(0);
    });

    test("doesn't runs the test if the test doesn't match", () async {
      await _writeTestFile("vm_test.dart",
          suiteTestOn: "!browser", groupTestOn: "!js", testTestOn: "browser");

      var test = await runTest(["vm_test.dart"]);
      expect(test.stdout, emitsThrough(contains("No tests ran.")));
      await test.shouldExit(0);
    });
  });
}

/// Writes a test file with some platform selectors to [filename].
///
/// Each of [suiteTestOn], [groupTestOn], and [testTestOn] is a platform
/// selector that's suite-, group-, and test-level respectively. If [loadable]
/// is `false`, the test file will be made unloadable on the Dart VM.
Future _writeTestFile(String filename,
    {String suiteTestOn,
    String groupTestOn,
    String testTestOn,
    bool loadable: true}) {
  var buffer = new StringBuffer();
  if (suiteTestOn != null) buffer.writeln("@TestOn('$suiteTestOn')");
  if (!loadable) buffer.writeln("import 'dart:html';");

  buffer
    ..writeln("import 'package:test/test.dart';")
    ..writeln("void main() {")
    ..writeln("  group('group', () {");

  if (testTestOn != null) {
    buffer.writeln("    test('test', () {}, testOn: '$testTestOn');");
  } else {
    buffer.writeln("    test('test', () {});");
  }

  if (groupTestOn != null) {
    buffer.writeln("  }, testOn: '$groupTestOn');");
  } else {
    buffer.writeln("  });");
  }

  buffer.writeln("}");

  return d.file(filename, buffer.toString()).create();
}
