verifyDetailed method

Future<VerificationOutcome> verifyDetailed({
  1. required MissionStep step,
  2. required ExecutorResult execResult,
  3. required UiSnapshot? before,
  4. required UiSnapshot? after,
  5. UiNode? resolvedTarget,
  6. UiSnapshot? baseline,
})

verify plus the runner's baseline capture, taken shortly BEFORE before: any node that changed between the two is self-changing (a countdown, a clock, a shimmer) and can never vouch for an action.

Implementation

Future<VerificationOutcome> verifyDetailed({
  required MissionStep step,
  required ExecutorResult execResult,
  required UiSnapshot? before,
  required UiSnapshot? after,
  UiNode? resolvedTarget,
  UiSnapshot? baseline,
}) async {
  if (!execResult.success) {
    return VerificationOutcome(
      success: false,
      evidence: const [VerificationEvidence.noObservableEffect],
      failureReason: execResult.error,
    );
  }
  // No acted node handed in: verify the REQUESTED element, by identity
  // only (its stable id) — never by re-matching the description, which is
  // how a different field once got verified.
  final requestedId = step.targetStableId;
  if (resolvedTarget == null &&
      requestedId != null &&
      requestedId.isNotEmpty) {
    resolvedTarget =
        before?.findByStableId(requestedId) ?? after?.findByStableId(requestedId);
  }

  switch (step.action) {
    case 'navigate':
      return _verifyNavigate(
          step, before, after, resolvedTarget, baseline);

    case 'tap':
    case 'click':
      return _verifyTap(step, before, after, resolvedTarget, baseline);

    case 'back':
      return _verifyBack(execResult, before, after);

    case 'set_text':
    case 'type':
      return _verifyInput(step, before, after, resolvedTarget);

    case 'scroll_to':
    case 'scroll_and_highlight':
      return _verifyScrollTo(step, after, resolvedTarget);

    case 'check':
    case 'toggle':
      return _verifyChecked(step, execResult, after, resolvedTarget);

    case 'select':
      return _verifySelect(step, before, after, resolvedTarget);

    case 'set_slider':
      return _verifySlider(execResult, after, resolvedTarget);

    case 'highlight':
    case 'wait':
    case 'read_field':
    case 'find_candidates':
    default:
      // Trusted verbs: nothing on screen is supposed to change.
      return const VerificationOutcome(success: true, evidence: []);
  }
}