// 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/test.dart';

import '../io.dart';

void main() {
  group('a skipped expect', () {
    test('marks the test as skipped', () async {
      await d.file('test.dart', '''
        import 'package:test/test.dart';

        void main() {
          test("skipped", () => expect(1, equals(2), skip: true));
        }
      ''').create();

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

    test('prints the skip reason if there is one', () async {
      await d.file('test.dart', '''
        import 'package:test/test.dart';

        void main() {
          test("skipped", () => expect(1, equals(2),
              reason: "1 is 2", skip: "is failing"));
        }
      ''').create();

      var test = await runTest(['test.dart']);
      expect(
          test.stdout,
          containsInOrder([
            '+0: skipped',
            '  Skip expect: is failing',
            '~1: All tests skipped.'
          ]));
      await test.shouldExit(0);
    });

    test("prints the expect reason if there's no skip reason", () async {
      await d.file('test.dart', '''
        import 'package:test/test.dart';

        void main() {
          test("skipped", () => expect(1, equals(2),
              reason: "1 is 2", skip: true));
        }
      ''').create();

      var test = await runTest(['test.dart']);
      expect(
          test.stdout,
          containsInOrder([
            '+0: skipped',
            '  Skip expect (1 is 2).',
            '~1: All tests skipped.'
          ]));
      await test.shouldExit(0);
    });

    test('prints the matcher description if there are no reasons', () async {
      await d.file('test.dart', '''
        import 'package:test/test.dart';

        void main() {
          test("skipped", () => expect(1, equals(2), skip: true));
        }
      ''').create();

      var test = await runTest(['test.dart']);
      expect(
          test.stdout,
          containsInOrder([
            '+0: skipped',
            '  Skip expect (<2>).',
            '~1: All tests skipped.'
          ]));
      await test.shouldExit(0);
    });

    test('still allows the test to fail', () async {
      await d.file('test.dart', '''
        import 'package:test/test.dart';

        void main() {
          test("failing", () {
            expect(1, equals(2), skip: true);
            expect(1, equals(2));
          });
        }
      ''').create();

      var test = await runTest(['test.dart']);
      expect(
          test.stdout,
          containsInOrder([
            '+0: failing',
            '  Skip expect (<2>).',
            '+0 -1: failing [E]',
            '  Expected: <2>',
            '    Actual: <1>',
            '+0 -1: Some tests failed.'
          ]));
      await test.shouldExit(1);
    });
  });

  group('errors', () {
    test('when called after the test succeeded', () async {
      await d.file('test.dart', '''
        import 'dart:async';

        import 'package:test/test.dart';

        void main() {
          var skipCompleter = Completer();
          var waitCompleter = Completer();
          test("skip", () {
            skipCompleter.future.then((_) {
              waitCompleter.complete();
              expect(1, equals(2), skip: true);
            });
          });

          // Trigger the skip completer in a following test to ensure that it
          // only fires after skip has completed successfully.
          test("wait", () async {
            skipCompleter.complete();
            await waitCompleter.future;
          });
        }
      ''').create();

      var test = await runTest(['test.dart']);
      expect(
          test.stdout,
          containsInOrder([
            '+0: skip',
            '+1: wait',
            '+0 -1: skip',
            'This test was marked as skipped after it had already completed. '
                'Make sure to use',
            '[expectAsync] or the [completes] matcher when testing async code.',
            '+1 -1: Some tests failed.'
          ]));
      await test.shouldExit(1);
    });

    test('when an invalid type is used for skip', () async {
      await d.file('test.dart', '''
        import 'package:test/test.dart';

        void main() {
          test("failing", () {
            expect(1, equals(2), skip: 10);
          });
        }
      ''').create();

      var test = await runTest(['test.dart']);
      expect(
          test.stdout,
          containsInOrder(
              ['Invalid argument (skip)', '+0 -1: Some tests failed.']));
      await test.shouldExit(1);
    });
  });
}
