widgetTreeMatchesGolden function
Future<void>
widgetTreeMatchesGolden(
- WidgetTester tester, {
- required Widget widget,
- WidgetTreeOptions options = const WidgetTreeOptions(),
- 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;
}
}
}