execute method
Future<void>
execute({
- required CancelToken cancelToken,
- required TestReport report,
- required TestController tester,
override
Attempts to locate the Testable identified by the testableId and will then set the associated value to the found widget.
Implementation
@override
Future<void> execute({
required CancelToken cancelToken,
required TestReport report,
required TestController tester,
}) async {
final testableId = tester.resolveVariable(this.testableId);
final type = tester.resolveVariable(this.type);
final value = tester.resolveVariable(this.value)?.toString();
assert(testableId?.isNotEmpty == true);
assert(type == 'bool' ||
type == 'double' ||
type == 'int' ||
type == 'String');
final name = "$id('$testableId', '$type', '$value')";
log(
name,
tester: tester,
);
final finder = await waitFor(
testableId,
cancelToken: cancelToken,
tester: tester,
timeout: timeout,
);
await sleep(
tester.delays.postFoundWidget,
cancelStream: cancelToken.stream,
tester: tester,
);
dynamic typedValue;
switch (type) {
case 'bool':
typedValue = JsonClass.parseBool(value);
break;
case 'double':
typedValue = JsonClass.parseDouble(value);
break;
case 'int':
typedValue = JsonClass.parseInt(value);
break;
case 'String':
typedValue = value;
break;
default:
throw Exception('Unknown type encountered: $type');
}
if (cancelToken.cancelled == true) {
throw Exception('[CANCELLED]: step was cancelled by the test');
}
final widgetFinder = finder.evaluate();
if (cancelToken.cancelled == true) {
throw Exception('[CANCELLED]: step was cancelled by the test');
}
var match = false;
if (widgetFinder.isNotEmpty == true) {
try {
final element = widgetFinder.first as StatefulElement;
final state = element.state;
if (state is TestableState) {
state.onSetValue!(typedValue);
match = true;
}
} catch (e) {
// no-op; fail via "match != true".
}
}
if (match != true) {
throw Exception(
'testableId: [$testableId] -- could not locate Testable with a functional [onSetValue] method.',
);
}
}