widgetTreeMatchesGolden function

Future<void> widgetTreeMatchesGolden(
  1. WidgetTester tester, {
  2. required Widget widget,
  3. WidgetTreeOptions options = const WidgetTreeOptions(),
  4. bool? update,
})

Wrapper for widget tree testing

Implementation

Future<void> widgetTreeMatchesGolden(
  WidgetTester tester, {
  required Widget widget,
  WidgetTreeOptions options = const WidgetTreeOptions(),
  bool? update,
}) async {
  update ??= autoUpdateGoldenFiles;
  final goldenName = options.goldenName ?? widget.runtimeType.toString();

  final testTree = createWidgetTree(
    tester.element(
        options.findWidget?.call(tester, widget) ?? find.byWidget(widget)),
    tester: tester,
    options: options,
  );

  // strip all information from the tree that is not relevant for the comparison
  // e.g. hash codes, keys, etc. that change between test runs
  final testTreeStripped = testTree?.toXmlString(
        boundsPrecision: options.boundsPrecision,
      ) ??
      '';

  final goldenFile = File(
    path.join(Directory(options.goldenPath).path, '$goldenName.xml'),
  );

  // Create the golden directory if it does not exist
  final goldenSubDir = goldenFile.parent;
  if (!goldenSubDir.existsSync()) {
    goldenSubDir.createSync(recursive: true);
  }

  if (update || !goldenFile.existsSync()) {
    // Update or create the golden file
    goldenFile.writeAsStringSync(testTreeStripped);
  } else {
    // Compare with existing golden
    final goldenTree = goldenFile.readAsStringSync();

    try {
      expectEqualStrings(
        testTreeStripped,
        goldenTree,
        reason: 'Widget trees of ${goldenFile.path} does not match',
      );
    } on TestFailure catch (_) {
      // put the diff in the failure folder
      final diffFile = File(
        path.join(
            Directory(options.failurePath).path, '${goldenName}_diff.html'),
      );
      // Create the golden directory if it does not exist
      final diffFileDir = diffFile.parent;
      if (!diffFileDir.existsSync()) {
        diffFileDir.createSync(recursive: true);
      }
      final diffHtml = generateHtmlFormattedDiff(
        goldenTree,
        testTreeStripped,
        title: 'Widget Tree Comparison',
        subtitle: 'Widget tree diff for $goldenName',
      );
      diffFile.writeAsStringSync(diffHtml);
      rethrow;
    }
  }
}