| // 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']); |
| } |
| }); |
| } |
| } |