sleep method
Future<void>
sleep(
- Duration duration, {
- required Stream<
void> ? cancelStream, - bool error = false,
- String? message,
- required TestController tester,
Sleeps for the defined Duration. This accept an optional cancelStream
which can be used to cancel the sleep. The error
flag informs the
sleeper about whether the duration is a standard duration or an error
based timeout.
The optional message
can be used to provide more details to the sleep
step.
Implementation
@protected
Future<void> sleep(
Duration duration, {
required Stream<void>? cancelStream,
bool error = false,
String? message,
required TestController tester,
}) async {
if (duration.inMilliseconds > 0) {
// Let's reduce the number of log entries to 1 per 100ms or 10 per second.
final calcSteps = duration.inMilliseconds / 100;
// However, let's put sanity limits. At lest 10 events and no more than
// 50.
final steps = max(5, min(50, calcSteps)).toInt();
tester.sleep = ProgressValue(max: steps, value: 0);
final sleepMillis = duration.inMilliseconds ~/ steps;
var canceled = false;
final cancelListener = cancelStream?.listen((_) {
canceled = true;
});
try {
String buildString(int count) {
var str = '[';
for (var i = 0; i < count; i++) {
str += String.fromCharCode(0x2588);
}
for (var i = count; i < steps; i++) {
str += '_';
}
str += ']';
return str;
}
if (message?.isNotEmpty == true) {
_console(message, Level.FINEST);
} else {
_console(
'Sleeping for ${duration.inMilliseconds} millis...',
Level.FINEST,
);
}
for (var i = 0; i < steps; i++) {
_console(buildString(i), Level.FINEST);
tester.sleep = ProgressValue(
error: error,
max: steps,
value: i,
);
await Future.delayed(Duration(milliseconds: sleepMillis));
if (canceled == true) {
break;
}
}
_console(buildString(steps), Level.FINEST);
} finally {
tester.sleep = ProgressValue(
error: error,
max: steps,
value: steps,
);
await Future.delayed(const Duration(milliseconds: 100));
tester.sleep = null;
await cancelListener?.cancel();
}
}
}