execute method

  1. @override
Future<void> execute({
  1. required CancelToken cancelToken,
  2. required TestReport report,
  3. 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.',
    );
  }
}