Skip to content

Commit 22a8c89

Browse files
Update failure layout
1 parent 7f88407 commit 22a8c89

File tree

2 files changed

+87
-47
lines changed

2 files changed

+87
-47
lines changed

lib/src/scenes/failure_scene.dart

Lines changed: 86 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,7 @@ Future<Image> paintGoldenMismatchImages(GoldenMismatch mismatch) async {
8787
}
8888

8989
/// Given a [report], generates that shows all the mismatches found in the report.
90-
Future<(Image, FailureSceneMetadata)> paintFailureScene(
91-
WidgetTester tester, GoldenSceneReport report, SceneLayout layout) async {
90+
Future<(Image, FailureSceneMetadata)> paintFailureScene(WidgetTester tester, GoldenSceneReport report) async {
9291
final photos = <GoldenSceneScreenshot>[];
9392

9493
for (final item in report.items) {
@@ -103,7 +102,7 @@ Future<(Image, FailureSceneMetadata)> paintFailureScene(
103102
final absoluteDiff = _generateAbsoluteDiff(golden, candidate, mismatch);
104103
final relativeDiff = _generateRelativeDiff(golden, candidate, mismatch);
105104

106-
final reportImage = _layoutGoldenFailure(
105+
final reportImage = await _layoutGoldenFailure(
107106
report: report,
108107
golden: golden.image,
109108
candidate: candidate.image,
@@ -130,63 +129,67 @@ Future<(Image, FailureSceneMetadata)> paintFailureScene(
130129
);
131130
}
132131

133-
for (final missingCandidate in report.missingCandidates) {
134-
// TODO: Figure out why using missingCandidate.golden!.pngBytes causes an "Invalid image data" error.
135-
final image = await _convertImagePackageToUiImage(missingCandidate.golden!.image);
136-
final pixels = (await image.toByteData(format: ui.ImageByteFormat.png))!.buffer.asUint8List();
137-
photos.add(
138-
GoldenSceneScreenshot(
139-
missingCandidate.golden!.id,
140-
missingCandidate.golden!.metadata.copyWith(
141-
description: "${missingCandidate.golden!.metadata.description} (missing candidate)",
142-
),
143-
missingCandidate.golden!.image,
144-
pixels,
145-
),
146-
);
147-
}
148-
149-
for (final extraCandidate in report.extraCandidates) {
150-
photos.add(
151-
GoldenSceneScreenshot(
152-
extraCandidate.screenshot!.id,
153-
extraCandidate.screenshot!.metadata.copyWith(
154-
description: "${extraCandidate.screenshot!.metadata.description} (extra candidate)",
155-
),
156-
extraCandidate.screenshot!.image,
157-
extraCandidate.screenshot!.pngBytes,
158-
),
159-
);
160-
}
161-
162-
return _layoutFailureScene(tester, report, photos, layout);
132+
// for (final missingCandidate in report.missingCandidates) {
133+
// // TODO: Figure out why using missingCandidate.golden!.pngBytes causes an "Invalid image data" error.
134+
// final image = await _convertImagePackageToUiImage(missingCandidate.golden!.image);
135+
// final pixels = (await image.toByteData(format: ui.ImageByteFormat.png))!.buffer.asUint8List();
136+
// photos.add(
137+
// GoldenSceneScreenshot(
138+
// missingCandidate.golden!.id,
139+
// missingCandidate.golden!.metadata.copyWith(
140+
// description: "${missingCandidate.golden!.metadata.description} (missing candidate)",
141+
// ),
142+
// missingCandidate.golden!.image,
143+
// pixels,
144+
// ),
145+
// );
146+
// }
147+
148+
// for (final extraCandidate in report.extraCandidates) {
149+
// photos.add(
150+
// GoldenSceneScreenshot(
151+
// extraCandidate.screenshot!.id,
152+
// extraCandidate.screenshot!.metadata.copyWith(
153+
// description: "${extraCandidate.screenshot!.metadata.description} (extra candidate)",
154+
// ),
155+
// extraCandidate.screenshot!.image,
156+
// extraCandidate.screenshot!.pngBytes,
157+
// ),
158+
// );
159+
// }
160+
161+
return _layoutFailureScene(tester, report, photos);
163162
}
164163

165164
/// Generates a single image that shows all the golden failures.
166165
Future<(Image, FailureSceneMetadata)> _layoutFailureScene(
167166
WidgetTester tester,
168167
GoldenSceneReport report,
169168
List<GoldenSceneScreenshot> images,
170-
SceneLayout layout,
171169
) async {
172170
final renderablePhotos = <GoldenSceneScreenshot, GlobalKey>{};
173171
for (final photo in images) {
174172
renderablePhotos[photo] = GlobalKey();
175173
}
176174

175+
final layout = RowSceneLayout(
176+
itemDecorator: _itemDecorator,
177+
);
178+
177179
final sceneKey = GlobalKey();
178180
final scene = GoldenSceneBounds(
179181
child: IntrinsicWidth(
180182
child: IntrinsicHeight(
181183
child: material.Builder(
182-
key: sceneKey,
183-
builder: (context) {
184-
return layout.build(
185-
tester,
186-
context,
187-
renderablePhotos,
188-
);
189-
}),
184+
key: sceneKey,
185+
builder: (context) {
186+
return layout.build(
187+
tester,
188+
context,
189+
renderablePhotos,
190+
);
191+
},
192+
),
190193
),
191194
),
192195
);
@@ -230,13 +233,13 @@ Future<(Image, FailureSceneMetadata)> _layoutFailureScene(
230233

231234
/// Generates a single image that shows the golden, the candidate, and the
232235
/// absolute and relative differences between them.
233-
Image _layoutGoldenFailure({
236+
Future<Image> _layoutGoldenFailure({
234237
required GoldenSceneReport report,
235238
required Image golden,
236239
required Image candidate,
237240
required Image absoluteDiff,
238241
required Image relativeDiff,
239-
}) {
242+
}) async {
240243
final maxWidth = max(golden.width, candidate.width);
241244
final maxHeight = max(golden.height, candidate.height);
242245
const gap = 4;
@@ -270,19 +273,20 @@ Image _layoutGoldenFailure({
270273
);
271274

272275
// Copy absolute diff to bottom left corner.
276+
final diffY = maxHeight + gap;
273277
_drawImage(
274278
source: absoluteDiff,
275279
destination: image,
276280
x: 0,
277-
y: maxHeight + gap,
281+
y: diffY,
278282
);
279283

280284
// Copy relative diff to bottom right corner.
281285
_drawImage(
282286
source: relativeDiff,
283287
destination: image,
284288
x: maxWidth + gap,
285-
y: maxHeight + gap,
289+
y: diffY,
286290
);
287291

288292
return image;
@@ -530,3 +534,39 @@ class FailureImageMetadata {
530534
};
531535
}
532536
}
537+
538+
Widget _itemDecorator(
539+
BuildContext context,
540+
GoldenScreenshotMetadata metadata,
541+
Widget content,
542+
) {
543+
return Padding(
544+
padding: const EdgeInsets.all(24),
545+
child: IntrinsicWidth(
546+
child: Column(
547+
mainAxisSize: MainAxisSize.min,
548+
spacing: 4,
549+
crossAxisAlignment: CrossAxisAlignment.stretch,
550+
children: [
551+
Row(
552+
children: [
553+
Expanded(child: Text('Golden')),
554+
Expanded(child: Text('Candidate')),
555+
],
556+
),
557+
content,
558+
Row(
559+
children: [
560+
Expanded(child: Text('Absolute Diff')),
561+
Expanded(child: Text('Relative Diff')),
562+
],
563+
),
564+
const material.Divider(),
565+
Expanded(
566+
child: Text(metadata.description),
567+
),
568+
],
569+
),
570+
),
571+
);
572+
}

lib/src/scenes/gallery.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -621,7 +621,7 @@ Image.memory(
621621
Directory(_goldenFailureDirectoryPath).createSync();
622622

623623
await tester.runAsync(() async {
624-
final (failureImage, metadata) = await paintFailureScene(tester, report, _layout);
624+
final (failureImage, metadata) = await paintFailureScene(tester, report);
625625

626626
Uint8List pngData = encodePng(failureImage);
627627
pngData = pngData.copyWithTextMetadata(

0 commit comments

Comments
 (0)