From ccefe30641cb9ffd080fe21cde34ea0fa0b160d3 Mon Sep 17 00:00:00 2001 From: Angelo Silvestre Date: Sat, 21 Jun 2025 17:50:51 -0300 Subject: [PATCH 1/5] Add failing test --- .../failure_reporting_test.dart | 86 ++++++++++++++++++ .../goldens/multiple_failures.png | Bin 0 -> 10319 bytes 2 files changed, 86 insertions(+) create mode 100644 test_goldens/failure_reporting/failure_reporting_test.dart create mode 100644 test_goldens/failure_reporting/goldens/multiple_failures.png diff --git a/test_goldens/failure_reporting/failure_reporting_test.dart b/test_goldens/failure_reporting/failure_reporting_test.dart new file mode 100644 index 0000000..17c28a8 --- /dev/null +++ b/test_goldens/failure_reporting/failure_reporting_test.dart @@ -0,0 +1,86 @@ +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:flutter_test_goldens/flutter_test_goldens.dart'; +import 'package:flutter_test_goldens/golden_bricks.dart'; + +void main() { + testGoldenScene('reports multiple failures', (tester) async { + await Gallery( + tester, + directory: Directory("./goldens"), + fileName: "multiple_failures", + sceneDescription: "Multiple Failures", + layout: SceneLayout.column, + ) + .itemFromWidget( + id: '1', + description: 'Red Rectangle', + // Use _buildGoldenRectangle to build the original golden rectangle. + widget: _buildMismatchRectangle(), + ) + .itemFromWidget( + id: '2', + description: 'A text', + // Use _buildGoldenText to build the original golden text. + widget: _buildMismatchText(), + ) + // The following item is present in the golden file. + // .itemFromWidget( + // id: '3', + // description: 'Another Red Rectangle', + // widget: _buildGoldenRectangle(), + // ) + // + // The following item is not present in the golden file. + .itemFromWidget( + id: '4', + description: 'An unexpected Rectangle', + widget: _buildGoldenRectangle(), + ) + .renderOrCompareGolden(); + }); +} + +/// The widget used to build the original golden rectangle. +Widget _buildGoldenRectangle() { + return Container( + width: 150, + height: 100, + color: Colors.red, + ); +} + +/// The widget used to build the mismatch rectangle. +/// +/// It has the same same size as the golden rectangle but a different color. +Widget _buildMismatchRectangle() { + return Container( + width: 150, + height: 100, + color: Colors.green, + ); +} + +/// The widget used to build the original golden text. +// ignore: unused_element +Widget _buildGoldenText() { + return Text( + 'A text widget', + style: TextStyle( + fontFamily: goldenBricks, + ), + ); +} + +/// The widget used to build the mismatch golden text. +/// +/// It has the same text but all uppercase. +Widget _buildMismatchText() { + return Text( + 'A TEXT WIDGET', + style: TextStyle( + fontFamily: goldenBricks, + ), + ); +} diff --git a/test_goldens/failure_reporting/goldens/multiple_failures.png b/test_goldens/failure_reporting/goldens/multiple_failures.png new file mode 100644 index 0000000000000000000000000000000000000000..c5b8ab63aed6b402ff1af0c38c995c3d3c71bbf1 GIT binary patch literal 10319 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 literal 0 HcmV?d00001 From 05182e213451453ca666af78bfa03c03505f7e3c Mon Sep 17 00:00:00 2001 From: Angelo Silvestre Date: Sat, 21 Jun 2025 20:18:40 -0300 Subject: [PATCH 2/5] Update failure report --- .../scenes/golden_scene_report_printer.dart | 30 ++++++++++++++---- .../failure_reporting_test.dart | 16 +++++++--- .../goldens/multiple_failures.png | Bin 10319 -> 14434 bytes 3 files changed, 36 insertions(+), 10 deletions(-) diff --git a/lib/src/scenes/golden_scene_report_printer.dart b/lib/src/scenes/golden_scene_report_printer.dart index 92af41a..33f3e10 100644 --- a/lib/src/scenes/golden_scene_report_printer.dart +++ b/lib/src/scenes/golden_scene_report_printer.dart @@ -12,7 +12,7 @@ class GoldenSceneReportPrinter { final buffer = StringBuffer(); // Report the summary of passed/failed tests and missing/extra candidates. - buffer.write("Golden scene has failures: ${report.metadata.description} ("); + buffer.write("Golden scene failed ("); buffer.write("✅ ${report.totalPassed}/${report.items.length}, "); buffer.write("❌ ${report.totalFailed}/${report.items.length}"); if (report.missingCandidates.isNotEmpty || report.extraCandidates.isNotEmpty) { @@ -29,10 +29,9 @@ class GoldenSceneReportPrinter { buffer.write(" +${report.extraCandidates.length}"); } } - buffer.writeln(")"); + buffer.writeln("):"); if (report.totalFailed > 0) { - buffer.writeln(""); for (final item in report.items) { if (item.status == GoldenTestStatus.success) { buffer.writeln("✅ ${item.metadata.id}"); @@ -43,12 +42,31 @@ class GoldenSceneReportPrinter { final mismatch = item.mismatch; switch (mismatch) { case WrongSizeGoldenMismatch(): - buffer.writeln( - '"❌ ${item.metadata.id}" has an unexpected size (expected: ${mismatch.golden.size}, actual: ${mismatch.screenshot.size})'); + buffer.writeln('❌ ${item.metadata.id} (wrong size)'); + buffer.writeln(' - Golden size: (${mismatch.golden.size.width}, ${mismatch.golden.size.height})'); + buffer + .writeln(' - Candidate size: (${mismatch.screenshot.size.width}, ${mismatch.screenshot.size.height})'); + buffer.write(' - '); + // Print the width comparison. + if (mismatch.golden.size.width > mismatch.screenshot.size.width) { + buffer.write("Candidate is ${mismatch.golden.size.width - mismatch.screenshot.size.width} too narrow."); + } else if (mismatch.golden.size.width < mismatch.screenshot.size.width) { + buffer.write("Candidate is ${mismatch.screenshot.size.width - mismatch.golden.size.width} too wide."); + } else { + buffer.write("Candidate has correct width."); + } + // Print the height comparison. + if (mismatch.golden.size.height > mismatch.screenshot.size.height) { + buffer.write(" Candidate is ${mismatch.golden.size.height - mismatch.screenshot.size.height} too short."); + } else if (mismatch.golden.size.height < mismatch.screenshot.size.height) { + buffer.write(" Candidate is ${mismatch.screenshot.size.height - mismatch.golden.size.height} too tall."); + } else { + buffer.write(" Candidate has correct height."); + } break; case PixelGoldenMismatch(): buffer.writeln( - '"❌ ${item.metadata.id}" has a ${(mismatch.percent * 100).toStringAsFixed(2)}% (${mismatch.mismatchPixelCount}px) mismatch'); + '❌ ${item.metadata.id} (${mismatch.mismatchPixelCount}px, ${(mismatch.percent * 100).toStringAsFixed(2)}%)'); break; case MissingGoldenMismatch(): case MissingCandidateMismatch(): diff --git a/test_goldens/failure_reporting/failure_reporting_test.dart b/test_goldens/failure_reporting/failure_reporting_test.dart index 17c28a8..ea7bb44 100644 --- a/test_goldens/failure_reporting/failure_reporting_test.dart +++ b/test_goldens/failure_reporting/failure_reporting_test.dart @@ -10,7 +10,7 @@ void main() { tester, directory: Directory("./goldens"), fileName: "multiple_failures", - sceneDescription: "Multiple Failures", + sceneDescription: "Example with multiple failures", layout: SceneLayout.column, ) .itemFromWidget( @@ -21,20 +21,28 @@ void main() { ) .itemFromWidget( id: '2', + description: 'A golden that passes', + widget: Container( + width: 150, + height: 100, + color: Colors.green, + ), + ) + .itemFromWidget( + id: '3', description: 'A text', // Use _buildGoldenText to build the original golden text. widget: _buildMismatchText(), ) // The following item is present in the golden file. // .itemFromWidget( - // id: '3', + // id: '4', // description: 'Another Red Rectangle', // widget: _buildGoldenRectangle(), // ) - // // The following item is not present in the golden file. .itemFromWidget( - id: '4', + id: '5', description: 'An unexpected Rectangle', widget: _buildGoldenRectangle(), ) diff --git a/test_goldens/failure_reporting/goldens/multiple_failures.png b/test_goldens/failure_reporting/goldens/multiple_failures.png index c5b8ab63aed6b402ff1af0c38c995c3d3c71bbf1..9b53f518983e61c37cc089efb5b8bdd40977db19 100644 GIT binary patch literal 14434 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 literal 10319 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 From a4f8711967964ba04c03be2f506be1e53c421aa3 Mon Sep 17 00:00:00 2001 From: Angelo Silvestre Date: Sat, 21 Jun 2025 20:19:57 -0300 Subject: [PATCH 3/5] Update failure report --- lib/src/scenes/golden_scene_report_printer.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/src/scenes/golden_scene_report_printer.dart b/lib/src/scenes/golden_scene_report_printer.dart index 33f3e10..ab1770f 100644 --- a/lib/src/scenes/golden_scene_report_printer.dart +++ b/lib/src/scenes/golden_scene_report_printer.dart @@ -63,6 +63,7 @@ class GoldenSceneReportPrinter { } else { buffer.write(" Candidate has correct height."); } + buffer.writeln(""); break; case PixelGoldenMismatch(): buffer.writeln( From 13a57598aa917c052781cd94a435d4f03bee3234 Mon Sep 17 00:00:00 2001 From: Angelo Silvestre Date: Sat, 21 Jun 2025 20:21:31 -0300 Subject: [PATCH 4/5] Add missing px --- lib/src/scenes/golden_scene_report_printer.dart | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/src/scenes/golden_scene_report_printer.dart b/lib/src/scenes/golden_scene_report_printer.dart index ab1770f..ac2e78e 100644 --- a/lib/src/scenes/golden_scene_report_printer.dart +++ b/lib/src/scenes/golden_scene_report_printer.dart @@ -49,17 +49,19 @@ class GoldenSceneReportPrinter { buffer.write(' - '); // Print the width comparison. if (mismatch.golden.size.width > mismatch.screenshot.size.width) { - buffer.write("Candidate is ${mismatch.golden.size.width - mismatch.screenshot.size.width} too narrow."); + buffer.write("Candidate is ${mismatch.golden.size.width - mismatch.screenshot.size.width}px too narrow."); } else if (mismatch.golden.size.width < mismatch.screenshot.size.width) { - buffer.write("Candidate is ${mismatch.screenshot.size.width - mismatch.golden.size.width} too wide."); + buffer.write("Candidate is ${mismatch.screenshot.size.width - mismatch.golden.size.width}px too wide."); } else { buffer.write("Candidate has correct width."); } // Print the height comparison. if (mismatch.golden.size.height > mismatch.screenshot.size.height) { - buffer.write(" Candidate is ${mismatch.golden.size.height - mismatch.screenshot.size.height} too short."); + buffer + .write(" Candidate is ${mismatch.golden.size.height - mismatch.screenshot.size.height}px too short."); } else if (mismatch.golden.size.height < mismatch.screenshot.size.height) { - buffer.write(" Candidate is ${mismatch.screenshot.size.height - mismatch.golden.size.height} too tall."); + buffer + .write(" Candidate is ${mismatch.screenshot.size.height - mismatch.golden.size.height}px too tall."); } else { buffer.write(" Candidate has correct height."); } From e93e95050cdd728b0502d497ed25ee1d6eb04e3a Mon Sep 17 00:00:00 2001 From: Angelo Silvestre Date: Sat, 21 Jun 2025 21:04:05 -0300 Subject: [PATCH 5/5] Update item descriptions --- .../scenes/golden_scene_report_printer.dart | 21 ++++++++++-------- .../failure_reporting_test.dart | 10 ++++----- .../goldens/multiple_failures.png | Bin 14434 -> 12666 bytes 3 files changed, 17 insertions(+), 14 deletions(-) diff --git a/lib/src/scenes/golden_scene_report_printer.dart b/lib/src/scenes/golden_scene_report_printer.dart index ac2e78e..8f4dd06 100644 --- a/lib/src/scenes/golden_scene_report_printer.dart +++ b/lib/src/scenes/golden_scene_report_printer.dart @@ -43,25 +43,28 @@ class GoldenSceneReportPrinter { switch (mismatch) { case WrongSizeGoldenMismatch(): buffer.writeln('❌ ${item.metadata.id} (wrong size)'); - buffer.writeln(' - Golden size: (${mismatch.golden.size.width}, ${mismatch.golden.size.height})'); - buffer - .writeln(' - Candidate size: (${mismatch.screenshot.size.width}, ${mismatch.screenshot.size.height})'); + buffer.writeln( + ' - Golden size: (${mismatch.golden.size.width.toInt()}, ${mismatch.golden.size.height.toInt()})'); + buffer.writeln( + ' - Candidate size: (${mismatch.screenshot.size.width.toInt()}, ${mismatch.screenshot.size.height.toInt()})'); buffer.write(' - '); // Print the width comparison. if (mismatch.golden.size.width > mismatch.screenshot.size.width) { - buffer.write("Candidate is ${mismatch.golden.size.width - mismatch.screenshot.size.width}px too narrow."); + buffer.write( + "Candidate is ${(mismatch.golden.size.width - mismatch.screenshot.size.width).toInt()}px too narrow."); } else if (mismatch.golden.size.width < mismatch.screenshot.size.width) { - buffer.write("Candidate is ${mismatch.screenshot.size.width - mismatch.golden.size.width}px too wide."); + buffer.write( + "Candidate is ${(mismatch.screenshot.size.width - mismatch.golden.size.width).toInt()}px too wide."); } else { buffer.write("Candidate has correct width."); } // Print the height comparison. if (mismatch.golden.size.height > mismatch.screenshot.size.height) { - buffer - .write(" Candidate is ${mismatch.golden.size.height - mismatch.screenshot.size.height}px too short."); + buffer.write( + " Candidate is ${(mismatch.golden.size.height - mismatch.screenshot.size.height).toInt()}px too short."); } else if (mismatch.golden.size.height < mismatch.screenshot.size.height) { - buffer - .write(" Candidate is ${mismatch.screenshot.size.height - mismatch.golden.size.height}px too tall."); + buffer.write( + " Candidate is ${(mismatch.screenshot.size.height - mismatch.golden.size.height.toInt())}px too tall."); } else { buffer.write(" Candidate has correct height."); } diff --git a/test_goldens/failure_reporting/failure_reporting_test.dart b/test_goldens/failure_reporting/failure_reporting_test.dart index ea7bb44..7d2aa24 100644 --- a/test_goldens/failure_reporting/failure_reporting_test.dart +++ b/test_goldens/failure_reporting/failure_reporting_test.dart @@ -15,13 +15,13 @@ void main() { ) .itemFromWidget( id: '1', - description: 'Red Rectangle', + description: 'Android caret', // Use _buildGoldenRectangle to build the original golden rectangle. widget: _buildMismatchRectangle(), ) .itemFromWidget( id: '2', - description: 'A golden that passes', + description: 'Android drag handles', widget: Container( width: 150, height: 100, @@ -30,20 +30,20 @@ void main() { ) .itemFromWidget( id: '3', - description: 'A text', + description: 'Hint text', // Use _buildGoldenText to build the original golden text. widget: _buildMismatchText(), ) // The following item is present in the golden file. // .itemFromWidget( // id: '4', - // description: 'Another Red Rectangle', + // description: 'iOS caret', // widget: _buildGoldenRectangle(), // ) // The following item is not present in the golden file. .itemFromWidget( id: '5', - description: 'An unexpected Rectangle', + description: 'iOS drag handles', widget: _buildGoldenRectangle(), ) .renderOrCompareGolden(); diff --git a/test_goldens/failure_reporting/goldens/multiple_failures.png b/test_goldens/failure_reporting/goldens/multiple_failures.png index 9b53f518983e61c37cc089efb5b8bdd40977db19..ab707ee30132458f0a102c9998b16624b3345e91 100644 GIT binary patch literal 12666 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 LpQoL>cKhD|vxA&q literal 14434 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