testScenario function
Implementation
void testScenario(
Config config,
Scenario scenario,
) {
final defaultViewport = Viewports.none;
final targetViewport = scenario.viewport ?? defaultViewport;
testWidgets(
scenario.name,
(tester) async {
tester.view.physicalConstraints = targetViewport.viewConstraints;
tester.view.devicePixelRatio = targetViewport.pixelRatio;
final key = UniqueKey();
await tester.pumpWidget(
Builder(
key: key,
builder: (context) => scenario.buildWithConfig(context, config),
),
);
await scenario.execute(tester);
final element = tester.element(find.byKey(key));
final imageFuture = captureImage(element, 1);
// Run on separate isolate as async operations cannot be run inside
// testWidgets directly.
final binding = TestWidgetsFlutterBinding.instance;
await binding.runAsync(() async {
final image = await imageFuture;
final byteData = await image.toByteData(format: ImageByteFormat.png);
final imageBytes = byteData!.buffer.asUint8List();
final jsonEncoder = const JsonEncoder.withIndent(' ');
final metadata = ScenarioMetadata(
scenario: scenario,
imageBytes: imageBytes,
imageWidth: image.width,
imageHeight: image.height,
pixelRatio: targetViewport.pixelRatio,
);
await metadata.directory.create(recursive: true);
await Future.wait([
metadata.imageFile.writeAsBytes(imageBytes, flush: true),
metadata.jsonFile.writeAsString(
jsonEncoder.convert(metadata),
flush: true,
),
]);
image.dispose();
});
addTearDown(tester.view.reset);
},
);
}