| // Copyright (c) 2021, 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 'dart:async'; | |
| import '../backend/invoker.dart'; | |
| /// Returns a [Future] that completes after the [event loop][] has run the given | |
| /// number of [times] (20 by default). | |
| /// | |
| /// [event loop]: https://medium.com/dartlang/dart-asynchronous-programming-isolates-and-event-loops-bffc3e296a6a | |
| /// | |
| /// Awaiting this approximates waiting until all asynchronous work (other than | |
| /// work that's waiting for external resources) completes. | |
| Future pumpEventQueue({int times = 20}) { | |
| if (times == 0) return Future.value(); | |
| // Use the event loop to allow the microtask queue to finish. | |
| return Future(() => pumpEventQueue(times: times - 1)); | |
| } | |
| /// Registers an exception that was caught for the current test. | |
| void registerException( | |
| Object error, [ | |
| StackTrace stackTrace = StackTrace.empty, | |
| ]) { | |
| // This will usually forward directly to [Invoker.current.handleError], but | |
| // going through the zone API allows other zones to consistently see errors. | |
| Zone.current.handleUncaughtError(error, stackTrace); | |
| } | |
| /// Prints [message] if and when the current test fails. | |
| /// | |
| /// This is intended for test infrastructure to provide debugging information | |
| /// without cluttering the output for successful tests. Note that unlike | |
| /// [print], each individual message passed to [printOnFailure] will be | |
| /// separated by a blank line. | |
| void printOnFailure(String message) { | |
| _currentInvoker.printOnFailure(message); | |
| } | |
| /// Marks the current test as skipped. | |
| /// | |
| /// A skipped test may still fail if any exception is thrown, including uncaught | |
| /// asynchronous errors. If the entire test should be skipped `return` from the | |
| /// test body after marking it as skipped. | |
| void markTestSkipped(String message) => _currentInvoker..skip(message); | |
| Invoker get _currentInvoker => | |
| Invoker.current ?? | |
| (throw StateError( | |
| 'There is no current invoker. Please make sure that you are making the ' | |
| 'call inside a test zone.', | |
| )); |