// Copyright (c) 2022, 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.

import 'package:checks/checks.dart';
import 'package:test/scaffolding.dart';

import '../test_shared.dart';

void main() {
  group('ThrowsChecks', () {
    group('throws', () {
      test('succeeds for happy case', () {
        check(() => throw StateError('oops!')).throws<StateError>();
      });
      test('fails for functions that return normally', () {
        check(() {}).isRejectedBy(
          (it) => it.throws<StateError>(),
          actual: ['a function that returned <null>'],
          which: ['did not throw'],
        );
      });
      test('fails for functions that throw the wrong type', () {
        check(() {
          Error.throwWithStackTrace(
            StateError('oops!'),
            StackTrace.fromString('fake trace'),
          );
        }).isRejectedBy(
          (it) => it.throws<ArgumentError>(),
          actual: ['a function that threw error <Bad state: oops!>'],
          which: [
            'threw an exception that is not a ArgumentError at:',
            '  fake trace',
          ],
        );
      });
    });

    group('returnsNormally', () {
      test('succeeds for happy case', () {
        check(() => 1).returnsNormally().equals(1);
      });
      test('fails for functions that throw', () {
        check(() {
          Error.throwWithStackTrace(
            StateError('oops!'),
            StackTrace.fromString('fake trace'),
          );
        }).isRejectedBy(
          (it) => it.returnsNormally(),
          actual: ['a function that throws'],
          which: ['threw <Bad state: oops!> at:', '  fake trace'],
        );
      });
    });
  });
}
