@@ -87,8 +87,7 @@ Future<Image> paintGoldenMismatchImages(GoldenMismatch mismatch) async {
87
87
}
88
88
89
89
/// 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 {
92
91
final photos = < GoldenSceneScreenshot > [];
93
92
94
93
for (final item in report.items) {
@@ -103,7 +102,7 @@ Future<(Image, FailureSceneMetadata)> paintFailureScene(
103
102
final absoluteDiff = _generateAbsoluteDiff (golden, candidate, mismatch);
104
103
final relativeDiff = _generateRelativeDiff (golden, candidate, mismatch);
105
104
106
- final reportImage = _layoutGoldenFailure (
105
+ final reportImage = await _layoutGoldenFailure (
107
106
report: report,
108
107
golden: golden.image,
109
108
candidate: candidate.image,
@@ -130,63 +129,67 @@ Future<(Image, FailureSceneMetadata)> paintFailureScene(
130
129
);
131
130
}
132
131
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);
163
162
}
164
163
165
164
/// Generates a single image that shows all the golden failures.
166
165
Future <(Image , FailureSceneMetadata )> _layoutFailureScene (
167
166
WidgetTester tester,
168
167
GoldenSceneReport report,
169
168
List <GoldenSceneScreenshot > images,
170
- SceneLayout layout,
171
169
) async {
172
170
final renderablePhotos = < GoldenSceneScreenshot , GlobalKey > {};
173
171
for (final photo in images) {
174
172
renderablePhotos[photo] = GlobalKey ();
175
173
}
176
174
175
+ final layout = RowSceneLayout (
176
+ itemDecorator: _itemDecorator,
177
+ );
178
+
177
179
final sceneKey = GlobalKey ();
178
180
final scene = GoldenSceneBounds (
179
181
child: IntrinsicWidth (
180
182
child: IntrinsicHeight (
181
183
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
+ ),
190
193
),
191
194
),
192
195
);
@@ -230,13 +233,13 @@ Future<(Image, FailureSceneMetadata)> _layoutFailureScene(
230
233
231
234
/// Generates a single image that shows the golden, the candidate, and the
232
235
/// absolute and relative differences between them.
233
- Image _layoutGoldenFailure ({
236
+ Future < Image > _layoutGoldenFailure ({
234
237
required GoldenSceneReport report,
235
238
required Image golden,
236
239
required Image candidate,
237
240
required Image absoluteDiff,
238
241
required Image relativeDiff,
239
- }) {
242
+ }) async {
240
243
final maxWidth = max (golden.width, candidate.width);
241
244
final maxHeight = max (golden.height, candidate.height);
242
245
const gap = 4 ;
@@ -270,19 +273,20 @@ Image _layoutGoldenFailure({
270
273
);
271
274
272
275
// Copy absolute diff to bottom left corner.
276
+ final diffY = maxHeight + gap;
273
277
_drawImage (
274
278
source: absoluteDiff,
275
279
destination: image,
276
280
x: 0 ,
277
- y: maxHeight + gap ,
281
+ y: diffY ,
278
282
);
279
283
280
284
// Copy relative diff to bottom right corner.
281
285
_drawImage (
282
286
source: relativeDiff,
283
287
destination: image,
284
288
x: maxWidth + gap,
285
- y: maxHeight + gap ,
289
+ y: diffY ,
286
290
);
287
291
288
292
return image;
@@ -530,3 +534,39 @@ class FailureImageMetadata {
530
534
};
531
535
}
532
536
}
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
+ }
0 commit comments