blob: d620775162788c6ba0126f4f9a250840bd80a5d0 [file] [log] [blame]
// 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) {
var invoker = Invoker.current;
if (invoker == null) {
throw StateError(
'There is no current invoker. Please make sure that you are making the '
'call inside a test zone.');
}
return invoker.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) => Invoker.current!.skip(message);