From 0d9bc96c43aa894fcdb53f5cd3f28c6bac27f982 Mon Sep 17 00:00:00 2001 From: Lucas Oliveira <62367544+tilucasoli@users.noreply.github.com> Date: Fri, 9 Aug 2024 16:46:03 -0300 Subject: [PATCH] chore: Support to Flutter 3.24.0 (#440) * chore: Support to Flutter 3.24.0 * Update action.yml * Update widget_tester.dart * ignore undefined_hidden_name * box * box * box * fix todoList * fix golden tests * fix generation * add withNullability * update custom_lint * Update action.yml * retaking golden tests * fix pipeline * Update todo_list_page.dart --- .github/actions/test/action.yml | 2 +- examples/themed_button/pubspec.yaml | 2 +- .../todo_list/lib/pages/todo_list_page.dart | 5 ++- examples/todo_list/pubspec.yaml | 2 +- melos.yaml | 4 +- .../image/decoration_image_dto_test.dart | 10 ++--- .../lib/src/lints/attributes_ordering.dart | 3 +- .../avoid_variant_inside_context_variant.dart | 3 +- .../mix_lint/lib/src/utils/rule_config.dart | 3 +- packages/mix_lint_test/pubspec.yaml | 2 +- packages/remix/demo/pubspec.yaml | 2 +- packages/remix/pubspec.yaml | 4 +- packages/remix/test/flutter_test_config.dart | 34 +++++++++++++++ .../extensions/local_file_comparator.dart | 41 +++++++++++++++++++ .../test/utils/extensions/widget_tester.dart | 2 - 15 files changed, 98 insertions(+), 21 deletions(-) create mode 100644 packages/remix/test/flutter_test_config.dart create mode 100644 packages/remix/test/utils/extensions/local_file_comparator.dart diff --git a/.github/actions/test/action.yml b/.github/actions/test/action.yml index 53fe9abe5..c88bdc7e8 100644 --- a/.github/actions/test/action.yml +++ b/.github/actions/test/action.yml @@ -8,7 +8,7 @@ inputs: flutter-version: description: 'Flutter version' required: false - default: "" + default: "stable" run-dcm: description: 'Should run DCM' required: false diff --git a/examples/themed_button/pubspec.yaml b/examples/themed_button/pubspec.yaml index ac33877bf..f01402bd2 100644 --- a/examples/themed_button/pubspec.yaml +++ b/examples/themed_button/pubspec.yaml @@ -14,7 +14,7 @@ dependencies: sdk: flutter mix: path: ../../packages/mix - custom_lint: + custom_lint: ^0.6.4 google_fonts: ^6.0.0 cupertino_icons: ^1.0.6 widgetbook: ^3.7.1 diff --git a/examples/todo_list/lib/pages/todo_list_page.dart b/examples/todo_list/lib/pages/todo_list_page.dart index 04219081d..d904fde7d 100644 --- a/examples/todo_list/lib/pages/todo_list_page.dart +++ b/examples/todo_list/lib/pages/todo_list_page.dart @@ -1,11 +1,12 @@ import 'package:flutter/material.dart'; import 'package:mix/mix.dart'; -import 'package:todo_list/pages/add_task_page.dart'; import 'package:todo_list/pages/controller/task_controller.dart'; -import 'package:todo_list/style/components/icon_button.dart'; import 'package:todo_list/style/components/list_tile.dart'; import 'package:todo_list/style/design_tokens.dart'; +import '../style/components/icon_button.dart'; +import 'add_task_page.dart'; + const _colors = ColorTokens(); const _textStyles = TextStyleTokens(); diff --git a/examples/todo_list/pubspec.yaml b/examples/todo_list/pubspec.yaml index 22f3a13ef..6f3a2dbef 100644 --- a/examples/todo_list/pubspec.yaml +++ b/examples/todo_list/pubspec.yaml @@ -14,7 +14,7 @@ dependencies: sdk: flutter mix: path: ../../packages/mix - custom_lint: + custom_lint: ^0.6.4 google_fonts: ^6.0.0 cupertino_icons: ^1.0.6 diff --git a/melos.yaml b/melos.yaml index 889e92937..e19c8bfac 100644 --- a/melos.yaml +++ b/melos.yaml @@ -30,7 +30,7 @@ scripts: failFast: true analyze:dart: - run: melos exec -c 10 -- dart analyze --fatal-infos + run: melos exec -c 10 -- dart analyze . description: Run Dart static analysis checks. analyze:dcm: @@ -91,7 +91,7 @@ scripts: fix: run: melos run lint:fix:all custom_lint_analyze: - run: dart pub global activate custom_lint && melos exec --depends-on="mix_lint" custom_lint + run: melos exec --depends-on="mix_lint" dart pub run custom_lint mix_exports: run: melos exec --scope="packages/mix" dart run ./scripts/exports.dart diff --git a/packages/mix/test/src/attributes/decoration/image/decoration_image_dto_test.dart b/packages/mix/test/src/attributes/decoration/image/decoration_image_dto_test.dart index e3acc7706..ee5dba890 100644 --- a/packages/mix/test/src/attributes/decoration/image/decoration_image_dto_test.dart +++ b/packages/mix/test/src/attributes/decoration/image/decoration_image_dto_test.dart @@ -73,11 +73,11 @@ void main() { final result = dto.resolve(EmptyMixData); expect(result.image, equals(imageProvider)); - expect(result.alignment, equals(Alignment.center)); - expect(result.repeat, equals(ImageRepeat.noRepeat)); - expect(result.filterQuality, equals(FilterQuality.low)); - expect(result.invertColors, equals(false)); - expect(result.isAntiAlias, equals(false)); + expect(result.alignment, equals(dto.defaultValue.alignment)); + expect(result.repeat, equals(dto.defaultValue.repeat)); + expect(result.filterQuality, equals(dto.defaultValue.filterQuality)); + expect(result.invertColors, equals(dto.defaultValue.invertColors)); + expect(result.isAntiAlias, equals(dto.defaultValue.isAntiAlias)); }); test('resolve with custom values', () { diff --git a/packages/mix_lint/lib/src/lints/attributes_ordering.dart b/packages/mix_lint/lib/src/lints/attributes_ordering.dart index d87ac7bb3..3ba23b57c 100644 --- a/packages/mix_lint/lib/src/lints/attributes_ordering.dart +++ b/packages/mix_lint/lib/src/lints/attributes_ordering.dart @@ -1,5 +1,6 @@ import 'package:analyzer/dart/ast/ast.dart'; -import 'package:analyzer/error/error.dart'; +// ignore: undefined_hidden_name +import 'package:analyzer/error/error.dart' hide LintCode; import 'package:analyzer/error/listener.dart'; import 'package:analyzer/source/source_range.dart'; import 'package:custom_lint_builder/custom_lint_builder.dart'; diff --git a/packages/mix_lint/lib/src/lints/avoid_variant_inside_context_variant.dart b/packages/mix_lint/lib/src/lints/avoid_variant_inside_context_variant.dart index e1bfbdf05..9eef62393 100644 --- a/packages/mix_lint/lib/src/lints/avoid_variant_inside_context_variant.dart +++ b/packages/mix_lint/lib/src/lints/avoid_variant_inside_context_variant.dart @@ -1,5 +1,6 @@ import 'package:analyzer/dart/ast/ast.dart'; -import 'package:analyzer/error/error.dart'; +// ignore: undefined_hidden_name +import 'package:analyzer/error/error.dart' hide LintCode; import 'package:analyzer/error/listener.dart'; import 'package:custom_lint_builder/custom_lint_builder.dart'; import 'package:mix_lint/src/utils/type_checker.dart'; diff --git a/packages/mix_lint/lib/src/utils/rule_config.dart b/packages/mix_lint/lib/src/utils/rule_config.dart index 36ae18428..35b38e4ca 100644 --- a/packages/mix_lint/lib/src/utils/rule_config.dart +++ b/packages/mix_lint/lib/src/utils/rule_config.dart @@ -1,4 +1,5 @@ -import 'package:analyzer/error/error.dart'; +// ignore: undefined_hidden_name +import 'package:analyzer/error/error.dart' hide LintCode; import 'package:custom_lint_builder/custom_lint_builder.dart'; typedef RuleParameterParser = T Function(Map json); diff --git a/packages/mix_lint_test/pubspec.yaml b/packages/mix_lint_test/pubspec.yaml index 967cafff2..e809dedb8 100644 --- a/packages/mix_lint_test/pubspec.yaml +++ b/packages/mix_lint_test/pubspec.yaml @@ -18,7 +18,7 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter - custom_lint: ^0.6.0 + custom_lint: ^0.6.4 analyzer: ^6.0.0 analyzer_plugin: ^0.11.2 test: ^1.24.9 diff --git a/packages/remix/demo/pubspec.yaml b/packages/remix/demo/pubspec.yaml index 9e44183df..f8f0ee023 100644 --- a/packages/remix/demo/pubspec.yaml +++ b/packages/remix/demo/pubspec.yaml @@ -18,7 +18,7 @@ dependencies: remix: path: ../ - mix: ^1.4.5 + mix: ^1.4.4 dev_dependencies: flutter_test: diff --git a/packages/remix/pubspec.yaml b/packages/remix/pubspec.yaml index 150d8cfd9..96205029d 100644 --- a/packages/remix/pubspec.yaml +++ b/packages/remix/pubspec.yaml @@ -9,13 +9,13 @@ environment: dependencies: flutter: sdk: flutter - mix: ^1.4.5 + mix: ^1.4.4 mix_annotations: ^0.2.1 dev_dependencies: flutter_test: sdk: flutter - custom_lint: ^0.6.0 + custom_lint: ^0.6.4 mix_lint: ^0.1.1 flutter_lints: ^4.0.0 mix_generator: ^0.2.2+1 diff --git a/packages/remix/test/flutter_test_config.dart b/packages/remix/test/flutter_test_config.dart new file mode 100644 index 000000000..09f7e1909 --- /dev/null +++ b/packages/remix/test/flutter_test_config.dart @@ -0,0 +1,34 @@ +import 'dart:async'; + +import 'package:flutter_test/flutter_test.dart'; + +import 'utils/extensions/local_file_comparator.dart'; + +/// Customise your threshold here +/// For example, the error threshold here is 0.5% +/// Golden tests will pass if the pixel difference is equal to or below 0.5% +const _kGoldenTestsThreshold = 0.5 / 100; + +Future testExecutable(FutureOr Function() testMain) async { + if (goldenFileComparator is LocalFileComparator) { + final testUrl = (goldenFileComparator as LocalFileComparator).basedir; + + goldenFileComparator = LocalFileComparatorWithThreshold( + // flutter_test's LocalFileComparator expects the test's URI to be passed + // as an argument, but it only uses it to parse the baseDir in order to + // obtain the directory where the golden tests will be placed. + // As such, we use the default `testUrl`, which is only the `baseDir` and + // append a generically named `test.dart` so that the `baseDir` is + // properly extracted. + Uri.parse('$testUrl/test.dart'), + _kGoldenTestsThreshold, + ); + } else { + throw Exception( + 'Expected `goldenFileComparator` to be of type `LocalFileComparator`, ' + 'but it is of type `${goldenFileComparator.runtimeType}`', + ); + } + + await testMain(); +} diff --git a/packages/remix/test/utils/extensions/local_file_comparator.dart b/packages/remix/test/utils/extensions/local_file_comparator.dart new file mode 100644 index 000000000..349012031 --- /dev/null +++ b/packages/remix/test/utils/extensions/local_file_comparator.dart @@ -0,0 +1,41 @@ +import 'package:flutter/foundation.dart'; +import 'package:flutter_test/flutter_test.dart'; + +/// Works just like [LocalFileComparator] but includes a [threshold] that, when +/// exceeded, marks the test as a failure. +class LocalFileComparatorWithThreshold extends LocalFileComparator { + /// Threshold above which tests will be marked as failing. + /// Ranges from 0 to 1, both inclusive. + final double threshold; + + LocalFileComparatorWithThreshold(Uri testFile, this.threshold) + : assert(threshold >= 0 && threshold <= 1), + super(testFile); + + /// Copy of [LocalFileComparator]'s [compare] method, except for the fact that + /// it checks if the [ComparisonResult.diffPercent] is not greater than + /// [threshold] to decide whether this test is successful or a failure. + @override + Future compare(Uint8List imageBytes, Uri golden) async { + final result = await GoldenFileComparator.compareLists( + imageBytes, + await getGoldenBytes(golden), + ); + + if (!result.passed && result.diffPercent <= threshold) { + debugPrint( + 'A difference of ${result.diffPercent * 100}% was found, but it is ' + 'acceptable since it is not greater than the threshold of ' + '${threshold * 100}%', + ); + + return true; + } + + if (!result.passed) { + final error = await generateFailureOutput(result, golden, basedir); + throw FlutterError(error); + } + return result.passed; + } +} diff --git a/packages/remix/test/utils/extensions/widget_tester.dart b/packages/remix/test/utils/extensions/widget_tester.dart index 3a509feed..c4a2abe8c 100644 --- a/packages/remix/test/utils/extensions/widget_tester.dart +++ b/packages/remix/test/utils/extensions/widget_tester.dart @@ -7,7 +7,6 @@ extension WidgetTesterExt on WidgetTester { Future pumpRxComponent( Widget widget, { MixThemeData? data, - Duration? duration, }) async { await pumpWidget( MaterialApp( @@ -16,7 +15,6 @@ extension WidgetTesterExt on WidgetTester { child: widget, ), ), - duration, ); } }