// 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.
//
// @dart=2.7

@TestOn('vm')

import 'dart:async';

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

import 'package:test_core/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', 'chrome', 'vm_test.dart']);
      expect(test.stdout, emitsThrough(contains('No tests ran.')));
      await test.shouldExit(1);
    }, tags: 'chrome');

    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(1);
    });

    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(1);
    });

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

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

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

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

  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(1);
    });

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

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

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

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

  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(1);
    });

    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(1);
    });

    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(1);
    });
  });
}

/// 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 = 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();
}
