blob: 9bb45549064a7f8d51709595201dca9e6c9455a5 [file] [log] [blame]
// 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/context.dart';
extension ThrowsCheck<T> on Check<T Function()> {
/// Expects that a function throws synchronously when it is called.
///
/// If the function synchronously throws a value of type [E], return a
/// [Check<E>] to check further expectations on the error.
///
/// If the function does not throw synchronously, or if it throws an error
/// that is not of type [E], this expectation will fail.
///
/// If this function is async and returns a [Future], this expectation will
/// fail. Instead invoke the function and check the expectation on the
/// returned [Future].
Check<E> throws<E>() {
return context.nest<E>('Completes as an error of type $E', (actual) {
try {
final result = actual();
return Extracted.rejection(
actual: 'Returned ${literal(result)}',
which: ['Did not throw'],
);
} catch (e) {
if (e is E) return Extracted.value(e as E);
return Extracted.rejection(
actual: 'Completed to error ${literal(e)}',
which: ['Is not an $E']);
}
});
}
}