testScenario function

void testScenario(
  1. Config config,
  2. Scenario<Widget, StoryArgs<Widget>> scenario
)

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);
    },
  );
}