From 8fa6176060881ddc36876e9eb69df71fc56572c3 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 29 Dec 2025 03:19:37 +0000 Subject: [PATCH 1/3] Initial plan From d8b6cff6375c0e984c72dc70a4cf3ac2196148ea Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 29 Dec 2025 03:24:37 +0000 Subject: [PATCH 2/3] Add comprehensive test coverage for Rive integration version resolution Co-authored-by: AlexV525 <15884415+AlexV525@users.noreply.github.com> --- .../test/assets_gen_integrations_test.dart | 172 ++++++++++++++++++ 1 file changed, 172 insertions(+) diff --git a/packages/core/test/assets_gen_integrations_test.dart b/packages/core/test/assets_gen_integrations_test.dart index 50deec8c..aee7f8fd 100644 --- a/packages/core/test/assets_gen_integrations_test.dart +++ b/packages/core/test/assets_gen_integrations_test.dart @@ -3,6 +3,7 @@ import 'package:flutter_gen_core/generators/integrations/lottie_integration.dart import 'package:flutter_gen_core/generators/integrations/rive_integration.dart'; import 'package:flutter_gen_core/generators/integrations/svg_integration.dart'; import 'package:path/path.dart' as p; +import 'package:pub_semver/pub_semver.dart'; import 'package:test/test.dart'; import 'gen_test_helper.dart'; @@ -241,6 +242,177 @@ void main() { ); }); + test('RiveIntegration version resolution with resolvedVersion', () { + // Test with version < 0.14.0 (should return RiveIntegrationClassic) + final classicIntegration = RiveIntegration( + '', + resolvedVersion: Version(0, 13, 0), + ); + expect(classicIntegration, isA()); + expect(classicIntegration.classOutput.contains('rive({'), isTrue); + expect( + classicIntegration.classOutput.contains('RiveAnimation.asset'), + isTrue, + ); + expect( + classicIntegration.classOutput.contains('riveFileLoader'), + isFalse, + ); + + // Test with version >= 0.14.0 (should return RiveIntegration0140) + final latestIntegration = RiveIntegration( + '', + resolvedVersion: Version(0, 14, 0), + ); + expect(latestIntegration, isA()); + expect(latestIntegration.classOutput.contains('riveFileLoader({'), isTrue); + expect( + latestIntegration.classOutput.contains('FileLoader.fromAsset'), + isTrue, + ); + expect(latestIntegration.classOutput.contains('rive({'), isFalse); + + // Test with version > 0.14.0 + final newerIntegration = RiveIntegration( + '', + resolvedVersion: Version(0, 15, 0), + ); + expect(newerIntegration, isA()); + expect( + newerIntegration.classOutput.contains('riveFileLoader({'), + isTrue, + ); + }); + + test('RiveIntegration version resolution with resolvedVersionConstraint', + () { + // Test with constraint that allows 0.14.0 (should return RiveIntegration0140) + final allowsLatest = RiveIntegration( + '', + resolvedVersionConstraint: VersionConstraint.parse('^0.14.0'), + ); + expect(allowsLatest, isA()); + expect(allowsLatest.classOutput.contains('riveFileLoader({'), isTrue); + + // Test with constraint that doesn't allow 0.14.0 (should return RiveIntegrationClassic) + final classicOnly = RiveIntegration( + '', + resolvedVersionConstraint: VersionConstraint.parse('>=0.13.0 <0.14.0'), + ); + expect(classicOnly, isA()); + expect(classicOnly.classOutput.contains('rive({'), isTrue); + + // Test with constraint like ^0.12.0 (doesn't allow 0.14.0) + final olderConstraint = RiveIntegration( + '', + resolvedVersionConstraint: VersionConstraint.parse('^0.12.0'), + ); + expect(olderConstraint, isA()); + expect(olderConstraint.classOutput.contains('rive({'), isTrue); + }); + + test('RiveIntegration version resolution priority', () { + // resolvedVersion should take priority over resolvedVersionConstraint + final integration = RiveIntegration( + '', + resolvedVersion: Version(0, 13, 0), + resolvedVersionConstraint: VersionConstraint.parse('^0.14.0'), + ); + expect(integration, isA()); + expect(integration.classOutput.contains('rive({'), isTrue); + + // When resolvedVersion is null, fall back to resolvedVersionConstraint + final fallbackIntegration = RiveIntegration( + '', + resolvedVersionConstraint: VersionConstraint.parse('^0.14.0'), + ); + expect(fallbackIntegration, isA()); + expect(fallbackIntegration.classOutput.contains('riveFileLoader({'), isTrue); + }); + + test('RiveIntegration fallback behavior', () { + // Test with no version information (should return RiveIntegration0140 as fallback) + final fallbackIntegration = RiveIntegration(''); + expect(fallbackIntegration, isA()); + expect(fallbackIntegration.classOutput.contains('riveFileLoader({'), isTrue); + }); + + test('RiveIntegrationClassic classOutput structure', () { + final integration = RiveIntegrationClassic(''); + final output = integration.classOutput; + + // Check for Classic-specific content + expect(output.contains('class RiveGenImage {'), isTrue); + expect(output.contains('final String _assetName;'), isTrue); + expect(output.contains('final Set flavors;'), isTrue); + expect(output.contains('rive({'), isTrue); + expect(output.contains('_rive.RiveAnimation rive({'), isTrue); + expect(output.contains('_rive.RiveAnimation.asset'), isTrue); + expect(output.contains('artboard:'), isTrue); + expect(output.contains('animations:'), isTrue); + expect(output.contains('stateMachines:'), isTrue); + expect(output.contains('String get path =>'), isTrue); + expect(output.contains('String get keyName =>'), isTrue); + + // Ensure it doesn't have 0.14.0+ specific content + expect(output.contains('riveFileLoader'), isFalse); + expect(output.contains('FileLoader.fromAsset'), isFalse); + }); + + test('RiveIntegrationClassic classOutput with package', () { + final integration = RiveIntegrationClassic('test_package'); + final output = integration.classOutput; + + // Check for package-specific content + expect( + output.contains("static const String package = 'test_package';"), + isTrue, + ); + expect( + output.contains("'packages/test_package/\$_assetName'"), + isTrue, + ); + }); + + test('RiveIntegration0140 classOutput structure', () { + final integration = RiveIntegration0140(''); + final output = integration.classOutput; + + // Check for 0.14.0+ specific content + expect(output.contains('class RiveGenImage {'), isTrue); + expect(output.contains('final String _assetName;'), isTrue); + expect(output.contains('final Set flavors;'), isTrue); + expect(output.contains('riveFileLoader({'), isTrue); + expect(output.contains('_rive.FileLoader riveFileLoader({'), isTrue); + expect(output.contains('_rive.FileLoader.fromAsset'), isTrue); + expect(output.contains('_rive.Factory? factory,'), isTrue); + expect(output.contains('riveFactory: factory ?? _rive.Factory.rive'), isTrue); + expect(output.contains('String get path =>'), isTrue); + expect(output.contains('String get keyName =>'), isTrue); + + // Ensure it doesn't have Classic-specific content + expect(output.contains('rive({'), isFalse); + expect(output.contains('RiveAnimation.asset'), isFalse); + expect(output.contains('artboard:'), isFalse); + expect(output.contains('animations:'), isFalse); + expect(output.contains('stateMachines:'), isFalse); + }); + + test('RiveIntegration0140 classOutput with package', () { + final integration = RiveIntegration0140('test_package'); + final output = integration.classOutput; + + // Check for package-specific content + expect( + output.contains("static const String package = 'test_package';"), + isTrue, + ); + expect( + output.contains("'packages/test_package/\$_assetName'"), + isTrue, + ); + }); + test('Assets with Lottie integrations on pubspec.yaml', () async { const pubspec = 'test_resources/pubspec_assets_lottie_integrations.yaml'; await expectedAssetsGen(pubspec); From 8b5d70bf4cb3022971663547a59705095e125456 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 29 Dec 2025 03:26:10 +0000 Subject: [PATCH 3/3] Optimize test code per review feedback Co-authored-by: AlexV525 <15884415+AlexV525@users.noreply.github.com> --- .../test/assets_gen_integrations_test.dart | 32 +++++++------------ 1 file changed, 11 insertions(+), 21 deletions(-) diff --git a/packages/core/test/assets_gen_integrations_test.dart b/packages/core/test/assets_gen_integrations_test.dart index aee7f8fd..dd397d7e 100644 --- a/packages/core/test/assets_gen_integrations_test.dart +++ b/packages/core/test/assets_gen_integrations_test.dart @@ -249,15 +249,10 @@ void main() { resolvedVersion: Version(0, 13, 0), ); expect(classicIntegration, isA()); - expect(classicIntegration.classOutput.contains('rive({'), isTrue); - expect( - classicIntegration.classOutput.contains('RiveAnimation.asset'), - isTrue, - ); - expect( - classicIntegration.classOutput.contains('riveFileLoader'), - isFalse, - ); + final classicOutput = classicIntegration.classOutput; + expect(classicOutput.contains('rive({'), isTrue); + expect(classicOutput.contains('RiveAnimation.asset'), isTrue); + expect(classicOutput.contains('riveFileLoader'), isFalse); // Test with version >= 0.14.0 (should return RiveIntegration0140) final latestIntegration = RiveIntegration( @@ -265,12 +260,10 @@ void main() { resolvedVersion: Version(0, 14, 0), ); expect(latestIntegration, isA()); - expect(latestIntegration.classOutput.contains('riveFileLoader({'), isTrue); - expect( - latestIntegration.classOutput.contains('FileLoader.fromAsset'), - isTrue, - ); - expect(latestIntegration.classOutput.contains('rive({'), isFalse); + final latestOutput = latestIntegration.classOutput; + expect(latestOutput.contains('riveFileLoader({'), isTrue); + expect(latestOutput.contains('FileLoader.fromAsset'), isTrue); + expect(latestOutput.contains('rive({'), isFalse); // Test with version > 0.14.0 final newerIntegration = RiveIntegration( @@ -278,14 +271,11 @@ void main() { resolvedVersion: Version(0, 15, 0), ); expect(newerIntegration, isA()); - expect( - newerIntegration.classOutput.contains('riveFileLoader({'), - isTrue, - ); + final newerOutput = newerIntegration.classOutput; + expect(newerOutput.contains('riveFileLoader({'), isTrue); }); - test('RiveIntegration version resolution with resolvedVersionConstraint', - () { + test('RiveIntegration version constraint resolution', () { // Test with constraint that allows 0.14.0 (should return RiveIntegration0140) final allowsLatest = RiveIntegration( '',