diff --git a/packages/package_info_plus/package_info_plus/lib/package_info_plus.dart b/packages/package_info_plus/package_info_plus/lib/package_info_plus.dart index a70c1e98ff..8b0ebd3fbd 100644 --- a/packages/package_info_plus/package_info_plus/lib/package_info_plus.dart +++ b/packages/package_info_plus/package_info_plus/lib/package_info_plus.dart @@ -89,4 +89,32 @@ class PackageInfo { installerStore: installerStore, ); } + + /// Overwrite equals for value equality + @override + bool operator ==(Object other) => + identical(this, other) || + other is PackageInfo && + runtimeType == other.runtimeType && + appName == other.appName && + packageName == other.packageName && + version == other.version && + buildNumber == other.buildNumber && + buildSignature == other.buildSignature && + installerStore == other.installerStore; + + /// Overwrite hashCode for value equality + @override + int get hashCode => + appName.hashCode ^ + packageName.hashCode ^ + version.hashCode ^ + buildNumber.hashCode ^ + buildSignature.hashCode ^ + installerStore.hashCode; + + @override + String toString() { + return 'PackageInfo(appName: $appName, buildNumber: $buildNumber, packageName: $packageName, version: $version, buildSignature: $buildSignature, installerStore: $installerStore)'; + } } diff --git a/packages/package_info_plus/package_info_plus/test/package_info_test.dart b/packages/package_info_plus/package_info_plus/test/package_info_test.dart index 9b94fb9e13..32e8e27664 100644 --- a/packages/package_info_plus/package_info_plus/test/package_info_test.dart +++ b/packages/package_info_plus/package_info_plus/test/package_info_test.dart @@ -68,4 +68,54 @@ void main() { expect(info.buildSignature, 'deadbeef'); expect(info.installerStore, null); }); + + test('equals checks for value equality', () async { + final info1 = PackageInfo( + appName: 'package_info_example', + buildNumber: '1', + packageName: 'io.flutter.plugins.packageinfoexample', + version: '1.0', + buildSignature: '', + installerStore: null); + final info2 = PackageInfo( + appName: 'package_info_example', + buildNumber: '1', + packageName: 'io.flutter.plugins.packageinfoexample', + version: '1.0', + buildSignature: '', + installerStore: null); + expect(info1, info2); + }); + + test('hashCode checks for value equality', () async { + final info1 = PackageInfo( + appName: 'package_info_example', + buildNumber: '1', + packageName: 'io.flutter.plugins.packageinfoexample', + version: '1.0', + buildSignature: '', + installerStore: null); + final info2 = PackageInfo( + appName: 'package_info_example', + buildNumber: '1', + packageName: 'io.flutter.plugins.packageinfoexample', + version: '1.0', + buildSignature: '', + installerStore: null); + expect(info1.hashCode, info2.hashCode); + }); + + test('toString returns a string representation', () async { + final info = PackageInfo( + appName: 'package_info_example', + buildNumber: '1', + packageName: 'io.flutter.plugins.packageinfoexample', + version: '1.0', + buildSignature: '', + installerStore: null); + expect( + info.toString(), + 'PackageInfo(appName: package_info_example, buildNumber: 1, packageName: io.flutter.plugins.packageinfoexample, version: 1.0, buildSignature: , installerStore: null)', + ); + }); }