diff --git a/lib/screens/metering/components/camera_container/event_container_camera.dart b/lib/screens/metering/components/camera_container/event_container_camera.dart index 7f358b7..d3e5995 100644 --- a/lib/screens/metering/components/camera_container/event_container_camera.dart +++ b/lib/screens/metering/components/camera_container/event_container_camera.dart @@ -22,12 +22,32 @@ class ZoomChangedEvent extends CameraContainerEvent { final double value; const ZoomChangedEvent(this.value); + + @override + bool operator ==(Object other) { + if (identical(this, other)) return true; + if (other.runtimeType != runtimeType) return false; + return other is ZoomChangedEvent && other.value == value; + } + + @override + int get hashCode => Object.hash(value, runtimeType); } class ExposureOffsetChangedEvent extends CameraContainerEvent { final double value; const ExposureOffsetChangedEvent(this.value); + + @override + bool operator ==(Object other) { + if (identical(this, other)) return true; + if (other.runtimeType != runtimeType) return false; + return other is ExposureOffsetChangedEvent && other.value == value; + } + + @override + int get hashCode => Object.hash(value, runtimeType); } class ExposureOffsetResetEvent extends CameraContainerEvent { diff --git a/lib/screens/metering/components/camera_container/state_container_camera.dart b/lib/screens/metering/components/camera_container/state_container_camera.dart index b8e6173..6548a87 100644 --- a/lib/screens/metering/components/camera_container/state_container_camera.dart +++ b/lib/screens/metering/components/camera_container/state_container_camera.dart @@ -34,6 +34,28 @@ class CameraActiveState extends CameraContainerState { required this.exposureOffsetStep, required this.currentExposureOffset, }); + + @override + bool operator ==(Object other) { + if (identical(this, other)) return true; + if (other.runtimeType != runtimeType) return false; + return other is CameraActiveState && + other.zoomRange == zoomRange && + other.currentZoom == currentZoom && + other.exposureOffsetRange == exposureOffsetRange && + other.exposureOffsetStep == exposureOffsetStep && + other.currentExposureOffset == currentExposureOffset; + } + + @override + int get hashCode => Object.hash( + runtimeType, + zoomRange, + currentZoom, + exposureOffsetRange, + exposureOffsetStep, + currentExposureOffset, + ); } class CameraErrorState extends CameraContainerState { diff --git a/test/screens/metering/components/camera/bloc_container_camera_test.dart b/test/screens/metering/components/camera/bloc_container_camera_test.dart index 53d1280..998715c 100644 --- a/test/screens/metering/components/camera/bloc_container_camera_test.dart +++ b/test/screens/metering/components/camera/bloc_container_camera_test.dart @@ -104,10 +104,14 @@ void main() { meteringInteractor, communicationBloc, ); + TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger + .setMockMethodCallHandler(cameraMethodChannel, cameraMethodCallSuccessHandler); }); tearDown(() { bloc.close(); + TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger + .setMockMethodCallHandler(cameraMethodChannel, null); }); group( @@ -161,8 +165,7 @@ void main() { verify(() => meteringInteractor.checkCameraPermission()).called(1); }, expect: () => [ - isA(), - // Proceed to `InitializeEvent` tests from here + ...initializedStateSequence, ], ); }, @@ -240,12 +243,6 @@ void main() { 'appLifecycleStateObserver', setUp: () { when(() => meteringInteractor.checkCameraPermission()).thenAnswer((_) async => true); - TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger - .setMockMethodCallHandler(cameraMethodChannel, cameraMethodCallSuccessHandler); - }, - tearDown: () { - TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger - .setMockMethodCallHandler(cameraMethodChannel, null); }, build: () => bloc, act: (bloc) async { @@ -274,12 +271,6 @@ void main() { 'Returned ev100 == null', setUp: () { when(() => meteringInteractor.checkCameraPermission()).thenAnswer((_) async => true); - TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger - .setMockMethodCallHandler(cameraMethodChannel, cameraMethodCallSuccessHandler); - }, - tearDown: () { - TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger - .setMockMethodCallHandler(cameraMethodChannel, null); }, build: () => bloc, act: (bloc) async { @@ -326,6 +317,54 @@ void main() { // ], // ); }, + skip: true, + ); + + group( + '`ZoomChangedEvent` tests', + () { + blocTest( + 'Set zoom in range multiple times', + setUp: () { + when(() => meteringInteractor.checkCameraPermission()).thenAnswer((_) async => true); + }, + build: () => bloc, + act: (bloc) async { + bloc.add(const InitializeEvent()); + await Future.delayed(Duration.zero); + bloc.add(const ZoomChangedEvent(2.0)); + bloc.add(const ZoomChangedEvent(2.0)); + bloc.add(const ZoomChangedEvent(2.0)); + bloc.add(const ZoomChangedEvent(3.0)); + }, + verify: (_) { + verify(() => meteringInteractor.checkCameraPermission()).called(1); + }, + expect: () => [ + ...initializedStateSequence, + isA() + .having((state) => state.zoomRange, 'zoomRange', const RangeValues(1.0, 7.0)) + .having((state) => state.currentZoom, 'currentZoom', 2.0) + .having( + (state) => state.exposureOffsetRange, + 'exposureOffsetRange', + const RangeValues(-4.0, 4.0), + ) + .having((state) => state.exposureOffsetStep, 'exposureOffsetStep', 0.1666666) + .having((state) => state.currentExposureOffset, 'currentExposureOffset', 0.0), + isA() + .having((state) => state.zoomRange, 'zoomRange', const RangeValues(1.0, 7.0)) + .having((state) => state.currentZoom, 'currentZoom', 3.0) + .having( + (state) => state.exposureOffsetRange, + 'exposureOffsetRange', + const RangeValues(-4.0, 4.0), + ) + .having((state) => state.exposureOffsetStep, 'exposureOffsetStep', 0.1666666) + .having((state) => state.currentExposureOffset, 'currentExposureOffset', 0.0), + ], + ); + }, ); }