From bdc6cb082b5580cc66b65de4fe4ed87d12732bc7 Mon Sep 17 00:00:00 2001 From: Greg Littlefield Date: Mon, 9 Feb 2026 16:18:50 -0700 Subject: [PATCH 1/3] Remove test that's difficult to author in multiple analyzer/build versions We'll follow up by adding an integration test that runs the real builder --- .github/workflows/ci.yml | 4 +- .../builder/over_react_builder_test.dart | 276 ------------------ tool/update_tests_for_dart_3.sh | 18 -- .../build_test_3_updates.patch | 45 --- 4 files changed, 1 insertion(+), 342 deletions(-) delete mode 100644 test/vm_tests/builder/over_react_builder_test.dart delete mode 100755 tool/update_tests_for_dart_3.sh delete mode 100644 tool/update_tests_for_dart_3/build_test_3_updates.patch diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 030dcf219..f0758326f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -53,7 +53,6 @@ jobs: DART_VERSION="${{ steps.setup-dart.outputs.dart-version }}" if [[ "$DART_VERSION" =~ ^3 ]]; then ./tool/delete_dart_2_only_files.sh - ./tool/update_tests_for_dart_3.sh # Stage these changes so they don't show up in the generated file `git diff` check below git add . fi @@ -146,7 +145,6 @@ jobs: DART_VERSION="${{ steps.setup-dart.outputs.dart-version }}" if [[ "$DART_VERSION" =~ ^3 ]]; then ./tool/delete_dart_2_only_files.sh - ./tool/update_tests_for_dart_3.sh fi - name: Analyze package source @@ -196,7 +194,7 @@ jobs: run: | DART_VERSION="${{ steps.setup-dart.outputs.dart-version }}" if [[ "$DART_VERSION" =~ ^3 ]]; then - (cd ../.. && ./tool/delete_dart_2_only_files.sh && ./tool/update_tests_for_dart_3.sh) + (cd ../.. && ./tool/delete_dart_2_only_files.sh) fi - name: Validate dependencies diff --git a/test/vm_tests/builder/over_react_builder_test.dart b/test/vm_tests/builder/over_react_builder_test.dart deleted file mode 100644 index 48c96b624..000000000 --- a/test/vm_tests/builder/over_react_builder_test.dart +++ /dev/null @@ -1,276 +0,0 @@ -// Copyright 2020 Workiva Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -@TestOn('vm') -import 'dart:async'; -import 'dart:io'; - -import 'package:build/build.dart'; -import 'package:build_resolvers/build_resolvers.dart'; -import 'package:build_test/build_test.dart'; -import 'package:collection/collection.dart' show IterableExtension; -import 'package:logging/logging.dart'; -import 'package:over_react/src/builder/builder.dart'; -import 'package:path/path.dart' as p; -import 'package:test/test.dart'; - -main() { - group('overReactBuilder', () { - final builder = overReactBuilder(null); - final logger = Logger('overReactBuilderTestLogger'); - - // [1] Note: for this test code to analyze/run in Dart 3 with build_test 3.x, - // it needs to be temporarily modified to use new APIs. - // - // We do this in CI, and it can also be done during local development; - // see tool/update_tests_for_dart_3.sh. - // - // This is a workaround to us not being able to be compatible with build - // test 2.x and 3.x at the same time, and Dart 2 not being compatible with - // build_test 3.x. - - late AssetReader reader; - late InMemoryAssetWriter writer; // [1] - late AssetWriterSpy writerSpy; - late List logs; - - setUp(() async { - // [1] - reader = await PackageAssetReader.currentIsolate( - rootPackage: 'over_react', - ); - - writer = InMemoryAssetWriter(); // [1] - writerSpy = AssetWriterSpy(writer); - - logs = []; - final logSub = logger.onRecord.listen(logs.add); - addTearDown(logSub.cancel); - }); - - void verifyNoErrorLogs() { - expect(logs.where((log) => log.level >= Level.WARNING), isEmpty, - reason: 'Expected no logs at WARNING or SEVERE level, but got:\n' - '\t${logs.join('\n\t')}'); - } - - Future checkBuildForFile(String assetPath, String expectedOutputAssetPath, - String pathToGoldFile) async { - final inputAsset = makeAssetId(assetPath); - final expectedContent = File(pathToGoldFile).readAsStringSync(); - - final expected = { - expectedOutputAssetPath : expectedContent - }; - - await runBuilder(builder, [inputAsset], reader, writerSpy, AnalyzerResolvers(), logger: logger); - final actual = writerSpy.assetsWritten; - - checkOutputs(expected, actual, writer); - verifyNoErrorLogs(); - } - - test('does not produce a build output for a file with no over_react annotations', () async { - var basicAsset = makeAssetId('over_react|test_fixtures/source_files/no_annotations.dart'); - await runBuilder(builder, [basicAsset], reader, writerSpy, AnalyzerResolvers(), logger: logger); - - expect(writerSpy.assetsWritten, isEmpty); - verifyNoErrorLogs(); - }); - - test('warns if .over_react.g.dart part directive is present and no declarations are present, but no code is generated', () async { - var libraryAsset = makeAssetId('over_react|test_fixtures/source_files/has_part_directive_missing_gen/no_declarations.dart'); - await runBuilder(builder, [libraryAsset], reader, writerSpy, AnalyzerResolvers(), logger: logger); - final expectedWarning = logs.firstWhereOrNull((log) { - return log.level == Level.WARNING && log.message == 'An over_react part directive was found in test_fixtures/source_files/has_part_directive_missing_gen/no_declarations.dart, but no code was generated. The part directive may be unnecessary if the file does not contain any concrete components or abstract state/props classes.'; - }); - expect(expectedWarning, isNotNull, - reason: 'Expected a WARNING log for a part directive being present in a file with no generated output.'); - }); - - test('warns if .over_react.g.dart part directive is present and declarations are present, but no code is generated', () async { - var libraryAsset = makeAssetId('over_react|test_fixtures/source_files/has_part_directive_missing_gen/with_declarations.dart'); - await runBuilder(builder, [libraryAsset], reader, writerSpy, AnalyzerResolvers(), logger: logger); - final expectedWarning = logs.firstWhereOrNull((log) { - return log.level == Level.WARNING && log.message == 'An over_react part directive was found in test_fixtures/source_files/has_part_directive_missing_gen/with_declarations.dart, but no code was generated. The part directive may be unnecessary if the file does not contain any concrete components or abstract state/props classes.'; - }); - expect(expectedWarning, isNotNull, - reason: 'Expected a WARNING log for a part directive being present in a file with no generated output.'); - }); - - group('for backwards compatible boilerplate:', () { - test('builds from basic component file', () async { - await checkBuildForFile( - 'over_react|test_fixtures/source_files/backwards_compatible/basic.dart', - 'over_react|test_fixtures/source_files/backwards_compatible/basic.over_react.g.dart', - '${p.absolute(p.current)}/test_fixtures/gold_output_files/backwards_compatible/basic.over_react.g.dart.goldFile'); - }); - - test('builds from basic multi-part library', () async { - await checkBuildForFile( - 'over_react|test_fixtures/source_files/backwards_compatible/basic_library.dart', - 'over_react|test_fixtures/source_files/backwards_compatible/basic_library.over_react.g.dart', - '${p.absolute(p.current)}/test_fixtures/gold_output_files/backwards_compatible/basic_library.over_react.g.dart.goldFile'); - }); - - test('builds for props mixins', () async { - await checkBuildForFile( - 'over_react|test_fixtures/source_files/backwards_compatible/props_mixin.dart', - 'over_react|test_fixtures/source_files/backwards_compatible/props_mixin.over_react.g.dart', - '${p.absolute(p.current)}/test_fixtures/gold_output_files/backwards_compatible/props_mixin.over_react.g.dart.goldFile'); - }); - - test('builds for state mixins', () async { - await checkBuildForFile( - 'over_react|test_fixtures/source_files/backwards_compatible/state_mixin.dart', - 'over_react|test_fixtures/source_files/backwards_compatible/state_mixin.over_react.g.dart', - '${p.absolute(p.current)}/test_fixtures/gold_output_files/backwards_compatible/state_mixin.over_react.g.dart.goldFile'); - }); - - test('does not produce a build output for just a part file', () async { - var basicAsset = makeAssetId('over_react|test_fixtures/source_files/backwards_compatible/part_of_basic_library.dart'); - await runBuilder(builder, [basicAsset], reader, writerSpy, AnalyzerResolvers(), logger: logger); - - expect(writerSpy.assetsWritten, isEmpty); - verifyNoErrorLogs(); - }); - }); - - group('for Dart 2 only compatible boilerplate:', () { - test('builds from basic component file', () async { - await checkBuildForFile( - 'over_react|test_fixtures/source_files/dart2_only/basic.dart', - 'over_react|test_fixtures/source_files/dart2_only/basic.over_react.g.dart', - '${p.absolute(p.current)}/test_fixtures/gold_output_files/dart2_only/basic.over_react.g.dart.goldFile'); - }); - - test('builds from basic multi-part library', () async { - await checkBuildForFile( - 'over_react|test_fixtures/source_files/dart2_only/basic_library.dart', - 'over_react|test_fixtures/source_files/dart2_only/basic_library.over_react.g.dart', - '${p.absolute(p.current)}/test_fixtures/gold_output_files/dart2_only/basic_library.over_react.g.dart.goldFile'); - }); - - test('builds for props mixins', () async { - await checkBuildForFile( - 'over_react|test_fixtures/source_files/dart2_only/props_mixin.dart', - 'over_react|test_fixtures/source_files/dart2_only/props_mixin.over_react.g.dart', - '${p.absolute(p.current)}/test_fixtures/gold_output_files/dart2_only/props_mixin.over_react.g.dart.goldFile'); - }); - - test('builds for state mixins', () async { - await checkBuildForFile( - 'over_react|test_fixtures/source_files/dart2_only/state_mixin.dart', - 'over_react|test_fixtures/source_files/dart2_only/state_mixin.over_react.g.dart', - '${p.absolute(p.current)}/test_fixtures/gold_output_files/dart2_only/state_mixin.over_react.g.dart.goldFile'); - }); - - test('does not produce a build output for just a part file', () async { - var basicAsset = makeAssetId('over_react|test_fixtures/source_files/dart2_only/part_of_basic_library.dart'); - await runBuilder(builder, [basicAsset], reader, writerSpy, AnalyzerResolvers(), logger: logger); - - expect(writerSpy.assetsWritten, isEmpty); - verifyNoErrorLogs(); - }); - - test('fails if the .over_react.g.dart part directive is missing', () async { - var libraryAsset = makeAssetId('over_react|test_fixtures/source_files/dart2_only/missing_over_react_g_part/library.dart'); - await runBuilder(builder, [libraryAsset], reader, writerSpy, AnalyzerResolvers(), logger: logger); - final expectedLog = logs.firstWhereOrNull((log) { - return log.level == Level.SEVERE && log.message == 'Missing "part \'library.over_react.g.dart\';".'; - }); - expect(expectedLog, isNotNull, - reason: 'Expected a SEVERE log for the missing over_react part.'); - }); - - group('for Component2:', () { - test('builds from basic component file', () async { - await checkBuildForFile( - 'over_react|test_fixtures/source_files/dart2_only/component2/basic.dart', - 'over_react|test_fixtures/source_files/dart2_only/component2/basic.over_react.g.dart', - '${p.absolute(p.current)}/test_fixtures/gold_output_files/dart2_only/component2/basic.over_react.g.dart.goldFile'); - }); - - test('builds from basic multi-part library', () async { - await checkBuildForFile( - 'over_react|test_fixtures/source_files/dart2_only/component2/basic_library.dart', - 'over_react|test_fixtures/source_files/dart2_only/component2/basic_library.over_react.g.dart', - '${p.absolute(p.current)}/test_fixtures/gold_output_files/dart2_only/component2/basic_library.over_react.g.dart.goldFile'); - }); - }); - }); - - group('for mixin based boilerplate:', () { - test('builds from basic component file', () async { - await checkBuildForFile( - 'over_react|test_fixtures/source_files/mixin_based/basic.dart', - 'over_react|test_fixtures/source_files/mixin_based/basic.over_react.g.dart', - '${p.absolute(p.current)}/test_fixtures/gold_output_files/mixin_based/basic.over_react.g.dart.goldFile'); - }); - - test('builds from basic component file using Dart >=2.9.0 syntax', () async { - await checkBuildForFile( - 'over_react|test_fixtures/source_files/mixin_based/basic_two_nine.dart', - 'over_react|test_fixtures/source_files/mixin_based/basic_two_nine.over_react.g.dart', - '${p.absolute(p.current)}/test_fixtures/gold_output_files/mixin_based/basic_two_nine.over_react.g.dart.goldFile'); - }); - - test('builds from basic multi-part library', () async { - await checkBuildForFile( - 'over_react|test_fixtures/source_files/mixin_based/basic_library.dart', - 'over_react|test_fixtures/source_files/mixin_based/basic_library.over_react.g.dart', - '${p.absolute(p.current)}/test_fixtures/gold_output_files/mixin_based/basic_library.over_react.g.dart.goldFile'); - }); - - test('builds when props mixins and classes have type parameters', () async { - await checkBuildForFile( - 'over_react|test_fixtures/source_files/mixin_based/type_parameters.dart', - 'over_react|test_fixtures/source_files/mixin_based/type_parameters.over_react.g.dart', - '${p.absolute(p.current)}/test_fixtures/gold_output_files/mixin_based/type_parameters.over_react.g.dart.goldFile'); - }); - - test('builds for props mixins', () async { - await checkBuildForFile( - 'over_react|test_fixtures/source_files/mixin_based/props_mixin.dart', - 'over_react|test_fixtures/source_files/mixin_based/props_mixin.over_react.g.dart', - '${p.absolute(p.current)}/test_fixtures/gold_output_files/mixin_based/props_mixin.over_react.g.dart.goldFile'); - }); - - test('builds for state mixins', () async { - await checkBuildForFile( - 'over_react|test_fixtures/source_files/mixin_based/state_mixin.dart', - 'over_react|test_fixtures/source_files/mixin_based/state_mixin.over_react.g.dart', - '${p.absolute(p.current)}/test_fixtures/gold_output_files/mixin_based/state_mixin.over_react.g.dart.goldFile'); - }); - - test('does not produce a build output for just a part file', () async { - var basicAsset = makeAssetId('over_react|test_fixtures/source_files/mixin_based/part_of_basic_library.dart'); - await runBuilder(builder, [basicAsset], reader, writerSpy, AnalyzerResolvers(), logger: logger); - - expect(writerSpy.assetsWritten, isEmpty); - verifyNoErrorLogs(); - }); - - test('fails if the .over_react.g.dart part directive is missing', () async { - var libraryAsset = makeAssetId('over_react|test_fixtures/source_files/mixin_based/missing_over_react_g_part/library.dart'); - await runBuilder(builder, [libraryAsset], reader, writerSpy, AnalyzerResolvers(), logger: logger); - final expectedLog = logs.firstWhereOrNull((log) { - return log.level == Level.SEVERE && log.message == 'Missing "part \'library.over_react.g.dart\';".'; - }); - expect(expectedLog, isNotNull, - reason: 'Expected a SEVERE log for the missing over_react part.'); - }); - }); - }); -} diff --git a/tool/update_tests_for_dart_3.sh b/tool/update_tests_for_dart_3.sh deleted file mode 100755 index c1c8b06a3..000000000 --- a/tool/update_tests_for_dart_3.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/env bash - -# -# This script makes updates to tests to make them compatible with Dart 3. -# This is a last-resort workaround for cases that can't analyze cleanly in both versions. -# - -set -e -set -x - -# Update over_react_builder_test.dart by applying a patch in build_test 3 (Dart 3 only); -# see comment in test file for more details on the changes. -build_test_version=$(yq '.packages.build_test.version' pubspec.lock) -if [[ "$build_test_version" == "3."* ]]; then - # This patch is derived from fixing tests in build_test 3 and getting the diff with: - # git diff test/vm_tests/builder/over_react_builder_test.dart > tool/update_tests_for_dart_3/build_test_3_updates.patch - git apply tool/update_tests_for_dart_3/build_test_3_updates.patch -fi diff --git a/tool/update_tests_for_dart_3/build_test_3_updates.patch b/tool/update_tests_for_dart_3/build_test_3_updates.patch deleted file mode 100644 index 616526fbc..000000000 --- a/tool/update_tests_for_dart_3/build_test_3_updates.patch +++ /dev/null @@ -1,45 +0,0 @@ -diff --git a/test/vm_tests/builder/over_react_builder_test.dart b/test/vm_tests/builder/over_react_builder_test.dart -index 48c96b62..b9b60b55 100644 ---- a/test/vm_tests/builder/over_react_builder_test.dart -+++ b/test/vm_tests/builder/over_react_builder_test.dart -@@ -20,6 +20,8 @@ import 'package:build/build.dart'; - import 'package:build_resolvers/build_resolvers.dart'; - import 'package:build_test/build_test.dart'; - import 'package:collection/collection.dart' show IterableExtension; -+import 'package:glob/glob.dart'; -+import 'package:glob/list_local_fs.dart'; - import 'package:logging/logging.dart'; - import 'package:over_react/src/builder/builder.dart'; - import 'package:path/path.dart' as p; -@@ -40,18 +42,27 @@ main() { - // test 2.x and 3.x at the same time, and Dart 2 not being compatible with - // build_test 3.x. - -- late AssetReader reader; -- late InMemoryAssetWriter writer; // [1] -+ late TestReaderWriter reader; -+ late TestReaderWriter writer; // [1] - late AssetWriterSpy writerSpy; - late List logs; - - setUp(() async { - // [1] -- reader = await PackageAssetReader.currentIsolate( -+ reader = TestReaderWriter( - rootPackage: 'over_react', - ); - -- writer = InMemoryAssetWriter(); // [1] -+ // Load test fixture assets from the filesystem into the test reader. -+ for (final file in Glob('test_fixtures/**').listSync().whereType()) { -+ // Write via `testing` so it's not tracked as a builder output. -+ reader.testing.writeBytes( -+ makeAssetId('over_react|${file.path}'), -+ file.readAsBytesSync(), -+ ); -+ } -+ -+ writer = TestReaderWriter(); // [1] - writerSpy = AssetWriterSpy(writer); - - logs = []; From e8ec4713104cbfaa0aad511ddd585415ebe93318 Mon Sep 17 00:00:00 2001 From: Greg Littlefield Date: Tue, 10 Feb 2026 17:20:25 -0700 Subject: [PATCH 2/3] Migrate builder test to functional test, refactor gold source file location --- .../builder/over_react_builder_test.dart | 255 ++++++++++++++++++ test_fixtures/gold_output_files/README.md | 5 - .../builder/analysis_options.yaml | 0 .../lib}/backwards_compatible/basic.dart | 0 .../backwards_compatible/basic_library.dart | 0 .../part_of_basic_library.dart | 0 .../part_of_basic_library_2.dart | 0 .../backwards_compatible/props_mixin.dart | 0 .../backwards_compatible/state_mixin.dart | 0 .../builder/lib}/dart2_only/basic.dart | 0 .../lib}/dart2_only/basic_library.dart | 0 .../lib}/dart2_only/component2/basic.dart | 0 .../dart2_only/component2/basic_library.dart | 0 .../component2/part_of_basic_library.dart | 0 .../component2/part_of_basic_library_2.dart | 0 .../missing_over_react_g_part/library.dart | 0 .../missing_over_react_g_part/part.dart | 0 .../dart2_only/part_of_basic_library.dart | 0 .../dart2_only/part_of_basic_library.g.dart | 0 .../dart2_only/part_of_basic_library_2.dart | 0 .../builder/lib}/dart2_only/props_mixin.dart | 0 .../builder/lib}/dart2_only/state_mixin.dart | 0 .../no_declarations.dart | 0 .../with_declarations.dart | 0 .../builder/lib}/mixin_based/basic.dart | 0 .../lib}/mixin_based/basic_library.dart | 0 .../lib}/mixin_based/basic_two_nine.dart | 0 .../missing_over_react_g_part/library.dart | 0 .../missing_over_react_g_part/part.dart | 0 .../mixin_based/part_of_basic_library.dart | 0 .../mixin_based/part_of_basic_library_2.dart | 0 .../builder/lib}/mixin_based/props_mixin.dart | 0 .../builder/lib}/mixin_based/state_mixin.dart | 0 .../two_nine_with_multiple_factories.dart | 0 .../lib}/mixin_based/type_parameters.dart | 0 .../builder/lib}/no_annotations.dart | 0 .../test_packages/builder/pubspec.yaml | 9 + tool/update_gold_output_files.dart | 53 ++-- 38 files changed, 284 insertions(+), 38 deletions(-) create mode 100644 test/vm_tests/builder/over_react_builder_test.dart create mode 100644 test_fixtures/test_packages/builder/analysis_options.yaml rename test_fixtures/{source_files => test_packages/builder/lib}/backwards_compatible/basic.dart (100%) rename test_fixtures/{source_files => test_packages/builder/lib}/backwards_compatible/basic_library.dart (100%) rename test_fixtures/{source_files => test_packages/builder/lib}/backwards_compatible/part_of_basic_library.dart (100%) rename test_fixtures/{source_files => test_packages/builder/lib}/backwards_compatible/part_of_basic_library_2.dart (100%) rename test_fixtures/{source_files => test_packages/builder/lib}/backwards_compatible/props_mixin.dart (100%) rename test_fixtures/{source_files => test_packages/builder/lib}/backwards_compatible/state_mixin.dart (100%) rename test_fixtures/{source_files => test_packages/builder/lib}/dart2_only/basic.dart (100%) rename test_fixtures/{source_files => test_packages/builder/lib}/dart2_only/basic_library.dart (100%) rename test_fixtures/{source_files => test_packages/builder/lib}/dart2_only/component2/basic.dart (100%) rename test_fixtures/{source_files => test_packages/builder/lib}/dart2_only/component2/basic_library.dart (100%) rename test_fixtures/{source_files => test_packages/builder/lib}/dart2_only/component2/part_of_basic_library.dart (100%) rename test_fixtures/{source_files => test_packages/builder/lib}/dart2_only/component2/part_of_basic_library_2.dart (100%) rename test_fixtures/{source_files => test_packages/builder/lib}/dart2_only/missing_over_react_g_part/library.dart (100%) rename test_fixtures/{source_files => test_packages/builder/lib}/dart2_only/missing_over_react_g_part/part.dart (100%) rename test_fixtures/{source_files => test_packages/builder/lib}/dart2_only/part_of_basic_library.dart (100%) rename test_fixtures/{source_files => test_packages/builder/lib}/dart2_only/part_of_basic_library.g.dart (100%) rename test_fixtures/{source_files => test_packages/builder/lib}/dart2_only/part_of_basic_library_2.dart (100%) rename test_fixtures/{source_files => test_packages/builder/lib}/dart2_only/props_mixin.dart (100%) rename test_fixtures/{source_files => test_packages/builder/lib}/dart2_only/state_mixin.dart (100%) rename test_fixtures/{source_files => test_packages/builder/lib}/has_part_directive_missing_gen/no_declarations.dart (100%) rename test_fixtures/{source_files => test_packages/builder/lib}/has_part_directive_missing_gen/with_declarations.dart (100%) rename test_fixtures/{source_files => test_packages/builder/lib}/mixin_based/basic.dart (100%) rename test_fixtures/{source_files => test_packages/builder/lib}/mixin_based/basic_library.dart (100%) rename test_fixtures/{source_files => test_packages/builder/lib}/mixin_based/basic_two_nine.dart (100%) rename test_fixtures/{source_files => test_packages/builder/lib}/mixin_based/missing_over_react_g_part/library.dart (100%) rename test_fixtures/{source_files => test_packages/builder/lib}/mixin_based/missing_over_react_g_part/part.dart (100%) rename test_fixtures/{source_files => test_packages/builder/lib}/mixin_based/part_of_basic_library.dart (100%) rename test_fixtures/{source_files => test_packages/builder/lib}/mixin_based/part_of_basic_library_2.dart (100%) rename test_fixtures/{source_files => test_packages/builder/lib}/mixin_based/props_mixin.dart (100%) rename test_fixtures/{source_files => test_packages/builder/lib}/mixin_based/state_mixin.dart (100%) rename test_fixtures/{source_files => test_packages/builder/lib}/mixin_based/two_nine_with_multiple_factories.dart (100%) rename test_fixtures/{source_files => test_packages/builder/lib}/mixin_based/type_parameters.dart (100%) rename test_fixtures/{source_files => test_packages/builder/lib}/no_annotations.dart (100%) create mode 100644 test_fixtures/test_packages/builder/pubspec.yaml diff --git a/test/vm_tests/builder/over_react_builder_test.dart b/test/vm_tests/builder/over_react_builder_test.dart new file mode 100644 index 000000000..bc195a6da --- /dev/null +++ b/test/vm_tests/builder/over_react_builder_test.dart @@ -0,0 +1,255 @@ +// Copyright 2020 Workiva Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +@TestOn('vm') +import 'dart:io'; + +import 'package:path/path.dart' as p; +import 'package:test/test.dart'; + +main() { + group('overReactBuilder', () { + const testPackagePath = 'test_fixtures/test_packages/builder'; + late String testPackageName; + + late String outputDirectory; + + setUpAll(() { + Process.runSync('dart', ['pub', 'get'], workingDirectory: testPackagePath); + testPackageName = + RegExp('name: (.+)').firstMatch(File(p.join(testPackagePath, 'pubspec.yaml')).readAsStringSync())!.group(1)!; + outputDirectory = Directory.systemTemp.createTempSync().path; + + // Clean previous build + Process.runSync('dart', ['run', 'build_runner', 'clean'], workingDirectory: testPackagePath); + }); + + /// Runs build_runner for a specific file, cleaning first. + ProcessResult buildFile(String sourceFilePath) { + // Build with filter for the specific file + return Process.runSync( + 'dart', + [ + 'run', + 'build_runner', + 'build', + '--verbose', + '--build-filter=lib/${sourceFilePath.replaceAll('.dart', '*.g.dart')}', + '--output=$outputDirectory' + ], + workingDirectory: testPackagePath); + } + + String generatedOutputPath(String sourceFilePath) { + return p.join( + outputDirectory, + 'packages', + testPackageName, + sourceFilePath.replaceAll('.dart', '.over_react.g.dart'), + ); + } + + /// Runs build_runner for a specific file and verifies the generated output matches the gold file. + Future checkBuildForFile(String sourceFilePath, String pathToGoldFile) async { + final build = buildFile(sourceFilePath); + + expect(build.exitCode, 0, + reason: 'build should have succeeded.' + '\nstdout: ${build.stdout}' + '\nstderr: ${build.stderr}'); + + // Read generated file + final expectedGeneratedFile = File(generatedOutputPath(sourceFilePath)); + expect(expectedGeneratedFile.existsSync(), isTrue, + reason: + 'File should have been generated: ${expectedGeneratedFile.path}.\n\nBuild output:\n${build.stdout}\n${build.stderr}'); + + // Compare with gold file + final expectedContent = File(pathToGoldFile).readAsStringSync(); + final actualContent = expectedGeneratedFile.readAsStringSync(); + + expect(actualContent, expectedContent, reason: 'Generated file should match gold file'); + } + + /// Runs build_runner for a specific file and verifies no output is generated. + Future checkNoOutputForFile(String sourceFilePath) async { + final build = buildFile(sourceFilePath); + + expect(build.exitCode, 0, + reason: 'build should have succeeded.' + '\nstdout: ${build.stdout}' + '\nstderr: ${build.stderr}'); + + // Verify no generated file exists + final expectedGeneratedFile = File(generatedOutputPath(sourceFilePath)); + expect(expectedGeneratedFile.existsSync(), isFalse, + reason: 'File should not have been generated: ${expectedGeneratedFile.path}'); + } + + /// Runs build_runner for a specific file and verifies a warning appears in the output. + Future checkWarningForFile(String sourceFilePath, String expectedWarning) async { + final build = buildFile(sourceFilePath); + + // Check for expected warning in output + expect('${build.stdout}${build.stderr}', contains(expectedWarning), + reason: 'Expected warning not found in build output'); + + expect(build.exitCode, 0, + reason: 'build should have succeeded.' + '\nstdout: ${build.stdout}' + '\nstderr: ${build.stderr}'); + } + + /// Runs build_runner for a specific file and verifies a severe error appears in the output. + Future checkSevereErrorForFile(String sourceFilePath, String expectedError) async { + final build = buildFile(sourceFilePath); + + // Check for expected error in output + expect('${build.stdout}${build.stderr}', contains(expectedError), + reason: 'Expected error not found in build output'); + + expect(build.exitCode, 1, + reason: 'build should have failed.' + '\nstdout: ${build.stdout}' + '\nstderr: ${build.stderr}'); + } + + test('does not produce a build output for a file with no over_react annotations', () async { + await checkNoOutputForFile('no_annotations.dart'); + }); + + test( + 'warns if .over_react.g.dart part directive is present and no declarations are present, but no code is generated', + () async { + await checkWarningForFile('has_part_directive_missing_gen/no_declarations.dart', + 'An over_react part directive was found in lib/has_part_directive_missing_gen/no_declarations.dart, but no code was generated.'); + }); + + test('warns if .over_react.g.dart part directive is present and declarations are present, but no code is generated', + () async { + await checkWarningForFile('has_part_directive_missing_gen/with_declarations.dart', + 'An over_react part directive was found in lib/has_part_directive_missing_gen/with_declarations.dart, but no code was generated.'); + }); + + group('for backwards compatible boilerplate:', () { + test('builds from basic component file', () async { + await checkBuildForFile('backwards_compatible/basic.dart', + '${p.absolute(p.current)}/test_fixtures/gold_output_files/backwards_compatible/basic.over_react.g.dart.goldFile'); + }); + + test('builds from basic multi-part library', () async { + await checkBuildForFile('backwards_compatible/basic_library.dart', + '${p.absolute(p.current)}/test_fixtures/gold_output_files/backwards_compatible/basic_library.over_react.g.dart.goldFile'); + }); + + test('builds for props mixins', () async { + await checkBuildForFile('backwards_compatible/props_mixin.dart', + '${p.absolute(p.current)}/test_fixtures/gold_output_files/backwards_compatible/props_mixin.over_react.g.dart.goldFile'); + }); + + test('builds for state mixins', () async { + await checkBuildForFile('backwards_compatible/state_mixin.dart', + '${p.absolute(p.current)}/test_fixtures/gold_output_files/backwards_compatible/state_mixin.over_react.g.dart.goldFile'); + }); + + test('does not produce a build output for just a part file', () async { + await checkNoOutputForFile('backwards_compatible/part_of_basic_library.dart'); + }); + }); + + group('for Dart 2 only compatible boilerplate:', () { + test('builds from basic component file', () async { + await checkBuildForFile('dart2_only/basic.dart', + '${p.absolute(p.current)}/test_fixtures/gold_output_files/dart2_only/basic.over_react.g.dart.goldFile'); + }); + + test('builds from basic multi-part library', () async { + await checkBuildForFile('dart2_only/basic_library.dart', + '${p.absolute(p.current)}/test_fixtures/gold_output_files/dart2_only/basic_library.over_react.g.dart.goldFile'); + }); + + test('builds for props mixins', () async { + await checkBuildForFile('dart2_only/props_mixin.dart', + '${p.absolute(p.current)}/test_fixtures/gold_output_files/dart2_only/props_mixin.over_react.g.dart.goldFile'); + }); + + test('builds for state mixins', () async { + await checkBuildForFile('dart2_only/state_mixin.dart', + '${p.absolute(p.current)}/test_fixtures/gold_output_files/dart2_only/state_mixin.over_react.g.dart.goldFile'); + }); + + test('does not produce a build output for just a part file', () async { + await checkNoOutputForFile('dart2_only/part_of_basic_library.dart'); + }); + + test('fails if the .over_react.g.dart part directive is missing', () async { + await checkSevereErrorForFile( + 'dart2_only/missing_over_react_g_part/library.dart', 'Missing "part \'library.over_react.g.dart\';".'); + }); + + group('for Component2:', () { + test('builds from basic component file', () async { + await checkBuildForFile('dart2_only/component2/basic.dart', + '${p.absolute(p.current)}/test_fixtures/gold_output_files/dart2_only/component2/basic.over_react.g.dart.goldFile'); + }); + + test('builds from basic multi-part library', () async { + await checkBuildForFile('dart2_only/component2/basic_library.dart', + '${p.absolute(p.current)}/test_fixtures/gold_output_files/dart2_only/component2/basic_library.over_react.g.dart.goldFile'); + }); + }); + }); + + group('for mixin based boilerplate:', () { + test('builds from basic component file', () async { + await checkBuildForFile('mixin_based/basic.dart', + '${p.absolute(p.current)}/test_fixtures/gold_output_files/mixin_based/basic.over_react.g.dart.goldFile'); + }); + + test('builds from basic component file using Dart >=2.9.0 syntax', () async { + await checkBuildForFile('mixin_based/basic_two_nine.dart', + '${p.absolute(p.current)}/test_fixtures/gold_output_files/mixin_based/basic_two_nine.over_react.g.dart.goldFile'); + }); + + test('builds from basic multi-part library', () async { + await checkBuildForFile('mixin_based/basic_library.dart', + '${p.absolute(p.current)}/test_fixtures/gold_output_files/mixin_based/basic_library.over_react.g.dart.goldFile'); + }); + + test('builds when props mixins and classes have type parameters', () async { + await checkBuildForFile('mixin_based/type_parameters.dart', + '${p.absolute(p.current)}/test_fixtures/gold_output_files/mixin_based/type_parameters.over_react.g.dart.goldFile'); + }); + + test('builds for props mixins', () async { + await checkBuildForFile('mixin_based/props_mixin.dart', + '${p.absolute(p.current)}/test_fixtures/gold_output_files/mixin_based/props_mixin.over_react.g.dart.goldFile'); + }); + + test('builds for state mixins', () async { + await checkBuildForFile('mixin_based/state_mixin.dart', + '${p.absolute(p.current)}/test_fixtures/gold_output_files/mixin_based/state_mixin.over_react.g.dart.goldFile'); + }); + + test('does not produce a build output for just a part file', () async { + await checkNoOutputForFile('mixin_based/part_of_basic_library.dart'); + }); + + test('fails if the .over_react.g.dart part directive is missing', () async { + await checkSevereErrorForFile( + 'mixin_based/missing_over_react_g_part/library.dart', 'Missing "part \'library.over_react.g.dart\';".'); + }); + }); + }); +} diff --git a/test_fixtures/gold_output_files/README.md b/test_fixtures/gold_output_files/README.md index d44e8a763..51ce5a883 100644 --- a/test_fixtures/gold_output_files/README.md +++ b/test_fixtures/gold_output_files/README.md @@ -4,8 +4,3 @@ To re-generate the gold files in this directory using the over_react builder, ru ```sh dart tool/update_gold_output_files.dart ``` - -If that deletes other generated files throughout over_react (which usually only happens after it prompts you about conflicting outputs), you can restore them by running a build: -```sh -dart run build_runner build -``` diff --git a/test_fixtures/test_packages/builder/analysis_options.yaml b/test_fixtures/test_packages/builder/analysis_options.yaml new file mode 100644 index 000000000..e69de29bb diff --git a/test_fixtures/source_files/backwards_compatible/basic.dart b/test_fixtures/test_packages/builder/lib/backwards_compatible/basic.dart similarity index 100% rename from test_fixtures/source_files/backwards_compatible/basic.dart rename to test_fixtures/test_packages/builder/lib/backwards_compatible/basic.dart diff --git a/test_fixtures/source_files/backwards_compatible/basic_library.dart b/test_fixtures/test_packages/builder/lib/backwards_compatible/basic_library.dart similarity index 100% rename from test_fixtures/source_files/backwards_compatible/basic_library.dart rename to test_fixtures/test_packages/builder/lib/backwards_compatible/basic_library.dart diff --git a/test_fixtures/source_files/backwards_compatible/part_of_basic_library.dart b/test_fixtures/test_packages/builder/lib/backwards_compatible/part_of_basic_library.dart similarity index 100% rename from test_fixtures/source_files/backwards_compatible/part_of_basic_library.dart rename to test_fixtures/test_packages/builder/lib/backwards_compatible/part_of_basic_library.dart diff --git a/test_fixtures/source_files/backwards_compatible/part_of_basic_library_2.dart b/test_fixtures/test_packages/builder/lib/backwards_compatible/part_of_basic_library_2.dart similarity index 100% rename from test_fixtures/source_files/backwards_compatible/part_of_basic_library_2.dart rename to test_fixtures/test_packages/builder/lib/backwards_compatible/part_of_basic_library_2.dart diff --git a/test_fixtures/source_files/backwards_compatible/props_mixin.dart b/test_fixtures/test_packages/builder/lib/backwards_compatible/props_mixin.dart similarity index 100% rename from test_fixtures/source_files/backwards_compatible/props_mixin.dart rename to test_fixtures/test_packages/builder/lib/backwards_compatible/props_mixin.dart diff --git a/test_fixtures/source_files/backwards_compatible/state_mixin.dart b/test_fixtures/test_packages/builder/lib/backwards_compatible/state_mixin.dart similarity index 100% rename from test_fixtures/source_files/backwards_compatible/state_mixin.dart rename to test_fixtures/test_packages/builder/lib/backwards_compatible/state_mixin.dart diff --git a/test_fixtures/source_files/dart2_only/basic.dart b/test_fixtures/test_packages/builder/lib/dart2_only/basic.dart similarity index 100% rename from test_fixtures/source_files/dart2_only/basic.dart rename to test_fixtures/test_packages/builder/lib/dart2_only/basic.dart diff --git a/test_fixtures/source_files/dart2_only/basic_library.dart b/test_fixtures/test_packages/builder/lib/dart2_only/basic_library.dart similarity index 100% rename from test_fixtures/source_files/dart2_only/basic_library.dart rename to test_fixtures/test_packages/builder/lib/dart2_only/basic_library.dart diff --git a/test_fixtures/source_files/dart2_only/component2/basic.dart b/test_fixtures/test_packages/builder/lib/dart2_only/component2/basic.dart similarity index 100% rename from test_fixtures/source_files/dart2_only/component2/basic.dart rename to test_fixtures/test_packages/builder/lib/dart2_only/component2/basic.dart diff --git a/test_fixtures/source_files/dart2_only/component2/basic_library.dart b/test_fixtures/test_packages/builder/lib/dart2_only/component2/basic_library.dart similarity index 100% rename from test_fixtures/source_files/dart2_only/component2/basic_library.dart rename to test_fixtures/test_packages/builder/lib/dart2_only/component2/basic_library.dart diff --git a/test_fixtures/source_files/dart2_only/component2/part_of_basic_library.dart b/test_fixtures/test_packages/builder/lib/dart2_only/component2/part_of_basic_library.dart similarity index 100% rename from test_fixtures/source_files/dart2_only/component2/part_of_basic_library.dart rename to test_fixtures/test_packages/builder/lib/dart2_only/component2/part_of_basic_library.dart diff --git a/test_fixtures/source_files/dart2_only/component2/part_of_basic_library_2.dart b/test_fixtures/test_packages/builder/lib/dart2_only/component2/part_of_basic_library_2.dart similarity index 100% rename from test_fixtures/source_files/dart2_only/component2/part_of_basic_library_2.dart rename to test_fixtures/test_packages/builder/lib/dart2_only/component2/part_of_basic_library_2.dart diff --git a/test_fixtures/source_files/dart2_only/missing_over_react_g_part/library.dart b/test_fixtures/test_packages/builder/lib/dart2_only/missing_over_react_g_part/library.dart similarity index 100% rename from test_fixtures/source_files/dart2_only/missing_over_react_g_part/library.dart rename to test_fixtures/test_packages/builder/lib/dart2_only/missing_over_react_g_part/library.dart diff --git a/test_fixtures/source_files/dart2_only/missing_over_react_g_part/part.dart b/test_fixtures/test_packages/builder/lib/dart2_only/missing_over_react_g_part/part.dart similarity index 100% rename from test_fixtures/source_files/dart2_only/missing_over_react_g_part/part.dart rename to test_fixtures/test_packages/builder/lib/dart2_only/missing_over_react_g_part/part.dart diff --git a/test_fixtures/source_files/dart2_only/part_of_basic_library.dart b/test_fixtures/test_packages/builder/lib/dart2_only/part_of_basic_library.dart similarity index 100% rename from test_fixtures/source_files/dart2_only/part_of_basic_library.dart rename to test_fixtures/test_packages/builder/lib/dart2_only/part_of_basic_library.dart diff --git a/test_fixtures/source_files/dart2_only/part_of_basic_library.g.dart b/test_fixtures/test_packages/builder/lib/dart2_only/part_of_basic_library.g.dart similarity index 100% rename from test_fixtures/source_files/dart2_only/part_of_basic_library.g.dart rename to test_fixtures/test_packages/builder/lib/dart2_only/part_of_basic_library.g.dart diff --git a/test_fixtures/source_files/dart2_only/part_of_basic_library_2.dart b/test_fixtures/test_packages/builder/lib/dart2_only/part_of_basic_library_2.dart similarity index 100% rename from test_fixtures/source_files/dart2_only/part_of_basic_library_2.dart rename to test_fixtures/test_packages/builder/lib/dart2_only/part_of_basic_library_2.dart diff --git a/test_fixtures/source_files/dart2_only/props_mixin.dart b/test_fixtures/test_packages/builder/lib/dart2_only/props_mixin.dart similarity index 100% rename from test_fixtures/source_files/dart2_only/props_mixin.dart rename to test_fixtures/test_packages/builder/lib/dart2_only/props_mixin.dart diff --git a/test_fixtures/source_files/dart2_only/state_mixin.dart b/test_fixtures/test_packages/builder/lib/dart2_only/state_mixin.dart similarity index 100% rename from test_fixtures/source_files/dart2_only/state_mixin.dart rename to test_fixtures/test_packages/builder/lib/dart2_only/state_mixin.dart diff --git a/test_fixtures/source_files/has_part_directive_missing_gen/no_declarations.dart b/test_fixtures/test_packages/builder/lib/has_part_directive_missing_gen/no_declarations.dart similarity index 100% rename from test_fixtures/source_files/has_part_directive_missing_gen/no_declarations.dart rename to test_fixtures/test_packages/builder/lib/has_part_directive_missing_gen/no_declarations.dart diff --git a/test_fixtures/source_files/has_part_directive_missing_gen/with_declarations.dart b/test_fixtures/test_packages/builder/lib/has_part_directive_missing_gen/with_declarations.dart similarity index 100% rename from test_fixtures/source_files/has_part_directive_missing_gen/with_declarations.dart rename to test_fixtures/test_packages/builder/lib/has_part_directive_missing_gen/with_declarations.dart diff --git a/test_fixtures/source_files/mixin_based/basic.dart b/test_fixtures/test_packages/builder/lib/mixin_based/basic.dart similarity index 100% rename from test_fixtures/source_files/mixin_based/basic.dart rename to test_fixtures/test_packages/builder/lib/mixin_based/basic.dart diff --git a/test_fixtures/source_files/mixin_based/basic_library.dart b/test_fixtures/test_packages/builder/lib/mixin_based/basic_library.dart similarity index 100% rename from test_fixtures/source_files/mixin_based/basic_library.dart rename to test_fixtures/test_packages/builder/lib/mixin_based/basic_library.dart diff --git a/test_fixtures/source_files/mixin_based/basic_two_nine.dart b/test_fixtures/test_packages/builder/lib/mixin_based/basic_two_nine.dart similarity index 100% rename from test_fixtures/source_files/mixin_based/basic_two_nine.dart rename to test_fixtures/test_packages/builder/lib/mixin_based/basic_two_nine.dart diff --git a/test_fixtures/source_files/mixin_based/missing_over_react_g_part/library.dart b/test_fixtures/test_packages/builder/lib/mixin_based/missing_over_react_g_part/library.dart similarity index 100% rename from test_fixtures/source_files/mixin_based/missing_over_react_g_part/library.dart rename to test_fixtures/test_packages/builder/lib/mixin_based/missing_over_react_g_part/library.dart diff --git a/test_fixtures/source_files/mixin_based/missing_over_react_g_part/part.dart b/test_fixtures/test_packages/builder/lib/mixin_based/missing_over_react_g_part/part.dart similarity index 100% rename from test_fixtures/source_files/mixin_based/missing_over_react_g_part/part.dart rename to test_fixtures/test_packages/builder/lib/mixin_based/missing_over_react_g_part/part.dart diff --git a/test_fixtures/source_files/mixin_based/part_of_basic_library.dart b/test_fixtures/test_packages/builder/lib/mixin_based/part_of_basic_library.dart similarity index 100% rename from test_fixtures/source_files/mixin_based/part_of_basic_library.dart rename to test_fixtures/test_packages/builder/lib/mixin_based/part_of_basic_library.dart diff --git a/test_fixtures/source_files/mixin_based/part_of_basic_library_2.dart b/test_fixtures/test_packages/builder/lib/mixin_based/part_of_basic_library_2.dart similarity index 100% rename from test_fixtures/source_files/mixin_based/part_of_basic_library_2.dart rename to test_fixtures/test_packages/builder/lib/mixin_based/part_of_basic_library_2.dart diff --git a/test_fixtures/source_files/mixin_based/props_mixin.dart b/test_fixtures/test_packages/builder/lib/mixin_based/props_mixin.dart similarity index 100% rename from test_fixtures/source_files/mixin_based/props_mixin.dart rename to test_fixtures/test_packages/builder/lib/mixin_based/props_mixin.dart diff --git a/test_fixtures/source_files/mixin_based/state_mixin.dart b/test_fixtures/test_packages/builder/lib/mixin_based/state_mixin.dart similarity index 100% rename from test_fixtures/source_files/mixin_based/state_mixin.dart rename to test_fixtures/test_packages/builder/lib/mixin_based/state_mixin.dart diff --git a/test_fixtures/source_files/mixin_based/two_nine_with_multiple_factories.dart b/test_fixtures/test_packages/builder/lib/mixin_based/two_nine_with_multiple_factories.dart similarity index 100% rename from test_fixtures/source_files/mixin_based/two_nine_with_multiple_factories.dart rename to test_fixtures/test_packages/builder/lib/mixin_based/two_nine_with_multiple_factories.dart diff --git a/test_fixtures/source_files/mixin_based/type_parameters.dart b/test_fixtures/test_packages/builder/lib/mixin_based/type_parameters.dart similarity index 100% rename from test_fixtures/source_files/mixin_based/type_parameters.dart rename to test_fixtures/test_packages/builder/lib/mixin_based/type_parameters.dart diff --git a/test_fixtures/source_files/no_annotations.dart b/test_fixtures/test_packages/builder/lib/no_annotations.dart similarity index 100% rename from test_fixtures/source_files/no_annotations.dart rename to test_fixtures/test_packages/builder/lib/no_annotations.dart diff --git a/test_fixtures/test_packages/builder/pubspec.yaml b/test_fixtures/test_packages/builder/pubspec.yaml new file mode 100644 index 000000000..1e9867114 --- /dev/null +++ b/test_fixtures/test_packages/builder/pubspec.yaml @@ -0,0 +1,9 @@ +name: over_react__test__builder_tests +publish_to: none +environment: + sdk: ">=2.19.0 <4.0.0" +dependencies: + over_react: + path: ../../../ +dev_dependencies: + build_runner: any diff --git a/tool/update_gold_output_files.dart b/tool/update_gold_output_files.dart index 1e15b4d07..7386f278e 100644 --- a/tool/update_gold_output_files.dart +++ b/tool/update_gold_output_files.dart @@ -3,56 +3,43 @@ import 'dart:io'; import 'package:glob/glob.dart'; import 'package:glob/list_local_fs.dart'; import 'package:path/path.dart' as p; +import 'package:yaml/yaml.dart'; -final sourceFixturesDir = Directory('test_fixtures/source_files'); +final sourceFixtureDir = Directory('test_fixtures/test_packages/builder'); final goldsDir = Directory('test_fixtures/gold_output_files'); -/// A temporary directory used to generate new golds. -final tmpSourceDir = Directory('test/tmp_test_files'); - -/// Updates gold files in [goldsDir] by re-generating them from a copy of the files in [sourceFixturesDir]. +/// Updates gold files in [goldsDir] by re-generating them from a copy of the files in [sourceFixtureDir]. Future main() async { - print('Copying files from ${sourceFixturesDir.path} to temporary directory ${tmpSourceDir.path}'); - if (tmpSourceDir.existsSync()) tmpSourceDir.deleteSync(recursive: true); - tmpSourceDir.createSync(recursive: true); - for (final file in Glob(p.join(sourceFixturesDir.path, '**')).listSync().whereType()) { - final newPath = p.join(tmpSourceDir.path, p.relative(file.path, from: sourceFixturesDir.path)); - File(newPath).parent.createSync(recursive: true); - file.copySync(newPath); - } + final sourceFixturePubspec = + loadYaml(File(p.join(sourceFixtureDir.path, 'pubspec.yaml')).readAsStringSync()); + final sourceFixturePackageName = sourceFixturePubspec['name'] as String; - print('Building files in temporary directory ${tmpSourceDir.path}'); - final buildProcess = await Process.start( - 'dart', ['run', 'build_runner', 'build', '--build-filter=${p.join(tmpSourceDir.path, '**')}'], - mode: ProcessStartMode.inheritStdio); + print('Building files in test fixture ${goldsDir.path}'); + + print('Building files in ${sourceFixtureDir.path} to .dart_tool...'); + final buildProcess = await Process.start('dart', ['run', 'build_runner', 'build'], + workingDirectory: sourceFixtureDir.path, mode: ProcessStartMode.inheritStdio); // Wait for build to complete. final buildExitCode = await buildProcess.exitCode; if (buildExitCode != 0) { stderr.writeln( - '^ Build failures are expected for "missing_over_react_g_part" files, and can be ignored.'); + '\n^ Build failures are expected for "missing_over_react_g_part" files, and can be ignored.\n'); } print('Copying built files to golds directory ${goldsDir.path}'); - final generatedTmpFiles = - Glob(p.join(tmpSourceDir.path, '**.over_react.g.dart')).listSync().whereType().toList(); - if (generatedTmpFiles.isEmpty) { - throw Exception('No generated files were found in ${tmpSourceDir.path}.' - ' Ensure in build.yaml the over_react builder runs on directory with build_to:source'); + final outputPath = p.join( + sourceFixtureDir.path, '.dart_tool', 'build', 'generated', sourceFixturePackageName, 'lib'); + late final generatedTmpFiles = + Glob(p.join(outputPath, '**.over_react.g.dart')).listSync().whereType().toList(); + if (!Directory(outputPath).existsSync() || generatedTmpFiles.isEmpty) { + throw Exception( + 'No generated files were found in $outputPath; something is probably wrong with the paths in this script.'); } for (final file in generatedTmpFiles) { - final newPath = - p.join(goldsDir.path, p.relative(file.path, from: tmpSourceDir.path)) + '.goldFile'; + final newPath = p.join(goldsDir.path, p.relative(file.path, from: outputPath)) + '.goldFile'; File(newPath).parent.createSync(recursive: true); file.copySync(newPath); } - print('Cleaning up temporary directory ${tmpSourceDir.path}'); - tmpSourceDir.deleteSync(recursive: true); - print('Done!'); - - print('\nIf non-gold generated files throughout this package got deleted' - ' (which usually only happens after it prompts you about conflicting outputs),' - ' you can restore them by running a build:\n\n' - ' dart run build_runner build'); } From 84000e25f0d1d5f31e5442075d8e5938217c5752 Mon Sep 17 00:00:00 2001 From: Greg Littlefield Date: Tue, 10 Feb 2026 17:20:31 -0700 Subject: [PATCH 3/3] Update gold files --- .../backwards_compatible/basic.over_react.g.dart.goldFile | 2 ++ .../basic_library.over_react.g.dart.goldFile | 2 ++ .../backwards_compatible/props_mixin.over_react.g.dart.goldFile | 2 ++ .../backwards_compatible/state_mixin.over_react.g.dart.goldFile | 2 ++ .../dart2_only/basic.over_react.g.dart.goldFile | 2 ++ .../dart2_only/basic_library.over_react.g.dart.goldFile | 2 ++ .../dart2_only/component2/basic.over_react.g.dart.goldFile | 2 ++ .../component2/basic_library.over_react.g.dart.goldFile | 2 ++ .../library.over_react.g.dart.goldFile | 2 ++ .../dart2_only/props_mixin.over_react.g.dart.goldFile | 2 ++ .../dart2_only/state_mixin.over_react.g.dart.goldFile | 2 ++ .../mixin_based/basic.over_react.g.dart.goldFile | 2 ++ .../mixin_based/basic_library.over_react.g.dart.goldFile | 2 ++ .../mixin_based/basic_two_nine.over_react.g.dart.goldFile | 2 ++ .../library.over_react.g.dart.goldFile | 2 ++ .../mixin_based/props_mixin.over_react.g.dart.goldFile | 2 ++ .../mixin_based/state_mixin.over_react.g.dart.goldFile | 2 ++ .../two_nine_with_multiple_factories.over_react.g.dart.goldfile | 2 ++ .../mixin_based/type_parameters.over_react.g.dart.goldFile | 2 ++ 19 files changed, 38 insertions(+) diff --git a/test_fixtures/gold_output_files/backwards_compatible/basic.over_react.g.dart.goldFile b/test_fixtures/gold_output_files/backwards_compatible/basic.over_react.g.dart.goldFile index c9dad6aeb..55e7ae951 100644 --- a/test_fixtures/gold_output_files/backwards_compatible/basic.over_react.g.dart.goldFile +++ b/test_fixtures/gold_output_files/backwards_compatible/basic.over_react.g.dart.goldFile @@ -6,6 +6,8 @@ part of 'basic.dart'; // ************************************************************************** // OverReactBuilder (package:over_react/src/builder.dart) +// +// Using nullSafety: false. {languageVersion: 2.11, source: libraryVersionComment} // ************************************************************************** // React component factory implementation. diff --git a/test_fixtures/gold_output_files/backwards_compatible/basic_library.over_react.g.dart.goldFile b/test_fixtures/gold_output_files/backwards_compatible/basic_library.over_react.g.dart.goldFile index 0604d488c..a9e9ba62a 100644 --- a/test_fixtures/gold_output_files/backwards_compatible/basic_library.over_react.g.dart.goldFile +++ b/test_fixtures/gold_output_files/backwards_compatible/basic_library.over_react.g.dart.goldFile @@ -6,6 +6,8 @@ part of 'basic_library.dart'; // ************************************************************************** // OverReactBuilder (package:over_react/src/builder.dart) +// +// Using nullSafety: false. {languageVersion: 2.11, source: libraryVersionComment} // ************************************************************************** // React component factory implementation. diff --git a/test_fixtures/gold_output_files/backwards_compatible/props_mixin.over_react.g.dart.goldFile b/test_fixtures/gold_output_files/backwards_compatible/props_mixin.over_react.g.dart.goldFile index fb38d2d70..ebc38bc05 100644 --- a/test_fixtures/gold_output_files/backwards_compatible/props_mixin.over_react.g.dart.goldFile +++ b/test_fixtures/gold_output_files/backwards_compatible/props_mixin.over_react.g.dart.goldFile @@ -6,6 +6,8 @@ part of 'props_mixin.dart'; // ************************************************************************** // OverReactBuilder (package:over_react/src/builder.dart) +// +// Using nullSafety: false. {languageVersion: 2.11, source: libraryVersionComment} // ************************************************************************** mixin $ExamplePropsMixinClass implements ExamplePropsMixinClass { diff --git a/test_fixtures/gold_output_files/backwards_compatible/state_mixin.over_react.g.dart.goldFile b/test_fixtures/gold_output_files/backwards_compatible/state_mixin.over_react.g.dart.goldFile index 50441b831..694b687b8 100644 --- a/test_fixtures/gold_output_files/backwards_compatible/state_mixin.over_react.g.dart.goldFile +++ b/test_fixtures/gold_output_files/backwards_compatible/state_mixin.over_react.g.dart.goldFile @@ -6,6 +6,8 @@ part of 'state_mixin.dart'; // ************************************************************************** // OverReactBuilder (package:over_react/src/builder.dart) +// +// Using nullSafety: false. {languageVersion: 2.11, source: libraryVersionComment} // ************************************************************************** mixin $ExampleStateMixinClass implements ExampleStateMixinClass { diff --git a/test_fixtures/gold_output_files/dart2_only/basic.over_react.g.dart.goldFile b/test_fixtures/gold_output_files/dart2_only/basic.over_react.g.dart.goldFile index 23cc8811c..e0ffcf49d 100644 --- a/test_fixtures/gold_output_files/dart2_only/basic.over_react.g.dart.goldFile +++ b/test_fixtures/gold_output_files/dart2_only/basic.over_react.g.dart.goldFile @@ -6,6 +6,8 @@ part of 'basic.dart'; // ************************************************************************** // OverReactBuilder (package:over_react/src/builder.dart) +// +// Using nullSafety: false. {languageVersion: 2.11, source: libraryVersionComment} // ************************************************************************** // React component factory implementation. diff --git a/test_fixtures/gold_output_files/dart2_only/basic_library.over_react.g.dart.goldFile b/test_fixtures/gold_output_files/dart2_only/basic_library.over_react.g.dart.goldFile index 1241e104c..7091f3ed6 100644 --- a/test_fixtures/gold_output_files/dart2_only/basic_library.over_react.g.dart.goldFile +++ b/test_fixtures/gold_output_files/dart2_only/basic_library.over_react.g.dart.goldFile @@ -6,6 +6,8 @@ part of 'basic_library.dart'; // ************************************************************************** // OverReactBuilder (package:over_react/src/builder.dart) +// +// Using nullSafety: false. {languageVersion: 2.11, source: libraryVersionComment} // ************************************************************************** // React component factory implementation. diff --git a/test_fixtures/gold_output_files/dart2_only/component2/basic.over_react.g.dart.goldFile b/test_fixtures/gold_output_files/dart2_only/component2/basic.over_react.g.dart.goldFile index 33eacf32d..bc240ca45 100644 --- a/test_fixtures/gold_output_files/dart2_only/component2/basic.over_react.g.dart.goldFile +++ b/test_fixtures/gold_output_files/dart2_only/component2/basic.over_react.g.dart.goldFile @@ -6,6 +6,8 @@ part of 'basic.dart'; // ************************************************************************** // OverReactBuilder (package:over_react/src/builder.dart) +// +// Using nullSafety: false. {languageVersion: 2.11, source: libraryVersionComment} // ************************************************************************** // React component factory implementation. diff --git a/test_fixtures/gold_output_files/dart2_only/component2/basic_library.over_react.g.dart.goldFile b/test_fixtures/gold_output_files/dart2_only/component2/basic_library.over_react.g.dart.goldFile index 133328db7..9d85fb827 100644 --- a/test_fixtures/gold_output_files/dart2_only/component2/basic_library.over_react.g.dart.goldFile +++ b/test_fixtures/gold_output_files/dart2_only/component2/basic_library.over_react.g.dart.goldFile @@ -6,6 +6,8 @@ part of 'basic_library.dart'; // ************************************************************************** // OverReactBuilder (package:over_react/src/builder.dart) +// +// Using nullSafety: false. {languageVersion: 2.11, source: libraryVersionComment} // ************************************************************************** // React component factory implementation. diff --git a/test_fixtures/gold_output_files/dart2_only/missing_over_react_g_part/library.over_react.g.dart.goldFile b/test_fixtures/gold_output_files/dart2_only/missing_over_react_g_part/library.over_react.g.dart.goldFile index c5a5cfaab..80b499df2 100644 --- a/test_fixtures/gold_output_files/dart2_only/missing_over_react_g_part/library.over_react.g.dart.goldFile +++ b/test_fixtures/gold_output_files/dart2_only/missing_over_react_g_part/library.over_react.g.dart.goldFile @@ -6,6 +6,8 @@ part of 'library.dart'; // ************************************************************************** // OverReactBuilder (package:over_react/src/builder.dart) +// +// Using nullSafety: false. {languageVersion: 2.11, source: libraryVersionComment} // ************************************************************************** // React component factory implementation. diff --git a/test_fixtures/gold_output_files/dart2_only/props_mixin.over_react.g.dart.goldFile b/test_fixtures/gold_output_files/dart2_only/props_mixin.over_react.g.dart.goldFile index fcbc1480f..699e1b137 100644 --- a/test_fixtures/gold_output_files/dart2_only/props_mixin.over_react.g.dart.goldFile +++ b/test_fixtures/gold_output_files/dart2_only/props_mixin.over_react.g.dart.goldFile @@ -6,6 +6,8 @@ part of 'props_mixin.dart'; // ************************************************************************** // OverReactBuilder (package:over_react/src/builder.dart) +// +// Using nullSafety: false. {languageVersion: 2.11, source: libraryVersionComment} // ************************************************************************** @deprecated diff --git a/test_fixtures/gold_output_files/dart2_only/state_mixin.over_react.g.dart.goldFile b/test_fixtures/gold_output_files/dart2_only/state_mixin.over_react.g.dart.goldFile index 9b9ae55ba..654217512 100644 --- a/test_fixtures/gold_output_files/dart2_only/state_mixin.over_react.g.dart.goldFile +++ b/test_fixtures/gold_output_files/dart2_only/state_mixin.over_react.g.dart.goldFile @@ -6,6 +6,8 @@ part of 'state_mixin.dart'; // ************************************************************************** // OverReactBuilder (package:over_react/src/builder.dart) +// +// Using nullSafety: false. {languageVersion: 2.11, source: libraryVersionComment} // ************************************************************************** @deprecated diff --git a/test_fixtures/gold_output_files/mixin_based/basic.over_react.g.dart.goldFile b/test_fixtures/gold_output_files/mixin_based/basic.over_react.g.dart.goldFile index 60832ea4d..c3bb17214 100644 --- a/test_fixtures/gold_output_files/mixin_based/basic.over_react.g.dart.goldFile +++ b/test_fixtures/gold_output_files/mixin_based/basic.over_react.g.dart.goldFile @@ -6,6 +6,8 @@ part of 'basic.dart'; // ************************************************************************** // OverReactBuilder (package:over_react/src/builder.dart) +// +// Using nullSafety: false. {languageVersion: 2.11, source: libraryVersionComment} // ************************************************************************** // React component factory implementation. diff --git a/test_fixtures/gold_output_files/mixin_based/basic_library.over_react.g.dart.goldFile b/test_fixtures/gold_output_files/mixin_based/basic_library.over_react.g.dart.goldFile index ee8e5dbb1..0f2a0c1d5 100644 --- a/test_fixtures/gold_output_files/mixin_based/basic_library.over_react.g.dart.goldFile +++ b/test_fixtures/gold_output_files/mixin_based/basic_library.over_react.g.dart.goldFile @@ -6,6 +6,8 @@ part of 'basic_library.dart'; // ************************************************************************** // OverReactBuilder (package:over_react/src/builder.dart) +// +// Using nullSafety: false. {languageVersion: 2.11, source: libraryVersionComment} // ************************************************************************** // React component factory implementation. diff --git a/test_fixtures/gold_output_files/mixin_based/basic_two_nine.over_react.g.dart.goldFile b/test_fixtures/gold_output_files/mixin_based/basic_two_nine.over_react.g.dart.goldFile index 7d886e85d..e2544b8c6 100644 --- a/test_fixtures/gold_output_files/mixin_based/basic_two_nine.over_react.g.dart.goldFile +++ b/test_fixtures/gold_output_files/mixin_based/basic_two_nine.over_react.g.dart.goldFile @@ -6,6 +6,8 @@ part of 'basic_two_nine.dart'; // ************************************************************************** // OverReactBuilder (package:over_react/src/builder.dart) +// +// Using nullSafety: false. {languageVersion: 2.11, source: libraryVersionComment} // ************************************************************************** // React component factory implementation. diff --git a/test_fixtures/gold_output_files/mixin_based/missing_over_react_g_part/library.over_react.g.dart.goldFile b/test_fixtures/gold_output_files/mixin_based/missing_over_react_g_part/library.over_react.g.dart.goldFile index c5a17450f..427f3bb1d 100644 --- a/test_fixtures/gold_output_files/mixin_based/missing_over_react_g_part/library.over_react.g.dart.goldFile +++ b/test_fixtures/gold_output_files/mixin_based/missing_over_react_g_part/library.over_react.g.dart.goldFile @@ -6,6 +6,8 @@ part of 'library.dart'; // ************************************************************************** // OverReactBuilder (package:over_react/src/builder.dart) +// +// Using nullSafety: false. {languageVersion: 2.11, source: libraryVersionComment} // ************************************************************************** // React component factory implementation. diff --git a/test_fixtures/gold_output_files/mixin_based/props_mixin.over_react.g.dart.goldFile b/test_fixtures/gold_output_files/mixin_based/props_mixin.over_react.g.dart.goldFile index ebfd5ee4f..227063fcd 100644 --- a/test_fixtures/gold_output_files/mixin_based/props_mixin.over_react.g.dart.goldFile +++ b/test_fixtures/gold_output_files/mixin_based/props_mixin.over_react.g.dart.goldFile @@ -6,6 +6,8 @@ part of 'props_mixin.dart'; // ************************************************************************** // OverReactBuilder (package:over_react/src/builder.dart) +// +// Using nullSafety: false. {languageVersion: 2.11, source: libraryVersionComment} // ************************************************************************** @Deprecated('This API is for use only within generated code.' diff --git a/test_fixtures/gold_output_files/mixin_based/state_mixin.over_react.g.dart.goldFile b/test_fixtures/gold_output_files/mixin_based/state_mixin.over_react.g.dart.goldFile index 205f3a9b7..9adca711a 100644 --- a/test_fixtures/gold_output_files/mixin_based/state_mixin.over_react.g.dart.goldFile +++ b/test_fixtures/gold_output_files/mixin_based/state_mixin.over_react.g.dart.goldFile @@ -6,6 +6,8 @@ part of 'state_mixin.dart'; // ************************************************************************** // OverReactBuilder (package:over_react/src/builder.dart) +// +// Using nullSafety: false. {languageVersion: 2.11, source: libraryVersionComment} // ************************************************************************** @Deprecated('This API is for use only within generated code.' diff --git a/test_fixtures/gold_output_files/mixin_based/two_nine_with_multiple_factories.over_react.g.dart.goldfile b/test_fixtures/gold_output_files/mixin_based/two_nine_with_multiple_factories.over_react.g.dart.goldfile index 2a7de8bf5..7998b508f 100644 --- a/test_fixtures/gold_output_files/mixin_based/two_nine_with_multiple_factories.over_react.g.dart.goldfile +++ b/test_fixtures/gold_output_files/mixin_based/two_nine_with_multiple_factories.over_react.g.dart.goldfile @@ -6,6 +6,8 @@ part of 'two_nine_with_multiple_factories.dart'; // ************************************************************************** // OverReactBuilder (package:over_react/src/builder.dart) +// +// Using nullSafety: false. {languageVersion: 2.11, source: libraryVersionComment} // ************************************************************************** // React component factory implementation. diff --git a/test_fixtures/gold_output_files/mixin_based/type_parameters.over_react.g.dart.goldFile b/test_fixtures/gold_output_files/mixin_based/type_parameters.over_react.g.dart.goldFile index 54b22a581..07ffd9eba 100644 --- a/test_fixtures/gold_output_files/mixin_based/type_parameters.over_react.g.dart.goldFile +++ b/test_fixtures/gold_output_files/mixin_based/type_parameters.over_react.g.dart.goldFile @@ -6,6 +6,8 @@ part of 'type_parameters.dart'; // ************************************************************************** // OverReactBuilder (package:over_react/src/builder.dart) +// +// Using nullSafety: false. {languageVersion: 2.11, source: libraryVersionComment} // ************************************************************************** @Deprecated('This API is for use only within generated code.'