// Copyright (c) 2016, 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 'package:test_descriptor/test_descriptor.dart' as d;

import 'package:test_core/src/util/exit_codes.dart' as exit_codes;
import 'package:test/test.dart';

import '../io.dart';

void main() {
  group('with the --name flag,', () {
    test('selects tests with matching names', () async {
      await d.file('test.dart', '''
        import 'package:test/test.dart';

        void main() {
          test("selected 1", () {});
          test("nope", () => throw TestFailure("oh no"));
          test("selected 2", () {});
        }
      ''').create();

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

    test('supports RegExp syntax', () async {
      await d.file('test.dart', '''
        import 'package:test/test.dart';

        void main() {
          test("test 1", () {});
          test("test 2", () => throw TestFailure("oh no"));
          test("test 3", () {});
        }
      ''').create();

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

    test('selects more narrowly when passed multiple times', () async {
      await d.file('test.dart', '''
        import 'package:test/test.dart';

        void main() {
          test("selected 1", () {});
          test("nope", () => throw TestFailure("oh no"));
          test("selected 2", () {});
        }
      ''').create();

      var test =
          await runTest(['--name', 'selected', '--name', '1', 'test.dart']);
      expect(test.stdout, emitsThrough(contains('+1: All tests passed!')));
      await test.shouldExit(0);
    });

    test('produces an error when no tests match', () async {
      await d.file('test.dart', '''
        import 'package:test/test.dart';

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

      var test = await runTest(['--name', 'no match', 'test.dart']);
      expect(
          test.stderr,
          emitsThrough(
              contains('No tests match regular expression "no match".')));
      await test.shouldExit(exit_codes.data);
    });

    test("doesn't filter out load exceptions", () async {
      var test = await runTest(['--name', 'name', 'file']);
      expect(
          test.stdout,
          containsInOrder([
            '-1: loading file [E]',
            '  Failed to load "file": Does not exist.'
          ]));
      await test.shouldExit(1);
    });
  });

  group('with the --plain-name flag,', () {
    test('selects tests with matching names', () async {
      await d.file('test.dart', '''
        import 'package:test/test.dart';

        void main() {
          test("selected 1", () {});
          test("nope", () => throw TestFailure("oh no"));
          test("selected 2", () {});
        }
      ''').create();

      var test = await runTest(['--plain-name', 'selected', 'test.dart']);
      expect(test.stdout, emitsThrough(contains('+2: All tests passed!')));
      await test.shouldExit(0);
    });

    test("doesn't support RegExp syntax", () async {
      await d.file('test.dart', '''
        import 'package:test/test.dart';

        void main() {
          test("test 1", () => throw TestFailure("oh no"));
          test("test 2", () => throw TestFailure("oh no"));
          test("test [12]", () {});
        }
      ''').create();

      var test = await runTest(['--plain-name', 'test [12]', 'test.dart']);
      expect(test.stdout, emitsThrough(contains('+1: All tests passed!')));
      await test.shouldExit(0);
    });

    test('selects more narrowly when passed multiple times', () async {
      await d.file('test.dart', '''
        import 'package:test/test.dart';

        void main() {
          test("selected 1", () {});
          test("nope", () => throw TestFailure("oh no"));
          test("selected 2", () {});
        }
      ''').create();

      var test = await runTest(
          ['--plain-name', 'selected', '--plain-name', '1', 'test.dart']);
      expect(test.stdout, emitsThrough(contains('+1: All tests passed!')));
      await test.shouldExit(0);
    });

    test('produces an error when no tests match', () async {
      await d.file('test.dart', '''
        import 'package:test/test.dart';

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

      var test = await runTest(['--plain-name', 'no match', 'test.dart']);
      expect(test.stderr, emitsThrough(contains('No tests match "no match".')));
      await test.shouldExit(exit_codes.data);
    });
  });

  test('--name and --plain-name together narrow the selection', () async {
    await d.file('test.dart', '''
      import 'package:test/test.dart';

      void main() {
        test("selected 1", () {});
        test("nope", () => throw TestFailure("oh no"));
        test("selected 2", () {});
      }
    ''').create();

    var test =
        await runTest(['--name', '.....', '--plain-name', 'e', 'test.dart']);
    expect(test.stdout, emitsThrough(contains('+2: All tests passed!')));
    await test.shouldExit(0);
  });
}
