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

import '../io.dart';

void main() {
  test('only runs the tests marked as solo', () async {
    await d.file('test.dart', '''
          import 'dart:async';

          import 'package:test/test.dart';

          void main() {
            test("passes", () {
              expect(true, isTrue);
            }, solo: true);
            test("failed", () {
              throw 'some error';
            });
          }
          ''').create();

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

  test('only runs groups marked as solo', () async {
    await d.file('test.dart', '''
          import 'dart:async';

          import 'package:test/test.dart';

          void main() {
            group('solo', () {
              test("first pass", () {
                expect(true, isTrue);
              });
              test("second pass", () {
                expect(true, isTrue);
              });
            }, solo: true);
            group('no solo', () {
              test("failure", () {
                throw 'some error';
              });
              test("another failure", () {
                throw 'some error';
              });
            });
          }
          ''').create();

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