From 2fa5c40c61e3349476e674a56c337c96068a13dd Mon Sep 17 00:00:00 2001 From: sarbagyastha Date: Tue, 27 Dec 2022 10:31:29 +0545 Subject: [PATCH 1/5] :arrow_up: bumped dependencies --- packages/clean_framework/pubspec.yaml | 6 +++--- packages/clean_framework_firestore/pubspec.yaml | 2 +- packages/clean_framework_test/pubspec.yaml | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/clean_framework/pubspec.yaml b/packages/clean_framework/pubspec.yaml index a3d9308f..d091ea78 100644 --- a/packages/clean_framework/pubspec.yaml +++ b/packages/clean_framework/pubspec.yaml @@ -9,13 +9,13 @@ environment: flutter: '>=3.0.0' dependencies: - either_dart: ^0.2.0 + either_dart: ^0.3.0 equatable: ^2.0.5 flutter: sdk: flutter - flutter_riverpod: ^2.1.0 + flutter_riverpod: ^2.1.3 meta: '>=1.8.0 <1.9.0' - riverpod: ^2.1.1 + riverpod: ^2.1.3 dev_dependencies: clean_framework_test: ^0.1.0 diff --git a/packages/clean_framework_firestore/pubspec.yaml b/packages/clean_framework_firestore/pubspec.yaml index 5d9551c1..8322b26e 100644 --- a/packages/clean_framework_firestore/pubspec.yaml +++ b/packages/clean_framework_firestore/pubspec.yaml @@ -10,7 +10,7 @@ environment: dependencies: clean_framework: ^2.0.0-dev.0 - cloud_firestore: ^4.0.3 + cloud_firestore: ^4.3.0 equatable: ^2.0.5 flutter: sdk: flutter diff --git a/packages/clean_framework_test/pubspec.yaml b/packages/clean_framework_test/pubspec.yaml index 31e17891..b3381453 100644 --- a/packages/clean_framework_test/pubspec.yaml +++ b/packages/clean_framework_test/pubspec.yaml @@ -11,10 +11,10 @@ environment: dependencies: clean_framework: ^2.0.0-dev.0 clean_framework_router: ^0.2.0-dev.0 - either_dart: ^0.2.0 + either_dart: ^0.3.0 flutter: sdk: flutter - flutter_riverpod: ^2.1.0 + flutter_riverpod: ^2.1.3 flutter_test: sdk: flutter meta: '>=1.8.0 <1.9.0' From f598c19fa9bc8ab81f420c4ef5f0d094003c5f0f Mon Sep 17 00:00:00 2001 From: sarbagyastha Date: Tue, 27 Dec 2022 12:43:53 +0545 Subject: [PATCH 2/5] :heavy_minus_sign: removed `either_dart` and used own solution instead --- .../country_gateway_test.dart | 2 +- .../country/presentation/country_ui_test.dart | 2 +- .../domain/last_login_usecase_test.dart | 6 +- .../last_login_date_gateway_test.dart | 8 +- .../domain/random_cat_use_case_test.dart | 4 +- .../clean_framework/lib/clean_framework.dart | 2 +- .../lib/src/providers/external_interface.dart | 6 +- .../lib/src/providers/gateway.dart | 8 +- .../helpers/request_subscription_map.dart | 4 +- .../lib/src/utilities/either.dart | 98 +++++++++++++++++++ packages/clean_framework/pubspec.yaml | 1 - .../providers/gateway_integration_test.dart | 13 +-- .../test/providers/gateway_unit_test.dart | 11 +-- .../test/providers/use_case_unit_test.dart | 8 +- .../test/firebase_gateway_test.dart | 6 +- .../test/firebase_watcher_gateway_test.dart | 6 +- .../test/graphql_gateway_test.dart | 4 +- .../test/rest_gateway_test.dart | 8 +- .../lib/src/use_case_fake.dart | 2 +- packages/clean_framework_test/pubspec.yaml | 1 - 20 files changed, 144 insertions(+), 56 deletions(-) create mode 100644 packages/clean_framework/lib/src/utilities/either.dart diff --git a/packages/clean_framework/example/test/features/country/external_interface/country_gateway_test.dart b/packages/clean_framework/example/test/features/country/external_interface/country_gateway_test.dart index 525d4149..029b56c5 100644 --- a/packages/clean_framework/example/test/features/country/external_interface/country_gateway_test.dart +++ b/packages/clean_framework/example/test/features/country/external_interface/country_gateway_test.dart @@ -16,7 +16,7 @@ void main() { final gateway = countryGatewayProvider.getGateway(providersContext); gateway.transport = (request) async { - return Right( + return Either.right( GraphQLSuccessResponse( data: { 'countries': [ diff --git a/packages/clean_framework/example/test/features/country/presentation/country_ui_test.dart b/packages/clean_framework/example/test/features/country/presentation/country_ui_test.dart index 0211ee82..626e777d 100644 --- a/packages/clean_framework/example/test/features/country/presentation/country_ui_test.dart +++ b/packages/clean_framework/example/test/features/country/presentation/country_ui_test.dart @@ -20,7 +20,7 @@ void main() { final gateway = countryGatewayProvider.getGateway(providersContext); gateway.transport = (request) async { - return Right( + return Either.right( GraphQLSuccessResponse( data: { 'countries': request.continentCode == 'NA' diff --git a/packages/clean_framework/example/test/features/last_login/domain/last_login_usecase_test.dart b/packages/clean_framework/example/test/features/last_login/domain/last_login_usecase_test.dart index 6bb542de..476e7488 100644 --- a/packages/clean_framework/example/test/features/last_login/domain/last_login_usecase_test.dart +++ b/packages/clean_framework/example/test/features/last_login/domain/last_login_usecase_test.dart @@ -12,9 +12,7 @@ void main() { // Subscription shortcut to mock a successful response from a Gateway useCase.subscribe( - (_) => Right( - LastLoginDateInput(currentDate), - ), + (_) => Either.right(LastLoginDateInput(currentDate)), ); var output = useCase.getOutput(); @@ -39,7 +37,7 @@ void main() { useCase.subscribe( (output) { expect(output, LastLoginDateOutput()); - return Left(FailureInput()); + return Either.left(FailureInput()); }, ); diff --git a/packages/clean_framework/example/test/features/last_login/external_interface/last_login_date_gateway_test.dart b/packages/clean_framework/example/test/features/last_login/external_interface/last_login_date_gateway_test.dart index b1ff98d1..5c1dc564 100644 --- a/packages/clean_framework/example/test/features/last_login/external_interface/last_login_date_gateway_test.dart +++ b/packages/clean_framework/example/test/features/last_login/external_interface/last_login_date_gateway_test.dart @@ -1,10 +1,9 @@ +import 'package:clean_framework/clean_framework.dart'; import 'package:clean_framework/clean_framework_providers.dart'; -import 'package:clean_framework/src/app_providers_container.dart'; import 'package:clean_framework_example/features/last_login/domain/last_login_use_case.dart'; import 'package:clean_framework_example/features/last_login/external_interface/last_login_date_gateway.dart'; import 'package:clean_framework_firestore/clean_framework_firestore.dart'; import 'package:clean_framework_test/clean_framework_test.dart'; -import 'package:either_dart/either.dart'; import 'package:flutter_test/flutter_test.dart'; final context = ProvidersContext(); @@ -16,7 +15,7 @@ void main() { var gateway = LastLoginDateGateway(context: context, provider: provider); gateway.transport = (request) async => - Right(FirebaseSuccessResponse({'date': '2000-01-01'})); + Either.right(FirebaseSuccessResponse({'date': '2000-01-01'})); final testRequest = LastLoginDateRequest(); expect(testRequest.id, '12345'); @@ -32,7 +31,8 @@ void main() { final provider = UseCaseProvider((_) => useCase); var gateway = LastLoginDateGateway(context: context, provider: provider); - gateway.transport = (request) async => Left(UnknownFailureResponse()); + gateway.transport = + (request) async => Either.left(UnknownFailureResponse()); await useCase.doFakeRequest(LastLoginDateOutput()); diff --git a/packages/clean_framework/example/test/features/random_cat/domain/random_cat_use_case_test.dart b/packages/clean_framework/example/test/features/random_cat/domain/random_cat_use_case_test.dart index 0e9c3d18..fb0ca208 100644 --- a/packages/clean_framework/example/test/features/random_cat/domain/random_cat_use_case_test.dart +++ b/packages/clean_framework/example/test/features/random_cat/domain/random_cat_use_case_test.dart @@ -19,7 +19,7 @@ void main() { final gateway = randomCatGatewayProvider.getGateway(providersContext); gateway.transport = (request) async { - return Right(RestSuccessResponse( + return Either.right(RestSuccessResponse( data: { 'id': 420, 'webpurl': @@ -54,7 +54,7 @@ void main() { final gateway = randomCatGatewayProvider.getGateway(providersContext); gateway.transport = (request) async { - return Left(UnknownFailureResponse()); + return Either.left(UnknownFailureResponse()); }; expect( diff --git a/packages/clean_framework/lib/clean_framework.dart b/packages/clean_framework/lib/clean_framework.dart index 1a84c3d0..0b693aa4 100644 --- a/packages/clean_framework/lib/clean_framework.dart +++ b/packages/clean_framework/lib/clean_framework.dart @@ -10,6 +10,6 @@ export 'package:clean_framework/src/logger.dart'; export 'package:clean_framework/src/open_feature/open_feature.dart'; export 'package:clean_framework/src/utilities/clean_framework_observer.dart'; export 'package:clean_framework/src/utilities/deserializer.dart'; +export 'package:clean_framework/src/utilities/either.dart'; export 'package:clean_framework/src/utilities/network_logger.dart'; export 'package:clean_framework/src/widgets/widgets.dart'; -export 'package:either_dart/either.dart'; diff --git a/packages/clean_framework/lib/src/providers/external_interface.dart b/packages/clean_framework/lib/src/providers/external_interface.dart index 3740b0b1..f532c34b 100644 --- a/packages/clean_framework/lib/src/providers/external_interface.dart +++ b/packages/clean_framework/lib/src/providers/external_interface.dart @@ -2,7 +2,7 @@ import 'dart:async'; import 'package:clean_framework/src/providers/gateway.dart'; import 'package:clean_framework/src/utilities/clean_framework_observer.dart'; -import 'package:either_dart/either.dart'; +import 'package:clean_framework/src/utilities/either.dart'; abstract class ExternalInterface { ExternalInterface(List> gatewayConnections) { @@ -87,10 +87,10 @@ class _RequestCompleter { bool get isCompleted => _completer.isCompleted; - void complete(S success) => _completer.complete(Right(success)); + void complete(S success) => _completer.complete(Either.right(success)); void completeFailure(FailureResponse failure) { - _completer.complete(Left(failure)); + _completer.complete(Either.left(failure)); } } diff --git a/packages/clean_framework/lib/src/providers/gateway.dart b/packages/clean_framework/lib/src/providers/gateway.dart index 9e9cf35d..130963cd 100644 --- a/packages/clean_framework/lib/src/providers/gateway.dart +++ b/packages/clean_framework/lib/src/providers/gateway.dart @@ -1,7 +1,7 @@ import 'package:clean_framework/clean_framework_providers.dart'; import 'package:clean_framework/src/app_providers_container.dart'; import 'package:clean_framework/src/utilities/clean_framework_observer.dart'; -import 'package:either_dart/either.dart'; +import 'package:clean_framework/src/utilities/either.dart'; import 'package:equatable/equatable.dart'; import 'package:meta/meta.dart'; @@ -34,8 +34,8 @@ abstract class Gateway> _processRequest(R request) async { final either = await transport(request); return either.fold( - (failureResponse) => Left(_onFailure(failureResponse)), - (response) => Right(onSuccess(response)), + (failureResponse) => Either.left(_onFailure(failureResponse)), + (response) => Either.right(onSuccess(response)), ); } @@ -55,7 +55,7 @@ abstract class BridgeGateway( (output) { - return Right( + return Either.right( onResponse( _publisherUseCase.getOutput(), ), diff --git a/packages/clean_framework/lib/src/providers/use_case/helpers/request_subscription_map.dart b/packages/clean_framework/lib/src/providers/use_case/helpers/request_subscription_map.dart index fa70eb27..9accec60 100644 --- a/packages/clean_framework/lib/src/providers/use_case/helpers/request_subscription_map.dart +++ b/packages/clean_framework/lib/src/providers/use_case/helpers/request_subscription_map.dart @@ -2,7 +2,7 @@ import 'dart:async'; import 'package:clean_framework/src/providers/use_case/helpers/input.dart'; import 'package:clean_framework/src/providers/use_case/helpers/output.dart'; -import 'package:either_dart/either.dart'; +import 'package:clean_framework/src/utilities/either.dart'; typedef RequestSubscriptionMap = Map>; @@ -27,7 +27,7 @@ extension RequestSubscriptionMapExtension final subscription = this[O]; if (subscription == null) { - return Left( + return Either.left( NoSubscriptionFailureInput(), ); } diff --git a/packages/clean_framework/lib/src/utilities/either.dart b/packages/clean_framework/lib/src/utilities/either.dart new file mode 100644 index 00000000..2061ed88 --- /dev/null +++ b/packages/clean_framework/lib/src/utilities/either.dart @@ -0,0 +1,98 @@ +import 'package:meta/meta.dart'; + +@Deprecated('Use Either.left') +typedef Left = _Left; + +@Deprecated('Use Either.right') +typedef Right = _Right; + +/// Signature for a function that maps +/// either the left or the right side of this disjunction. +typedef EitherMapper = T Function(E); + +@sealed +@immutable + +/// [Either] represents a value of two possible types. +/// An Either is either an [Either.left] or an [Either.right]. +abstract class Either { + /// Constructs an [Either]. + const Either(); + + /// The Left version of an [Either]. + const factory Either.left(L value) = _Left; + + /// The Right version of an [Either]. + const factory Either.right(R value) = _Right; + + @override + bool operator ==(Object other) { + return fold( + (left) => other is _Left && left == other.value, + (right) => other is _Right && right == other.value, + ); + } + + @override + int get hashCode => fold((left) => left.hashCode, (right) => right.hashCode); + + /// Returns whether this [Either] is an [Either.left]. + bool get isLeft => this is _Left; + + /// Returns whether this [Either] is an [Either.right]. + bool get isRight => this is _Right; + + /// Gets the right value if this is an [Either.left] + /// or throws if this is a [Either.right]. + L get left { + return fold((left) => left, _noSuchElementException); + } + + /// Gets the right value if this is an [Either.right] + /// or throws if this is an [Either.left]. + R get right { + return fold(_noSuchElementException, (right) => right); + } + + /// Folds either the left or the right side of this disjunction. + T fold(EitherMapper leftMapper, EitherMapper rightMapper); + + Never _noSuchElementException(value) { + throw NoSuchElementException( + 'You should check ${isLeft ? 'isLeft' : 'isRight'} before calling.', + ); + } +} + +class _Left extends Either { + const _Left(this.value); + + /// The Left value of an [Either]. + final L value; + + @override + T fold(EitherMapper leftMapper, EitherMapper rightMapper) { + return leftMapper(value); + } +} + +class _Right extends Either { + const _Right(this.value); + + /// The Right value of an [Either]. + final R value; + + @override + T fold(EitherMapper leftMapper, EitherMapper rightMapper) { + return rightMapper(value); + } +} + +/// [Exception] that indicates the element being requested does not exist. +class NoSuchElementException implements Exception { + /// Creates a [NoSuchElementException] with an optional error [message]. + const NoSuchElementException([this.message = '']); + + /// The message describing the exception. + final String message; +} diff --git a/packages/clean_framework/pubspec.yaml b/packages/clean_framework/pubspec.yaml index d091ea78..fdce4214 100644 --- a/packages/clean_framework/pubspec.yaml +++ b/packages/clean_framework/pubspec.yaml @@ -9,7 +9,6 @@ environment: flutter: '>=3.0.0' dependencies: - either_dart: ^0.3.0 equatable: ^2.0.5 flutter: sdk: flutter diff --git a/packages/clean_framework/test/providers/gateway_integration_test.dart b/packages/clean_framework/test/providers/gateway_integration_test.dart index f5b15886..c37a2242 100644 --- a/packages/clean_framework/test/providers/gateway_integration_test.dart +++ b/packages/clean_framework/test/providers/gateway_integration_test.dart @@ -1,6 +1,5 @@ +import 'package:clean_framework/clean_framework.dart'; import 'package:clean_framework/clean_framework_providers.dart'; -import 'package:clean_framework/src/app_providers_container.dart'; -import 'package:either_dart/either.dart'; import 'package:flutter_test/flutter_test.dart'; final context = ProvidersContext(); @@ -11,9 +10,7 @@ void main() { (_) => TestUseCase(TestEntity(foo: 'bar')), ); TestDirectGateway(provider).transport = (request) async { - return const Right( - TestResponse('success'), - ); + return const Either.right(TestResponse('success')); }; final useCase = provider.getUseCaseFromContext(context); @@ -29,7 +26,7 @@ void main() { (_) => TestUseCase(TestEntity(foo: 'bar')), ); TestDirectGateway(provider).transport = (request) async { - return Left(UnknownFailureResponse()); + return Either.left(UnknownFailureResponse()); }; final useCase = provider.getUseCaseFromContext(context); @@ -46,9 +43,7 @@ void main() { ); final gateway = TestYieldGateway(provider) ..transport = (request) async { - return const Right( - TestResponse('success'), - ); + return const Either.right(TestResponse('success')); }; final useCase = provider.getUseCaseFromContext(context); diff --git a/packages/clean_framework/test/providers/gateway_unit_test.dart b/packages/clean_framework/test/providers/gateway_unit_test.dart index 0b6d65d9..115b6064 100644 --- a/packages/clean_framework/test/providers/gateway_unit_test.dart +++ b/packages/clean_framework/test/providers/gateway_unit_test.dart @@ -1,7 +1,6 @@ +import 'package:clean_framework/clean_framework.dart'; import 'package:clean_framework/clean_framework_providers.dart'; -import 'package:clean_framework/src/app_providers_container.dart'; import 'package:clean_framework_test/clean_framework_test.dart'; -import 'package:either_dart/either.dart'; import 'package:flutter_test/flutter_test.dart'; final context = ProvidersContext(); @@ -11,7 +10,7 @@ void main() { final useCase = UseCaseFake(); final provider = UseCaseProvider((_) => useCase); TestDirectGateway(provider).transport = (request) async { - return const Right(TestResponse('success')); + return const Either.right(TestResponse('success')); }; await useCase.doFakeRequest(TestDirectOutput('123')); @@ -23,7 +22,7 @@ void main() { final useCase = UseCaseFake(); final provider = UseCaseProvider((_) => useCase); TestDirectGateway(provider).transport = (request) async { - return Left(UnknownFailureResponse()); + return Either.left(UnknownFailureResponse()); }; await useCase.doFakeRequest(TestDirectOutput('123')); @@ -36,7 +35,7 @@ void main() { final provider = UseCaseProvider((_) => useCase); final gateway = TestYieldGateway(provider) ..transport = (request) async { - return const Right(TestResponse('success')); + return const Either.right(TestResponse('success')); }; await useCase.doFakeRequest(TestSubscriptionOutput('123')); @@ -52,7 +51,7 @@ void main() { final useCase = UseCaseFake(); final provider = UseCaseProvider((_) => useCase); TestYieldGateway(provider).transport = (request) async { - return Left(UnknownFailureResponse()); + return Either.left(UnknownFailureResponse()); }; await useCase.doFakeRequest(TestSubscriptionOutput('123')); diff --git a/packages/clean_framework/test/providers/use_case_unit_test.dart b/packages/clean_framework/test/providers/use_case_unit_test.dart index 7032a95d..38adbdcf 100644 --- a/packages/clean_framework/test/providers/use_case_unit_test.dart +++ b/packages/clean_framework/test/providers/use_case_unit_test.dart @@ -1,5 +1,5 @@ +import 'package:clean_framework/clean_framework.dart'; import 'package:clean_framework/clean_framework_providers.dart'; -import 'package:either_dart/either.dart'; import 'package:flutter_test/flutter_test.dart'; void main() { @@ -24,12 +24,12 @@ void main() { expect(SuccessInput() == successInput, isFalse); useCase.subscribe((output) { - return Right(successInput); + return Either.right(successInput); }); expect( () => useCase.subscribe((_) { - return Right(successInput); + return Either.right(successInput); }), throwsStateError, ); @@ -44,7 +44,7 @@ void main() { test('UseCase subscription with delayed response on input filter', () async { final useCase = TestUseCase(TestEntity(foo: '')) ..subscribe( - (output) => Right(SuccessInput()), + (output) => Either.right(SuccessInput()), ); await useCase.fetchDataEventually(); diff --git a/packages/clean_framework_firestore/test/firebase_gateway_test.dart b/packages/clean_framework_firestore/test/firebase_gateway_test.dart index b9e34100..b96aed2d 100644 --- a/packages/clean_framework_firestore/test/firebase_gateway_test.dart +++ b/packages/clean_framework_firestore/test/firebase_gateway_test.dart @@ -10,7 +10,9 @@ void main() { final useCase = UseCaseFake(); final provider = UseCaseProvider((_) => useCase); TestGateway(context, provider).transport = (request) async { - return const Right(FirebaseSuccessResponse({'content': 'success'})); + return const Either.right( + FirebaseSuccessResponse({'content': 'success'}), + ); }; await useCase.doFakeRequest(TestOutput('123')); @@ -22,7 +24,7 @@ void main() { final useCase = UseCaseFake(); final provider = UseCaseProvider((_) => useCase); TestGateway(context, provider).transport = (request) async { - return const Left( + return const Either.left( FirebaseFailureResponse(type: FirebaseFailureType.noContent), ); }; diff --git a/packages/clean_framework_firestore/test/firebase_watcher_gateway_test.dart b/packages/clean_framework_firestore/test/firebase_watcher_gateway_test.dart index e0150f2c..e49b1c2d 100644 --- a/packages/clean_framework_firestore/test/firebase_watcher_gateway_test.dart +++ b/packages/clean_framework_firestore/test/firebase_watcher_gateway_test.dart @@ -10,7 +10,9 @@ void main() { final useCase = UseCaseFake(); final provider = UseCaseProvider((_) => useCase); TestGateway(context, provider).transport = (request) async { - return const Right(FirebaseSuccessResponse({'content': 'success'})); + return const Either.right( + FirebaseSuccessResponse({'content': 'success'}), + ); }; await useCase.doFakeRequest(TestOutput('123')); @@ -22,7 +24,7 @@ void main() { final useCase = UseCaseFake(); final provider = UseCaseProvider((_) => useCase); TestGateway(context, provider).transport = (request) async { - return const Left( + return const Either.left( FirebaseFailureResponse(type: FirebaseFailureType.noContent), ); }; diff --git a/packages/clean_framework_graphql/test/graphql_gateway_test.dart b/packages/clean_framework_graphql/test/graphql_gateway_test.dart index 7c05897f..8d21db07 100644 --- a/packages/clean_framework_graphql/test/graphql_gateway_test.dart +++ b/packages/clean_framework_graphql/test/graphql_gateway_test.dart @@ -9,7 +9,7 @@ void main() { final useCase = UseCaseFake(); final gateway = TestGateway(useCase) ..transport = (request) async { - return const Right( + return const Either.right( GraphQLSuccessResponse(data: {}), ); }; @@ -24,7 +24,7 @@ void main() { test('GraphQLGateway failure response', () async { final useCase = UseCaseFake(); TestGateway(useCase).transport = (request) async { - return const Left( + return const Either.left( GraphQLFailureResponse(type: GraphQLFailureType.operation), ); }; diff --git a/packages/clean_framework_rest/test/rest_gateway_test.dart b/packages/clean_framework_rest/test/rest_gateway_test.dart index 6eb61f7a..692b3282 100644 --- a/packages/clean_framework_rest/test/rest_gateway_test.dart +++ b/packages/clean_framework_rest/test/rest_gateway_test.dart @@ -9,9 +9,7 @@ void main() { final useCase = UseCaseFake(); final gateway = TestGateway(useCase) ..transport = (request) async { - return const Right( - RestSuccessResponse(data: {}), - ); + return const Either.right(RestSuccessResponse(data: {})); }; await useCase.doFakeRequest(TestOutput()); @@ -25,9 +23,7 @@ void main() { test('RestGateway failure response', () async { final useCase = UseCaseFake(); TestGateway(useCase).transport = (request) async { - return Left( - UnknownFailureResponse(), - ); + return Either.left(UnknownFailureResponse()); }; await useCase.doFakeRequest(TestOutput()); diff --git a/packages/clean_framework_test/lib/src/use_case_fake.dart b/packages/clean_framework_test/lib/src/use_case_fake.dart index ce612ea6..c56d62a5 100644 --- a/packages/clean_framework_test/lib/src/use_case_fake.dart +++ b/packages/clean_framework_test/lib/src/use_case_fake.dart @@ -1,5 +1,5 @@ +import 'package:clean_framework/clean_framework.dart'; import 'package:clean_framework/clean_framework_providers.dart'; -import 'package:either_dart/either.dart'; import 'package:flutter_test/flutter_test.dart'; typedef UseCaseSubscription = Future> diff --git a/packages/clean_framework_test/pubspec.yaml b/packages/clean_framework_test/pubspec.yaml index b3381453..a2c016ee 100644 --- a/packages/clean_framework_test/pubspec.yaml +++ b/packages/clean_framework_test/pubspec.yaml @@ -11,7 +11,6 @@ environment: dependencies: clean_framework: ^2.0.0-dev.0 clean_framework_router: ^0.2.0-dev.0 - either_dart: ^0.3.0 flutter: sdk: flutter flutter_riverpod: ^2.1.3 From 3e8c9d5442229768c269278bb7e191b26fcb98d7 Mon Sep 17 00:00:00 2001 From: sarbagyastha Date: Tue, 27 Dec 2022 15:16:52 +0545 Subject: [PATCH 3/5] :white_check_mark: added tests for either --- .../test/utilities/either_test.dart | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 packages/clean_framework/test/utilities/either_test.dart diff --git a/packages/clean_framework/test/utilities/either_test.dart b/packages/clean_framework/test/utilities/either_test.dart new file mode 100644 index 00000000..01517455 --- /dev/null +++ b/packages/clean_framework/test/utilities/either_test.dart @@ -0,0 +1,62 @@ +import 'package:clean_framework/clean_framework.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + group('Either tests | ', () { + test('left side', () { + const direction = Either.left('left'); + + expect(direction.isLeft, isTrue); + expect(direction.isRight, isFalse); + expect(direction, equals(const Either.left('left'))); + }); + + test('right side', () { + const direction = Either.right('right'); + + expect(direction.isLeft, isFalse); + expect(direction.isRight, isTrue); + expect(direction, equals(const Either.right('right'))); + }); + + test('throws if no left side is resolved', () { + const direction = Either.right('right'); + + expect(direction.isLeft, isFalse); + expect(direction.isRight, isTrue); + + expect(() => direction.left, throwsA(isA())); + }); + + test('throws if no right side is resolved', () { + const direction = Either.left('left'); + + expect(direction.isLeft, isTrue); + expect(direction.isRight, isFalse); + + expect(() => direction.right, throwsA(isA())); + }); + + test('equality check', () { + expect( + const Either.left(true), + const Either.left(true), + ); + + expect( + const Either.right(true), + const Either.right(true), + ); + + expect( + const Either.left(true), + isNot(const Either.right(true)), + ); + + expect( + const Either.right(true), + isNot(const Either.left(true)), + ); + }); + }); +} From f6c9d565061bf75f9525be56e8188a4c8a138f88 Mon Sep 17 00:00:00 2001 From: sarbagyastha Date: Tue, 27 Dec 2022 19:03:15 +0545 Subject: [PATCH 4/5] :white_check_mark: added tests for either --- .../lib/src/utilities/either.dart | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/packages/clean_framework/lib/src/utilities/either.dart b/packages/clean_framework/lib/src/utilities/either.dart index 2061ed88..4ef52323 100644 --- a/packages/clean_framework/lib/src/utilities/either.dart +++ b/packages/clean_framework/lib/src/utilities/either.dart @@ -25,17 +25,6 @@ abstract class Either { /// The Right version of an [Either]. const factory Either.right(R value) = _Right; - @override - bool operator ==(Object other) { - return fold( - (left) => other is _Left && left == other.value, - (right) => other is _Right && right == other.value, - ); - } - - @override - int get hashCode => fold((left) => left.hashCode, (right) => right.hashCode); - /// Returns whether this [Either] is an [Either.left]. bool get isLeft => this is _Left; @@ -74,6 +63,12 @@ class _Left extends Either { T fold(EitherMapper leftMapper, EitherMapper rightMapper) { return leftMapper(value); } + + @override + bool operator ==(Object other) => other is _Left && value == other.value; + + @override + int get hashCode => value.hashCode; } class _Right extends Either { @@ -86,6 +81,12 @@ class _Right extends Either { T fold(EitherMapper leftMapper, EitherMapper rightMapper) { return rightMapper(value); } + + @override + bool operator ==(Object other) => other is _Right && value == other.value; + + @override + int get hashCode => value.hashCode; } /// [Exception] that indicates the element being requested does not exist. From ed46019d7f35e13704d6ea728517463a199879ed Mon Sep 17 00:00:00 2001 From: sarbagyastha Date: Tue, 27 Dec 2022 19:09:23 +0545 Subject: [PATCH 5/5] :white_check_mark: cover hashcode --- .../test/utilities/either_test.dart | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/packages/clean_framework/test/utilities/either_test.dart b/packages/clean_framework/test/utilities/either_test.dart index 01517455..cf4713fa 100644 --- a/packages/clean_framework/test/utilities/either_test.dart +++ b/packages/clean_framework/test/utilities/either_test.dart @@ -39,8 +39,8 @@ void main() { test('equality check', () { expect( - const Either.left(true), - const Either.left(true), + const Either.left(false), + const Either.left(false), ); expect( @@ -49,13 +49,23 @@ void main() { ); expect( - const Either.left(true), + const Either.left(false), isNot(const Either.right(true)), ); expect( const Either.right(true), - isNot(const Either.left(true)), + isNot(const Either.left(false)), + ); + + expect( + const Either.left(false).hashCode, + const Either.left(false).hashCode, + ); + + expect( + const Either.right(true).hashCode, + const Either.right(true).hashCode, ); }); });