diff --git a/README.md b/README.md index d847416..283bac5 100644 --- a/README.md +++ b/README.md @@ -29,10 +29,16 @@ This package allows you to create a widget catalog and all kinds of screenshots. [- What are dummies?](https://github.com/landamessenger/catalog/wiki/Dummies#what-are-dummies) -[- Complex page catalog](https://github.com/landamessenger/catalog/wiki/Dummies#complex-page-catalog) - [- Prepare dummies](https://github.com/landamessenger/catalog/wiki/Dummies#prepare-dummies) +### [Test](https://github.com/landamessenger/catalog/wiki/Test) + +[- Tests](https://github.com/landamessenger/catalog/wiki/Test#tests) + +[- Integration Tests](https://github.com/landamessenger/catalog/wiki/Test#integration-tests) + +[- Sample](https://github.com/landamessenger/catalog/wiki/Test#sample) + ### [Build & Run](https://github.com/landamessenger/catalog/wiki/Build-&-Run) [- Building your catalog](https://github.com/landamessenger/catalog/wiki/Build-&-Run#building-your-catalog) @@ -52,4 +58,3 @@ This package allows you to create a widget catalog and all kinds of screenshots. [- Samples](https://github.com/landamessenger/catalog/wiki/Screenshots#samples) ### [Catalog Sample](https://landamessenger.com/catalog) - diff --git a/example/integration_test/catalog_widget_integration_test.dart b/example/integration_test/catalog_widget_integration_test.dart index 52912c2..c627714 100644 --- a/example/integration_test/catalog_widget_integration_test.dart +++ b/example/integration_test/catalog_widget_integration_test.dart @@ -9,22 +9,25 @@ import 'package:integration_test/integration_test.dart'; import 'package:example/widgets/utils/bottom/catalog/integration_test/fab_widget_integration_test.dart' - as fwie; + as nsyv; import 'package:example/widgets/other_utils/bottom/catalog/integration_test/warning_info_widget_integration_test.dart' - as aznv; + as fhuz; +import 'package:example/widgets/screen/catalog/integration_test/sized_container_integration_test.dart' + as qaip; import 'package:example/widgets/screen/catalog/integration_test/body_widget_integration_test.dart' - as yzoq; + as afnp; import 'package:example/widgets/screen/catalog/integration_test/counter_widget_integration_test.dart' - as zciv; + as mvnf; import 'package:example/widgets/catalog/integration_test/main_screen_integration_test.dart' - as lwvd; + as gnzn; void main() { IntegrationTestWidgetsFlutterBinding.ensureInitialized(); - fwie.FabWidgetIntegrationTest().main(); - aznv.WarningInfoWidgetIntegrationTest().main(); - yzoq.BodyWidgetIntegrationTest().main(); - zciv.CounterWidgetIntegrationTest().main(); - lwvd.MainScreenIntegrationTest().main(); + nsyv.FabWidgetIntegrationTest().main(); + fhuz.WarningInfoWidgetIntegrationTest().main(); + qaip.SizedContainerIntegrationTest().main(); + afnp.BodyWidgetIntegrationTest().main(); + mvnf.CounterWidgetIntegrationTest().main(); + gnzn.MainScreenIntegrationTest().main(); } diff --git a/example/lib/widgets/screen/catalog/dummy/sized_container.dummy.dart b/example/lib/widgets/screen/catalog/dummy/sized_container.dummy.dart new file mode 100644 index 0000000..4325143 --- /dev/null +++ b/example/lib/widgets/screen/catalog/dummy/sized_container.dummy.dart @@ -0,0 +1,24 @@ +/// AUTOGENERATED FILE. +/// +/// Use this file to prepare the preview and the tests: +/// +/// - SizedContainerPreview +/// - SizedContainerTest +/// - SizedContainerIntegrationTest +/// + +import 'package:catalog/catalog.dart'; +import 'package:flutter/widgets.dart'; + +class SizedContainerDummy extends PreviewDummy { + @override + List get dummies => List.generate( + 8, + (index) => Dummy( + parameters: { + 'width': (index + 1) * 100.0, + 'child': Text(bigText * 4), + }, + ), + ); +} diff --git a/example/lib/widgets/screen/catalog/integration_test/sized_container_integration_test.dart b/example/lib/widgets/screen/catalog/integration_test/sized_container_integration_test.dart new file mode 100644 index 0000000..d3d5734 --- /dev/null +++ b/example/lib/widgets/screen/catalog/integration_test/sized_container_integration_test.dart @@ -0,0 +1,69 @@ +/// AUTOGENERATED FILE. +/// +/// Use this file to test the widget SizedContainer +/// + +import 'package:catalog/catalog.dart'; +import 'package:flutter/widgets.dart'; + +import '../dummy/sized_container.dummy.dart'; +import '../preview/sized_container.preview.dart'; + +class SizedContainerIntegrationTest { + void main() { + group( + 'SizedContainer - IntegrationTest Tests', + () { + testWidgets( + 'Child does not exceed the width', + (tester) async { + // prepare the context + await tester.setupTestContext(); + + for (var dummy in SizedContainerDummy().dummies) { + // prepare the widget + final widget = buildSizedContainer(dummy); + await tester.test(widget); + + // get the size of the widget + final widgetSize = tester.getSize(find.byWidget(widget)); + + // check the maximum width + expect( + widgetSize.width, + dummy.parameters['width'], + ); + } + }, + ); + + testWidgets( + 'Child does exceed the width', + (tester) async { + // prepare the context + await tester.setupTestContext(); + + for (var dummy in SizedContainerDummy().dummies) { + // prepare the widget + final widget = Container( + child: dummy.parameters['child'], + ); + await tester.test(widget); + + // get the size of the widget + final widgetSize = tester.getSize(find.byWidget(widget)); + + // check the maximum width + expect( + widgetSize.width, + greaterThanOrEqualTo( + dummy.parameters['width'], + ), + ); + } + }, + ); + }, + ); + } +} diff --git a/example/lib/widgets/screen/catalog/preview/sized_container.preview.dart b/example/lib/widgets/screen/catalog/preview/sized_container.preview.dart new file mode 100644 index 0000000..b32761d --- /dev/null +++ b/example/lib/widgets/screen/catalog/preview/sized_container.preview.dart @@ -0,0 +1,124 @@ +/// AUTOGENERATED FILE. DO NOT EDIT + +import 'package:catalog/catalog.dart'; +import 'package:flutter/material.dart'; +import 'package:example/widgets/screen/sized_container.dart'; +import '../dummy/sized_container.dummy.dart'; + +@Preview( + description: 'Container with a max width', + parameters: ['width', 'child'], +) +class SizedContainerPreview extends ParentPreviewWidget { + @override + String get title => 'sized_container'; + + @override + String get basePath => '/catalog'; + + const SizedContainerPreview({super.key}); + + @override + Widget preview(BuildContext context) { + Catalog().widgetBasicPreviewMap.clear(); + Catalog().widgetDevicePreviewMap.clear(); + + if (SizedContainerDummy().dummies.isEmpty) { + return Container(); + } + + final deviceScreenshotsAvailable = + SizedContainerDummy().deviceScreenshotsAvailable; + final screenshotsAvailable = SizedContainerDummy().screenshotsAvailable; + + int basicScreenshots = screenshotsAvailable - deviceScreenshotsAvailable; + + return ListView( + children: [ + Column( + children: [ + if (basicScreenshots > 0) + Center( + child: Container( + constraints: const BoxConstraints( + maxWidth: 400, + ), + child: Card( + clipBehavior: Clip.hardEdge, + child: Container( + padding: const EdgeInsets.all(15), + color: Colors.white, + child: Row( + children: [ + Expanded( + child: Center( + child: Text( + '$basicScreenshots basic screenshots available', + ), + ), + ), + const IconButton( + onPressed: processBasicScreenshots, + icon: Icon( + Icons.screenshot, + ), + ) + ], + ), + ), + ), + ), + ), + if (deviceScreenshotsAvailable > 0) + Center( + child: Container( + constraints: const BoxConstraints( + maxWidth: 400, + ), + child: Card( + clipBehavior: Clip.hardEdge, + child: Container( + padding: const EdgeInsets.all(15), + color: Colors.white, + child: Row( + children: [ + Expanded( + child: Center( + child: Text( + '$deviceScreenshotsAvailable device screenshots available', + ), + ), + ), + const IconButton( + onPressed: processDeviceScreenshots, + icon: Icon( + Icons.screenshot, + ), + ) + ], + ), + ), + ), + ), + ), + for (int i = 0; i < SizedContainerDummy().dummies.length; i++) + PreviewBoundary( + widgetKey: GlobalKey(), + dummyBuilder: () => SizedContainerDummy().dummies[i], + builder: (BuildContext context, Dummy dummy) { + return buildSizedContainer(dummy); + }, + ), + ], + ) + ], + ); + } +} + +SizedContainer buildSizedContainer(Dummy dummy) { + return SizedContainer( + width: dummy.parameters['width'], + child: dummy.parameters['child'], + ); +} diff --git a/example/lib/widgets/screen/catalog/test/sized_container_test.dart b/example/lib/widgets/screen/catalog/test/sized_container_test.dart new file mode 100644 index 0000000..640e06d --- /dev/null +++ b/example/lib/widgets/screen/catalog/test/sized_container_test.dart @@ -0,0 +1,69 @@ +/// AUTOGENERATED FILE. +/// +/// Use this file to test the widget SizedContainer +/// + +import 'package:catalog/catalog.dart'; +import 'package:flutter/widgets.dart'; + +import '../dummy/sized_container.dummy.dart'; +import '../preview/sized_container.preview.dart'; + +class SizedContainerTest { + void main() { + group( + 'SizedContainer - Tests', + () { + testWidgets( + 'Child does not exceed the width', + (tester) async { + // prepare the context + await tester.setupTestContext(); + + for (var dummy in SizedContainerDummy().dummies) { + // prepare the widget + final widget = buildSizedContainer(dummy); + await tester.test(widget); + + // get the size of the widget + final widgetSize = tester.getSize(find.byWidget(widget)); + + // check the maximum width + expect( + widgetSize.width, + dummy.parameters['width'], + ); + } + }, + ); + + testWidgets( + 'Child does exceed the width', + (tester) async { + // prepare the context + await tester.setupTestContext(); + + for (var dummy in SizedContainerDummy().dummies) { + // prepare the widget + final widget = Container( + child: dummy.parameters['child'], + ); + await tester.test(widget); + + // get the size of the widget + final widgetSize = tester.getSize(find.byWidget(widget)); + + // check the maximum width + expect( + widgetSize.width, + greaterThanOrEqualTo( + dummy.parameters['width'], + ), + ); + } + }, + ); + }, + ); + } +} diff --git a/example/lib/widgets/screen/sized_container.dart b/example/lib/widgets/screen/sized_container.dart new file mode 100644 index 0000000..ed51fcd --- /dev/null +++ b/example/lib/widgets/screen/sized_container.dart @@ -0,0 +1,25 @@ +import 'package:catalog/catalog.dart'; +import 'package:flutter/material.dart'; + +@Preview( + description: 'Container with a max width', + parameters: ['width', 'child'], +) +class SizedContainer extends StatelessWidget { + final double width; + final Widget child; + + const SizedContainer({ + super.key, + this.width = 500, + required this.child, + }); + + @override + Widget build(BuildContext context) => Container( + constraints: BoxConstraints( + maxWidth: width, + ), + child: child, + ); +} diff --git a/example/test/catalog_widget_test.dart b/example/test/catalog_widget_test.dart index 136f09b..ff814c2 100644 --- a/example/test/catalog_widget_test.dart +++ b/example/test/catalog_widget_test.dart @@ -1,19 +1,22 @@ /// AUTOGENERATED FILE. DO NOT EDIT import 'package:example/widgets/utils/bottom/catalog/test/fab_widget_test.dart' - as dmsz; + as mxea; import 'package:example/widgets/other_utils/bottom/catalog/test/warning_info_widget_test.dart' - as zjri; + as estp; +import 'package:example/widgets/screen/catalog/test/sized_container_test.dart' + as baxr; import 'package:example/widgets/screen/catalog/test/body_widget_test.dart' - as cpsh; + as nlha; import 'package:example/widgets/screen/catalog/test/counter_widget_test.dart' - as atcw; -import 'package:example/widgets/catalog/test/main_screen_test.dart' as lsrx; + as djlm; +import 'package:example/widgets/catalog/test/main_screen_test.dart' as aobt; void main() { - dmsz.FabWidgetTest().main(); - zjri.WarningInfoWidgetTest().main(); - cpsh.BodyWidgetTest().main(); - atcw.CounterWidgetTest().main(); - lsrx.MainScreenTest().main(); + mxea.FabWidgetTest().main(); + estp.WarningInfoWidgetTest().main(); + baxr.SizedContainerTest().main(); + nlha.BodyWidgetTest().main(); + djlm.CounterWidgetTest().main(); + aobt.MainScreenTest().main(); } diff --git a/lib/src/bin/builders/dummy_builder.dart b/lib/src/bin/builders/dummy_builder.dart index ea5c5ee..0ecd87d 100644 --- a/lib/src/bin/builders/dummy_builder.dart +++ b/lib/src/bin/builders/dummy_builder.dart @@ -27,7 +27,11 @@ Future generateDummy( var content = ''' /// AUTOGENERATED FILE. /// -/// Use this file for modify the preview of ${clazz}Preview +/// Use this file to prepare the preview and the tests: +/// +/// - ${clazz}Preview +/// - ${clazz}Test +/// - ${clazz}IntegrationTest /// import 'package:catalog/catalog.dart'; diff --git a/lib/src/bin/builders/test_builder.dart b/lib/src/bin/builders/test_builder.dart index d3e991d..fb41dd5 100644 --- a/lib/src/bin/builders/test_builder.dart +++ b/lib/src/bin/builders/test_builder.dart @@ -60,7 +60,7 @@ class ${clazz}Test { 'Lorem text not found', (tester) async { // prepare the context - await setupTestContext(); + await tester.setupTestContext(); // prepare the widget final dummy = ${clazz}Dummy().dummies.first; @@ -76,7 +76,7 @@ class ${clazz}Test { 'Other lorem text not found', (tester) async { // prepare the context - await setupTestContext(); + await tester.setupTestContext(); // prepare the widget final dummy = ${clazz}Dummy().dummies.first; @@ -160,7 +160,7 @@ class ${clazz}IntegrationTest { 'Lorem text not found', (tester) async { // prepare the context - await setupIntegrationTestContext(); + await tester.setupIntegrationTestContext(); // prepare the widget final dummy = ${clazz}Dummy().dummies.first; @@ -176,7 +176,7 @@ class ${clazz}IntegrationTest { 'Other lorem text not found', (tester) async { // prepare the context - await setupIntegrationTestContext(); + await tester.setupIntegrationTestContext(); // prepare the widget final dummy = ${clazz}Dummy().dummies.first; diff --git a/lib/src/bin/tasks/preview_task.dart b/lib/src/bin/tasks/preview_task.dart index 4aacfc6..519e8f7 100644 --- a/lib/src/bin/tasks/preview_task.dart +++ b/lib/src/bin/tasks/preview_task.dart @@ -1,14 +1,10 @@ import 'base/base_task.dart'; import 'tasks/format_task.dart'; -import 'tasks/integration_test_task.dart'; import 'tasks/preview_task.dart' as preview; -import 'tasks/test_task.dart'; class PreviewTask extends BaseTask { final tasks = [ preview.PreviewTask(), - TestTask(), - IntegrationTestTask(), FormatTask(), ]; diff --git a/lib/src/builders/dummy/preview_dummy.dart b/lib/src/builders/dummy/preview_dummy.dart index fc1efaa..af44cc0 100644 --- a/lib/src/builders/dummy/preview_dummy.dart +++ b/lib/src/builders/dummy/preview_dummy.dart @@ -14,4 +14,10 @@ abstract class PreviewDummy { } return index; } + + Dummy get(int index) { + if (dummies.isEmpty) throw Exception('Empty dummies list'); + if (index >= dummies.length) return dummies.first; + return dummies[index]; + } } diff --git a/lib/src/extensions/widget_test_ext.dart b/lib/src/extensions/widget_test_ext.dart index f968fcd..2168aca 100644 --- a/lib/src/extensions/widget_test_ext.dart +++ b/lib/src/extensions/widget_test_ext.dart @@ -10,7 +10,7 @@ extension WidgetTestExt on WidgetTester { navigatorKey: Stringcare().navigatorKey, supportedLocales: Stringcare().locales, localizationsDelegates: Stringcare().delegates, - home: widget, + home: Center(child: widget), ), ); await pumpAndSettle();