genUiSemanticsDiff function

String? genUiSemanticsDiff(
  1. List<GenUiSemanticNode> expected,
  2. List<GenUiSemanticNode> actual
)

Describes how actual differs from expected, or null when it does not.

Written to be read in a failure message: one line per position, the expected node above the one that arrived.

Implementation

String? genUiSemanticsDiff(
  List<GenUiSemanticNode> expected,
  List<GenUiSemanticNode> actual,
) {
  if (expected.length == actual.length &&
      List<int>.generate(
        expected.length,
        (i) => i,
      ).every((i) => expected[i] == actual[i])) {
    return null;
  }

  final out = StringBuffer();
  for (var i = 0; i < expected.length || i < actual.length; i++) {
    final GenUiSemanticNode? want = i < expected.length ? expected[i] : null;
    final GenUiSemanticNode? got = i < actual.length ? actual[i] : null;
    if (want == got) continue;
    out
      ..writeln('  [$i] expected ${want ?? '(nothing)'}')
      ..writeln('      actual   ${got ?? '(nothing)'}');
  }
  return out.toString();
}