diff --git a/.github/workflows/pr_validation.yaml b/.github/workflows/pr_validation.yaml index 997b407..b33dfe9 100644 --- a/.github/workflows/pr_validation.yaml +++ b/.github/workflows/pr_validation.yaml @@ -3,6 +3,23 @@ on: pull_request: jobs: + test_goldens: + runs-on: ubuntu-latest + steps: + # Checkout the repository + - uses: actions/checkout@v3 + + # Setup Flutter environment + - uses: subosito/flutter-action@v2 + with: + channel: "stable" + + # Download all the packages that the app uses + - run: flutter pub get + + # Run all tests + - run: flutter test test_goldens + build_website: runs-on: ubuntu-latest defaults: diff --git a/.gitignore b/.gitignore index eb6c05c..cfebaf4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ +test/**/failures/ +test_goldens/**/failures/ + # Miscellaneous *.class *.log diff --git a/LICENSE b/LICENSE index 6e99897..c34c5fd 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2022 Declarative, Inc. +Copyright (c) 2025 Declarative, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: diff --git a/doc/website/source/styles/docs_page_layout.scss b/doc/website/source/styles/docs_page_layout.scss index 6e9aee1..c0b4b12 100644 --- a/doc/website/source/styles/docs_page_layout.scss +++ b/doc/website/source/styles/docs_page_layout.scss @@ -263,15 +263,15 @@ main.page-content { p { margin-bottom: 1.5em; + } - code { - padding: 3px 6px; - background: #7f00a6; - border: 1px solid #a218cc; - border-radius: 4px; + code { + padding: 3px 6px; + background: #7f00a6; + border: 1px solid #a218cc; + border-radius: 4px; - color: WHITE; - } + color: WHITE; } li { diff --git a/golden_tester.Dockerfile b/golden_tester.Dockerfile new file mode 100644 index 0000000..b61f350 --- /dev/null +++ b/golden_tester.Dockerfile @@ -0,0 +1,24 @@ +FROM ubuntu:latest + +ENV FLUTTER_HOME=${HOME}/sdks/flutter +ENV PATH ${PATH}:${FLUTTER_HOME}/bin:${FLUTTER_HOME}/bin/cache/dart-sdk/bin + +USER root + +RUN apt update + +RUN apt install -y git curl unzip + +# Print the Ubuntu version. Useful when there are failing tests. +RUN cat /etc/lsb-release + +# Invalidate the cache when flutter pushes a new commit. +ADD https://api.github.com/repos/flutter/flutter/git/refs/heads/master ./flutter-latest-master + +RUN git clone https://github.com/flutter/flutter.git ${FLUTTER_HOME} + +RUN flutter doctor + +# Copy the whole repo. +# We need this because we use local dependencies. +COPY ./ /golden_tester diff --git a/lib/flutter_test_goldens.dart b/lib/flutter_test_goldens.dart index 73ff6bf..04ff04f 100644 --- a/lib/flutter_test_goldens.dart +++ b/lib/flutter_test_goldens.dart @@ -1,7 +1,8 @@ +export 'src/flutter/flutter_camera.dart'; +export 'src/flutter/flutter_golden_matcher.dart'; export 'src/flutter/flutter_test_extensions.dart'; export 'src/fonts/fonts.dart'; export 'src/fonts/icons.dart'; -export 'src/flutter/flutter_camera.dart'; export 'src/goldens/golden_collections.dart'; export 'src/goldens/golden_comparisons.dart'; export 'src/goldens/golden_rendering.dart'; diff --git a/lib/src/flutter/flutter_golden_matcher.dart b/lib/src/flutter/flutter_golden_matcher.dart new file mode 100644 index 0000000..e015c43 --- /dev/null +++ b/lib/src/flutter/flutter_golden_matcher.dart @@ -0,0 +1,141 @@ +import 'dart:io'; +import 'dart:typed_data'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:path/path.dart'; + +/// A matcher that expects given content to match the golden file referenced +/// by [key], allowing up to [maxPixelMismatchCount] different pixels before +/// considering the test to be a failure. +/// +/// Typically, the [key] is expected to be a relative file path from the given +/// test file, to the golden file, e.g., "goldens/my-golden-name.png". +/// +/// This matcher can be used by calling it in `expectLater()`, e.g., +/// +/// await expectLater( +/// find.byType(MaterialApp), +/// matchesGoldenFileWithPixelAllowance("goldens/my-golden-name.png", 20), +/// ); +/// +/// Typically, Flutter's golden system describes mismatches in terms of percentages. +/// But percentages are difficult to depend upon. Sometimes a relatively large percentage +/// doesn't matter, and sometimes a tiny percentage is critical. When it comes to ignoring +/// irrelevant mismatches, it's often more convenient to work in terms of pixels. This +/// matcher lets developers specify a maximum pixel mismatch count, instead of relying on +/// percentage differences across the entire golden image. +MatchesGoldenFile matchesGoldenFileWithPixelAllowance(Object key, int maxPixelMismatchCount, {int? version}) { + if (key is Uri) { + return MatchesGoldenFileWithPixelAllowance(key, maxPixelMismatchCount, version); + } else if (key is String) { + return MatchesGoldenFileWithPixelAllowance.forStringPath(key, maxPixelMismatchCount, version); + } + throw ArgumentError('Unexpected type for golden file: ${key.runtimeType}'); +} + +/// A special version of [MatchesGoldenFile] that allows a specified number of +/// pixels to be different between golden files before considering the test to +/// be a failure. +/// +/// Typically, this matcher is expected to be created by calling +/// [matchesGoldenFileWithPixelAllowance]. +class MatchesGoldenFileWithPixelAllowance extends MatchesGoldenFile { + /// Creates a [MatchesGoldenFileWithPixelAllowance] that looks for a golden + /// file at the relative path within the [key] URI. + /// + /// The [key] URI should be a relative path from the executing test's + /// directory to the golden file, e.g., "goldens/my-golden-name.png". + MatchesGoldenFileWithPixelAllowance(super.key, this._maxPixelMismatchCount, [super.version]); + + /// Creates a [MatchesGoldenFileWithPixelAllowance] that looks for a golden + /// file at the relative [path]. + /// + /// The [path] should be relative to the executing test's directory, e.g., + /// "goldens/my-golden-name.png". + MatchesGoldenFileWithPixelAllowance.forStringPath(String path, this._maxPixelMismatchCount, [int? version]) + : super.forStringPath(path, version); + + final int _maxPixelMismatchCount; + + @override + Future matchAsync(dynamic item) async { + // Cache the current goldenFileComparator so we can restore + // it after the test. + final originalComparator = goldenFileComparator; + + try { + goldenFileComparator = PixelDiffGoldenComparator( + (goldenFileComparator as LocalFileComparator).basedir.path, + pixelCount: _maxPixelMismatchCount, + ); + + return await super.matchAsync(item); + } finally { + goldenFileComparator = originalComparator; + } + } +} + +/// A golden file comparator that allows a specified number of pixels +/// to be different between the golden image file and the test image file, and +/// still pass. +class PixelDiffGoldenComparator extends LocalFileComparator { + PixelDiffGoldenComparator( + String testBaseDirectory, { + required int pixelCount, + }) : _testBaseDirectory = testBaseDirectory, + _maxPixelMismatchCount = pixelCount, + super(Uri.parse(testBaseDirectory)); + + @override + Uri get basedir => Uri.parse(_testBaseDirectory); + + /// The file system path to the directory that holds the currently executing + /// Dart test file. + final String _testBaseDirectory; + + /// The maximum number of mismatched pixels for which this pixel test + /// is considered a success/pass. + final int _maxPixelMismatchCount; + + @override + Future compare(Uint8List imageBytes, Uri golden) async { + // Note: the incoming `golden` Uri is a partial path from the currently + // executing test directory to the golden file, e.g., "goldens/my-test.png". + final result = await GoldenFileComparator.compareLists( + imageBytes, + await getGoldenBytes(golden), + ); + + if (result.passed) { + return true; + } + + final diffImage = result.diffs!.entries.first.value; + final pixelCount = diffImage.width * diffImage.height; + final pixelMismatchCount = pixelCount * result.diffPercent; + + if (pixelMismatchCount <= _maxPixelMismatchCount) { + return true; + } + + // Paint the golden diffs and images to failure files. + await generateFailureOutput(result, golden, basedir); + throw FlutterError( + "Pixel test failed. ${result.diffPercent.toStringAsFixed(2)}% diff, $pixelMismatchCount pixel count diff (max allowed pixel mismatch count is $_maxPixelMismatchCount)"); + } + + @override + @protected + Future> getGoldenBytes(Uri golden) async { + final File goldenFile = _getGoldenFile(golden); + if (!goldenFile.existsSync()) { + fail('Could not be compared against non-existent file: "$golden"'); + } + final List goldenBytes = await goldenFile.readAsBytes(); + return goldenBytes; + } + + File _getGoldenFile(Uri golden) => File(join(_testBaseDirectory, fromUri(golden.path))); +} diff --git a/lib/src/goldens/golden_comparisons.dart b/lib/src/goldens/golden_comparisons.dart index 2362e38..affad08 100644 --- a/lib/src/goldens/golden_comparisons.dart +++ b/lib/src/goldens/golden_comparisons.dart @@ -4,8 +4,9 @@ import 'package:flutter_test_goldens/src/logging.dart'; /// Compares new [screenshots] to existing [goldens] and reports any mismatches between them. GoldenCollectionMismatches compareGoldenCollections( ScreenshotCollection goldens, - ScreenshotCollection screenshots, -) { + ScreenshotCollection screenshots, { + Map tolerances = const {}, +}) { final mismatches = {}; // For every golden, look for missing and mismatching screenshots. @@ -30,7 +31,8 @@ GoldenCollectionMismatches compareGoldenCollections( // The golden and screenshot have the same size. Look for a pixel mismatch. final mismatchPixelCount = _calculatePixelMismatch(golden, screenshot); - if (mismatchPixelCount > 0) { + final tolerance = tolerances[golden.id] ?? 0; + if (mismatchPixelCount > tolerance) { mismatches[id] = PixelGoldenMismatch( golden: golden, screenshot: screenshot, diff --git a/lib/src/scenes/gallery.dart b/lib/src/scenes/gallery.dart index fb6ffca..acda8ff 100644 --- a/lib/src/scenes/gallery.dart +++ b/lib/src/scenes/gallery.dart @@ -109,6 +109,7 @@ class Gallery { BoxConstraints? constraints, Finder? boundsFinder, GoldenSetup? setup, + int tolerancePx = 0, required Widget widget, }) { assert( @@ -131,6 +132,7 @@ class Gallery { constraints: constraints, boundsFinder: boundsFinder, setup: setup, + tolerancePx: tolerancePx, child: widget, ); } @@ -146,6 +148,7 @@ class Gallery { constraints: constraints, boundsFinder: boundsFinder, setup: setup, + tolerancePx: tolerancePx, child: widget, ); @@ -162,6 +165,7 @@ class Gallery { BoxConstraints? constraints, Finder? boundsFinder, GoldenSetup? setup, + int tolerancePx = 0, required WidgetBuilder builder, }) { assert( @@ -184,6 +188,7 @@ class Gallery { constraints: constraints, boundsFinder: boundsFinder, setup: setup, + tolerancePx: tolerancePx, builder: builder, ); } @@ -199,6 +204,7 @@ class Gallery { constraints: constraints, boundsFinder: boundsFinder, setup: setup, + tolerancePx: tolerancePx, builder: builder, ); @@ -231,6 +237,7 @@ class Gallery { BoxConstraints? constraints, Finder? boundsFinder, GoldenSetup? setup, + int tolerancePx = 0, required GoldenSceneItemPumper pumper, }) { assert( @@ -253,6 +260,7 @@ class Gallery { constraints: constraints, boundsFinder: boundsFinder, setup: setup, + tolerancePx: tolerancePx, pumper: pumper, ); } @@ -268,6 +276,7 @@ class Gallery { constraints: constraints, boundsFinder: boundsFinder, setup: setup, + tolerancePx: tolerancePx, pumper: pumper, ); @@ -301,11 +310,7 @@ class Gallery { // Compare to existing goldens. FtgLog.pipeline.finer("Comparing existing goldens..."); // TODO: Return a success/failure report that we can publish to the test output. - await _compareGoldens( - tester, - _fileName, - screenshots, - ); + await _compareGoldens(tester, _fileName, screenshots); FtgLog.pipeline.finer("Done comparing goldens."); } @@ -369,7 +374,11 @@ class Gallery { } Widget _buildItem( - WidgetTester tester, GoldenSceneItemScaffold itemScaffold, BoxConstraints? constraints, Widget content) { + WidgetTester tester, + GoldenSceneItemScaffold itemScaffold, + BoxConstraints? constraints, + Widget content, + ) { return itemScaffold( tester, ConstrainedBox( @@ -541,7 +550,11 @@ Image.memory( // Compare goldens in the scene. FtgLog.pipeline.fine("Comparing goldens and screenshots"); - final mismatches = compareGoldenCollections(goldenCollection, ScreenshotCollection(candidateCollection)); + final mismatches = compareGoldenCollections( + goldenCollection, + ScreenshotCollection(candidateCollection), + tolerances: _requests.map((id, request) => MapEntry(id, request.tolerancePx)), + ); final items = []; final missingCandidates = []; @@ -593,8 +606,10 @@ Image.memory( if (mismatches.mismatches.isEmpty) { FtgLog.pipeline.info("No golden mismatches found"); + return; } + FtgLog.pipeline.info("Found ${mismatches.mismatches.length} golden mismatches in scene."); final report = GoldenSceneReport( metadata: metadata, items: items, @@ -653,6 +668,7 @@ class GalleryGoldenRequest { this.constraints, Finder? boundsFinder, this.setup, + this.tolerancePx = 0, required this.child, }) : pumper = null, builder = null { @@ -667,6 +683,7 @@ class GalleryGoldenRequest { this.constraints, Finder? boundsFinder, this.setup, + this.tolerancePx = 0, required this.builder, }) : pumper = null, child = null { @@ -681,6 +698,7 @@ class GalleryGoldenRequest { this.constraints, Finder? boundsFinder, this.setup, + this.tolerancePx = 0, required this.pumper, }) : builder = null, child = null { @@ -715,6 +733,18 @@ class GalleryGoldenRequest { /// into the widget tree, but before the screenshot is taken. final GoldenSetup? setup; + /// {@template tolerance} + /// The number of mismatched pixels that are permitted for this item before triggering + /// a test failure. + /// + /// Tolerance is designed primarily for situations where local runs can't match CI runs. + /// For example, there are situations where using an Ubuntu Docker runner locally produces + /// different screenshots than the GitHub Ubuntu runner. When this happens, there's no + /// good answer. In such cases, it typically suffices to add a tolerance for the small number + /// of pixels that don't match. + /// {@endtemplate} + final int tolerancePx; + /// The [GalleryItemPumper] that creates this gallery item, or `null` if this gallery /// item is created with a [builder] or a [child]. final GoldenSceneItemPumper? pumper; diff --git a/lib/src/scenes/golden_scene.dart b/lib/src/scenes/golden_scene.dart index 18cfee7..885a8f6 100644 --- a/lib/src/scenes/golden_scene.dart +++ b/lib/src/scenes/golden_scene.dart @@ -217,7 +217,10 @@ Widget defaultGoldenSceneItemDecorator( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.stretch, children: [ - content, + Align( + alignment: Alignment.centerLeft, + child: content, + ), Padding( padding: const EdgeInsets.all(24), child: Text( diff --git a/lib/src/scenes/single_shot.dart b/lib/src/scenes/single_shot.dart index fce281d..0c51373 100644 --- a/lib/src/scenes/single_shot.dart +++ b/lib/src/scenes/single_shot.dart @@ -78,6 +78,15 @@ class SingleShotConfigurator { ); } + SingleShotConfigurator withTolerance(int tolerancePx) { + _ensureStepNotComplete("tolerance"); + + return SingleShotConfigurator( + _config.copyWith(tolerancePx: tolerancePx), + {..._stepsCompleted, "tolerance"}, + ); + } + void _ensureStepNotComplete(String name) { if (!_stepsCompleted.contains(name)) { return; @@ -104,6 +113,7 @@ class SingleShotConfigurator { widget: _config.widget!, constraints: _config.constraints, boundsFinder: _config.boundsFinder, + tolerancePx: _config.tolerancePx ?? 0, setup: _config.setup, ); } else if (_config.builder != null) { @@ -113,6 +123,7 @@ class SingleShotConfigurator { constraints: _config.constraints, builder: _config.builder!, boundsFinder: _config.boundsFinder, + tolerancePx: _config.tolerancePx ?? 0, setup: _config.setup, ); } else { @@ -122,6 +133,7 @@ class SingleShotConfigurator { constraints: _config.constraints, pumper: _config.pumper!, boundsFinder: _config.boundsFinder, + tolerancePx: _config.tolerancePx ?? 0, setup: _config.setup, ); } @@ -142,6 +154,7 @@ class SingleShotConfiguration { this.builder, this.pumper, this.setup, + this.tolerancePx, this.boundsFinder, }); @@ -161,6 +174,9 @@ class SingleShotConfiguration { final SceneLayout? sceneLayout; + /// {@macro tolerance} + final int? tolerancePx; + final Widget? widget; final WidgetBuilder? builder; final GoldenSceneItemPumper? pumper; @@ -176,6 +192,7 @@ class SingleShotConfiguration { BoxConstraints? constraints, GoldenSceneItemScaffold? itemScaffold, SceneLayout? sceneLayout, + int? tolerancePx, Widget? widget, WidgetBuilder? builder, GoldenSceneItemPumper? pumper, @@ -189,6 +206,7 @@ class SingleShotConfiguration { constraints: constraints ?? this.constraints, itemScaffold: itemScaffold ?? this.itemScaffold, sceneLayout: sceneLayout ?? this.sceneLayout, + tolerancePx: tolerancePx ?? this.tolerancePx, widget: widget ?? this.widget, builder: builder ?? this.builder, pumper: pumper ?? this.pumper, diff --git a/pubspec.yaml b/pubspec.yaml index e39e512..a8548cc 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -31,10 +31,6 @@ dev_dependencies: # For demos: device_frame: ^1.3.0 - forui: ^0.12.0 - lucid: - git: - url: git@github.com:Flutter-Bounty-Hunters/lucid.git super_editor: git: url: https://github.com/superlistapp/super_editor diff --git a/test_goldens/flutter/app_bar/app_bar.png b/test_goldens/flutter/app_bar/app_bar.png index 7c495d8..72fb1c1 100644 Binary files a/test_goldens/flutter/app_bar/app_bar.png and b/test_goldens/flutter/app_bar/app_bar.png differ diff --git a/test_goldens/flutter/app_bar/failures/failure_app_bar.png b/test_goldens/flutter/app_bar/failures/failure_app_bar.png deleted file mode 100644 index c77c0b3..0000000 Binary files a/test_goldens/flutter/app_bar/failures/failure_app_bar.png and /dev/null differ diff --git a/test_goldens/flutter/buttons/button_elevated_interactions.png b/test_goldens/flutter/buttons/button_elevated_interactions.png index 77b7578..2b9bdd6 100644 Binary files a/test_goldens/flutter/buttons/button_elevated_interactions.png and b/test_goldens/flutter/buttons/button_elevated_interactions.png differ diff --git a/test_goldens/flutter/buttons/button_extended_fab_gallery.png b/test_goldens/flutter/buttons/button_extended_fab_gallery.png index 9f8d7c0..96e1bdf 100644 Binary files a/test_goldens/flutter/buttons/button_extended_fab_gallery.png and b/test_goldens/flutter/buttons/button_extended_fab_gallery.png differ diff --git a/test_goldens/flutter/buttons/button_extended_fab_interactions.png b/test_goldens/flutter/buttons/button_extended_fab_interactions.png index a9073a7..0d4c995 100644 Binary files a/test_goldens/flutter/buttons/button_extended_fab_interactions.png and b/test_goldens/flutter/buttons/button_extended_fab_interactions.png differ diff --git a/test_goldens/flutter/buttons/button_fab_interactions.png b/test_goldens/flutter/buttons/button_fab_interactions.png index 0345c2c..ca7d963 100644 Binary files a/test_goldens/flutter/buttons/button_fab_interactions.png and b/test_goldens/flutter/buttons/button_fab_interactions.png differ diff --git a/test_goldens/flutter/buttons/button_icon_interactions.png b/test_goldens/flutter/buttons/button_icon_interactions.png index 0514b41..66ded68 100644 Binary files a/test_goldens/flutter/buttons/button_icon_interactions.png and b/test_goldens/flutter/buttons/button_icon_interactions.png differ diff --git a/test_goldens/flutter/buttons/button_text_interactions.png b/test_goldens/flutter/buttons/button_text_interactions.png index 55d82a5..82187ae 100644 Binary files a/test_goldens/flutter/buttons/button_text_interactions.png and b/test_goldens/flutter/buttons/button_text_interactions.png differ diff --git a/test_goldens/flutter/buttons/failures/failure_button_extended_fab_gallery.png b/test_goldens/flutter/buttons/failures/failure_button_extended_fab_gallery.png deleted file mode 100644 index c77c0b3..0000000 Binary files a/test_goldens/flutter/buttons/failures/failure_button_extended_fab_gallery.png and /dev/null differ diff --git a/test_goldens/flutter/list_tile/list_tile_interactions.png b/test_goldens/flutter/list_tile/list_tile_interactions.png index b7d2b10..9f2f99d 100644 Binary files a/test_goldens/flutter/list_tile/list_tile_interactions.png and b/test_goldens/flutter/list_tile/list_tile_interactions.png differ diff --git a/test_goldens/flutter/tab_bar/tab_bar_high_fidelity.png b/test_goldens/flutter/tab_bar/tab_bar_high_fidelity.png index f0f06c8..c742d8a 100644 Binary files a/test_goldens/flutter/tab_bar/tab_bar_high_fidelity.png and b/test_goldens/flutter/tab_bar/tab_bar_high_fidelity.png differ diff --git a/test_goldens/flutter/tab_bar/tab_bar_low_fidelity.png b/test_goldens/flutter/tab_bar/tab_bar_low_fidelity.png index 28155c9..8a38a0d 100644 Binary files a/test_goldens/flutter/tab_bar/tab_bar_low_fidelity.png and b/test_goldens/flutter/tab_bar/tab_bar_low_fidelity.png differ diff --git a/test_goldens/image_test.dart b/test_goldens/image_test.dart index 0aad262..4216942 100644 --- a/test_goldens/image_test.dart +++ b/test_goldens/image_test.dart @@ -2,6 +2,7 @@ import 'dart:io'; import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; +import 'package:flutter_test_goldens/flutter_test_goldens.dart'; void main() { testWidgets("show an image", (tester) async { @@ -22,11 +23,13 @@ void main() { ), ), ), + debugShowCheckedModeBanner: false, ), ); await tester.pump(); - await expectLater(find.byType(MaterialApp), matchesGoldenFile("image_test.png")); + // Note: This test produces slightly different pixels between Ubuntu Docker and GitHub Ubuntu runner. + await expectLater(find.byType(MaterialApp), matchesGoldenFileWithPixelAllowance("image_test.png", 5)); }); } diff --git a/test_goldens/image_test.png b/test_goldens/image_test.png index a067711..a0449d8 100644 Binary files a/test_goldens/image_test.png and b/test_goldens/image_test.png differ diff --git a/test_goldens/scene_types/gallery/failures/failure_gallery_item_sizes.png b/test_goldens/scene_types/gallery/failures/failure_gallery_item_sizes.png deleted file mode 100644 index 19de28d..0000000 Binary files a/test_goldens/scene_types/gallery/failures/failure_gallery_item_sizes.png and /dev/null differ diff --git a/test_goldens/scene_types/gallery/failures/failure_gallery_platform_all_platforms.png b/test_goldens/scene_types/gallery/failures/failure_gallery_platform_all_platforms.png deleted file mode 100644 index b512316..0000000 Binary files a/test_goldens/scene_types/gallery/failures/failure_gallery_platform_all_platforms.png and /dev/null differ diff --git a/test_goldens/scene_types/gallery/failures/failure_gallery_platform_per_item.png b/test_goldens/scene_types/gallery/failures/failure_gallery_platform_per_item.png deleted file mode 100644 index d4eb219..0000000 Binary files a/test_goldens/scene_types/gallery/failures/failure_gallery_platform_per_item.png and /dev/null differ diff --git a/test_goldens/scene_types/gallery/failures/failure_gallery_pumper_builder_widget_creation.png b/test_goldens/scene_types/gallery/failures/failure_gallery_pumper_builder_widget_creation.png deleted file mode 100644 index 2f07ebe..0000000 Binary files a/test_goldens/scene_types/gallery/failures/failure_gallery_pumper_builder_widget_creation.png and /dev/null differ diff --git a/test_goldens/scene_types/gallery/gallery_item_sizes.png b/test_goldens/scene_types/gallery/gallery_item_sizes.png index 99df934..aa075c1 100644 Binary files a/test_goldens/scene_types/gallery/gallery_item_sizes.png and b/test_goldens/scene_types/gallery/gallery_item_sizes.png differ diff --git a/test_goldens/scene_types/gallery/gallery_platform_all_platforms.png b/test_goldens/scene_types/gallery/gallery_platform_all_platforms.png index 3d258cc..bf45fc5 100644 Binary files a/test_goldens/scene_types/gallery/gallery_platform_all_platforms.png and b/test_goldens/scene_types/gallery/gallery_platform_all_platforms.png differ diff --git a/test_goldens/scene_types/gallery/gallery_platform_per_item.png b/test_goldens/scene_types/gallery/gallery_platform_per_item.png index 2a69062..4dc340c 100644 Binary files a/test_goldens/scene_types/gallery/gallery_platform_per_item.png and b/test_goldens/scene_types/gallery/gallery_platform_per_item.png differ diff --git a/test_goldens/scene_types/gallery/gallery_pumper_builder_widget_creation.png b/test_goldens/scene_types/gallery/gallery_pumper_builder_widget_creation.png index 1ad8950..6e0d2af 100644 Binary files a/test_goldens/scene_types/gallery/gallery_pumper_builder_widget_creation.png and b/test_goldens/scene_types/gallery/gallery_pumper_builder_widget_creation.png differ diff --git a/test_goldens/scene_types/gallery/goldens/failures/failure_gallery_scene.png b/test_goldens/scene_types/gallery/goldens/failures/failure_gallery_scene.png deleted file mode 100644 index a2ee256..0000000 Binary files a/test_goldens/scene_types/gallery/goldens/failures/failure_gallery_scene.png and /dev/null differ diff --git a/test_goldens/scene_types/gallery/goldens/gallery_scene.png b/test_goldens/scene_types/gallery/goldens/gallery_scene.png index 351b201..7e34bb2 100644 Binary files a/test_goldens/scene_types/gallery/goldens/gallery_scene.png and b/test_goldens/scene_types/gallery/goldens/gallery_scene.png differ diff --git a/test_goldens/scene_types/single_shot/failures/failure_single_shot_scene.png b/test_goldens/scene_types/single_shot/failures/failure_single_shot_scene.png deleted file mode 100644 index 1fd7b28..0000000 Binary files a/test_goldens/scene_types/single_shot/failures/failure_single_shot_scene.png and /dev/null differ diff --git a/test_goldens/scene_types/single_shot/goldens/failures/failure_single_shot_scene.png b/test_goldens/scene_types/single_shot/goldens/failures/failure_single_shot_scene.png deleted file mode 100644 index 1fd7b28..0000000 Binary files a/test_goldens/scene_types/single_shot/goldens/failures/failure_single_shot_scene.png and /dev/null differ diff --git a/test_goldens/scene_types/single_shot/goldens/single_shot_scene.png b/test_goldens/scene_types/single_shot/goldens/single_shot_scene.png index 5671768..e98d0b1 100644 Binary files a/test_goldens/scene_types/single_shot/goldens/single_shot_scene.png and b/test_goldens/scene_types/single_shot/goldens/single_shot_scene.png differ diff --git a/test_goldens/scene_types/single_shot/single_shot_scene.png b/test_goldens/scene_types/single_shot/single_shot_scene.png index 5671768..e98d0b1 100644 Binary files a/test_goldens/scene_types/single_shot/single_shot_scene.png and b/test_goldens/scene_types/single_shot/single_shot_scene.png differ diff --git a/test_goldens/scene_types/timeline/hello_timeline.png b/test_goldens/scene_types/timeline/hello_timeline.png index 0cce7fd..9476aaf 100644 Binary files a/test_goldens/scene_types/timeline/hello_timeline.png and b/test_goldens/scene_types/timeline/hello_timeline.png differ diff --git a/test_goldens/theming/failures/failure_scoped-theme_group-scope.png b/test_goldens/theming/failures/failure_scoped-theme_group-scope.png deleted file mode 100644 index c77c0b3..0000000 Binary files a/test_goldens/theming/failures/failure_scoped-theme_group-scope.png and /dev/null differ diff --git a/test_goldens/theming/failures/failure_scoped-theme_test-scope.png b/test_goldens/theming/failures/failure_scoped-theme_test-scope.png deleted file mode 100644 index c77c0b3..0000000 Binary files a/test_goldens/theming/failures/failure_scoped-theme_test-scope.png and /dev/null differ diff --git a/test_goldens/theming/scoped-theme_group-scope.png b/test_goldens/theming/scoped-theme_group-scope.png index b56b6c7..34bc806 100644 Binary files a/test_goldens/theming/scoped-theme_group-scope.png and b/test_goldens/theming/scoped-theme_group-scope.png differ diff --git a/test_goldens/theming/scoped-theme_test-scope.png b/test_goldens/theming/scoped-theme_test-scope.png index 1be4ed9..8cda234 100644 Binary files a/test_goldens/theming/scoped-theme_test-scope.png and b/test_goldens/theming/scoped-theme_test-scope.png differ