From c7d30510f0d2133a6388ef41b6c5f962dc7b8bfd Mon Sep 17 00:00:00 2001 From: Vadim Date: Thu, 8 Jun 2023 11:59:21 +0200 Subject: [PATCH] `MeasureEvent` tests revision --- lib/screens/metering/bloc_metering.dart | 24 ++- lib/screens/metering/event_metering.dart | 7 +- test/screens/metering/bloc_metering_test.dart | 170 +++++------------- 3 files changed, 63 insertions(+), 138 deletions(-) diff --git a/lib/screens/metering/bloc_metering.dart b/lib/screens/metering/bloc_metering.dart index e057aeb..cac55fc 100644 --- a/lib/screens/metering/bloc_metering.dart +++ b/lib/screens/metering/bloc_metering.dart @@ -41,9 +41,6 @@ class MeteringBloc extends Bloc { @visibleForTesting double? ev100; - @visibleForTesting - bool isMeteringInProgress = false; - MeteringBloc( this._communicationBloc, this._meteringInteractor, @@ -83,8 +80,10 @@ class MeteringBloc extends Bloc { @visibleForTesting void onCommunicationState(communication_states.ScreenState communicationState) { if (communicationState is communication_states.MeasuredState) { - isMeteringInProgress = communicationState is communication_states.MeteringInProgressState; - handleEv100(communicationState.ev100); + _handleEv100( + communicationState.ev100, + continuousMetering: communicationState is communication_states.MeteringInProgressState, + ); } } @@ -174,14 +173,13 @@ class MeteringBloc extends Bloc { ); } - void _updateMeasurements() => handleEv100(ev100); + void _updateMeasurements() => _handleEv100(ev100, continuousMetering: false); - @visibleForTesting - void handleEv100(double? ev100) { + void _handleEv100(double? ev100, {required bool continuousMetering}) { if (ev100 == null || ev100.isNaN || ev100.isInfinite) { - add(const MeasureErrorEvent()); + add(MeasureErrorEvent(continuousMetering: continuousMetering)); } else { - add(MeasuredEvent(ev100)); + add(MeasuredEvent(ev100, continuousMetering: continuousMetering)); } } @@ -196,12 +194,12 @@ class MeteringBloc extends Bloc { iso: iso, nd: nd, exposurePairs: buildExposureValues(ev), - continuousMetering: isMeteringInProgress, + continuousMetering: event.continuousMetering, ), ); } - void _onMeasureError(MeasureErrorEvent _, Emitter emit) { + void _onMeasureError(MeasureErrorEvent event, Emitter emit) { _meteringInteractor.errorVibration(); ev100 = null; emit( @@ -211,7 +209,7 @@ class MeteringBloc extends Bloc { iso: iso, nd: nd, exposurePairs: const [], - continuousMetering: isMeteringInProgress, + continuousMetering: event.continuousMetering, ), ); } diff --git a/lib/screens/metering/event_metering.dart b/lib/screens/metering/event_metering.dart index 888bea1..b1435f4 100644 --- a/lib/screens/metering/event_metering.dart +++ b/lib/screens/metering/event_metering.dart @@ -41,10 +41,13 @@ class MeasureEvent extends MeteringEvent { class MeasuredEvent extends MeteringEvent { final double ev100; + final bool continuousMetering; - const MeasuredEvent(this.ev100); + const MeasuredEvent(this.ev100, {required this.continuousMetering}); } class MeasureErrorEvent extends MeteringEvent { - const MeasureErrorEvent(); + final bool continuousMetering; + + const MeasureErrorEvent({required this.continuousMetering}); } diff --git a/test/screens/metering/bloc_metering_test.dart b/test/screens/metering/bloc_metering_test.dart index 6c25525..6ef5f1c 100644 --- a/test/screens/metering/bloc_metering_test.dart +++ b/test/screens/metering/bloc_metering_test.dart @@ -1,7 +1,6 @@ import 'package:bloc_test/bloc_test.dart'; import 'package:lightmeter/data/models/film.dart'; import 'package:lightmeter/interactors/metering_interactor.dart'; -import 'package:lightmeter/res/dimens.dart'; import 'package:lightmeter/screens/metering/bloc_metering.dart'; import 'package:lightmeter/screens/metering/communication/bloc_communication_metering.dart'; import 'package:lightmeter/screens/metering/communication/event_communication_metering.dart' @@ -26,7 +25,6 @@ void main() { late EquipmentProfileData equipmentProfileData; late MeteringBloc bloc; const iso100 = IsoValue(100, StopType.full); - double initEV = 0.0; setUpAll(() { communicationBloc = _MockMeteringCommunicationBloc(); @@ -45,6 +43,7 @@ void main() { when(() => meteringInteractor.film).thenReturn(Film.values.first); when(meteringInteractor.quickVibration).thenAnswer((_) async {}); when(meteringInteractor.responseVibration).thenAnswer((_) async {}); + when(meteringInteractor.errorVibration).thenAnswer((_) async {}); }); setUp(() { @@ -69,74 +68,14 @@ void main() { .having((state) => state.film, 'film', bloc.film) .having((state) => state.iso, 'iso', bloc.iso) .having((state) => state.nd, 'nd', bloc.nd) - .having((state) => state.exposurePairs, 'exposurePairs', const []).having( - (state) => state.continuousMetering, - 'continuousMetering', - bloc.isMeteringInProgress, - ), + .having((state) => state.exposurePairs, 'exposurePairs', const []), ); }); - - blocTest( - 'Measured', - build: () => bloc, - act: (bloc) => bloc.add(const MeasuredEvent(2)), - verify: (_) { - verify(() => meteringInteractor.responseVibration()).called(1); - }, - expect: () => [ - isA() - .having((_) => bloc.ev100, 'ev100', 2) - .having((state) => state.ev, 'ev', 2) - .having((state) => state.film, 'film', Film.values.first) - .having((state) => state.iso, 'iso', iso100) - .having((state) => state.nd, 'nd', NdValue.values.first), - ], - ); - - blocTest( - 'Measured', - build: () => bloc, - setUp: () { - when(() => meteringInteractor.iso).thenReturn(iso100); - }, - act: (bloc) { - bloc.add(const MeasuredEvent(3)); - bloc.add(const MeasuredEvent(7)); - bloc.add(const MeasuredEvent(2)); - }, - verify: (_) { - //verify(() => meteringInteractor.responseVibration()).called(1); - }, - expect: () => [ - isA() - .having((_) => bloc.ev100, 'ev100', 3) - .having((_) => bloc.iso, 'blocIso', iso100) - .having((state) => state.ev, 'ev', 4) - .having((state) => state.film, 'film', Film.values.first) - .having((state) => state.iso, 'iso', iso100) - .having((state) => state.nd, 'nd', NdValue.values.first), - isA() - .having((_) => bloc.ev100, 'ev100', 7) - .having((_) => bloc.iso, 'blocIso', iso100) - .having((state) => state.ev, 'ev', 8) - .having((state) => state.film, 'film', Film.values.first) - .having((state) => state.iso, 'iso', iso100) - .having((state) => state.nd, 'nd', NdValue.values.first), - isA() - .having((_) => bloc.ev100, 'ev100', 2) - .having((_) => bloc.iso, 'blocIso', iso100) - .having((state) => state.ev, 'ev', 3) - .having((state) => state.film, 'film', Film.values.first) - .having((state) => state.iso, 'iso', iso100) - .having((state) => state.nd, 'nd', NdValue.values.first), - ], - ); }); group('`MeasureEvent` tests', () { blocTest( - '`MeasureEvent` -> `MeteringEndedState`', + '`MeasureEvent` -> success', build: () => bloc, act: (bloc) async { bloc.add(const MeasureEvent()); @@ -148,93 +87,78 @@ void main() { verify(() => meteringInteractor.responseVibration()).called(1); }, expect: () => [ - isA() - .having((state) => state.film, 'film', Film.values.first) - .having((state) => state.iso, 'iso', iso100) - .having((state) => state.nd, 'nd', NdValue.values.first), + isA(), isA() - .having((_) => bloc.isMeteringInProgress, 'isMeteringInProgress', false) - .having((_) => bloc.ev100, 'ev100', 2) - .having((state) => state.ev, 'ev', 2) - .having((state) => state.film, 'film', Film.values.first) - .having((state) => state.iso, 'iso', iso100) - .having((state) => state.nd, 'nd', NdValue.values.first), + .having((state) => state.continuousMetering, 'continuousMetering', false) + .having((state) => state.ev, 'ev', 2), ], ); blocTest( - '`MeasureEvent` -> `MeteringInProgressState`', + '`MeasureEvent` -> error', build: () => bloc, act: (bloc) async { bloc.add(const MeasureEvent()); - bloc.onCommunicationState(const communication_states.MeteringInProgressState(2)); + bloc.onCommunicationState(const communication_states.MeteringEndedState(null)); }, verify: (_) { verify(() => meteringInteractor.quickVibration()).called(1); verify(() => communicationBloc.add(const communication_events.MeasureEvent())).called(1); - verify(() => meteringInteractor.responseVibration()).called(1); + verify(() => meteringInteractor.errorVibration()).called(1); }, expect: () => [ - isA() - .having((state) => state.film, 'film', Film.values.first) - .having((state) => state.iso, 'iso', iso100) - .having((state) => state.nd, 'nd', NdValue.values.first), + isA(), isA() - .having((_) => bloc.isMeteringInProgress, 'isMeteringInProgress', true) - .having((_) => bloc.ev100, 'ev100', 2) - .having((state) => state.ev, 'ev', 2) - .having((state) => state.film, 'film', Film.values.first) - .having((state) => state.iso, 'iso', iso100) - .having((state) => state.nd, 'nd', NdValue.values.first), + .having((state) => state.continuousMetering, 'continuousMetering', false) + .having((_) => bloc.ev100, 'ev100', null) + .having((state) => state.ev, 'ev', null), ], ); - }); - group('MeteringBloc `IsoChangedEvent` tests:', () { - const isoValueToSet = IsoValue(200, StopType.full); blocTest( - 'ISO change', - setUp: () { - when(() => meteringInteractor.iso = isoValueToSet); - }, + '`MeasureEvent` -> continuous metering', build: () => bloc, - act: (bloc) async { - bloc.add(const MeasuredEvent(1)); - bloc.add(const IsoChangedEvent(isoValueToSet)); - await Future.delayed(Dimens.durationS); + act: (bloc) async { + // delays here simulate light sensor behaviour + // when sensor does not fire new LUX events when value is not changed bloc.add(const MeasureEvent()); - await Future.delayed(Dimens.durationS); - bloc.add(const MeasuredEvent(3)); - await Future.delayed(Dimens.durationS); + bloc.onCommunicationState(const communication_states.MeteringInProgressState(null)); + await Future.delayed(const Duration(seconds: 1)); + bloc.onCommunicationState(const communication_states.MeteringInProgressState(2)); + bloc.onCommunicationState(const communication_states.MeteringInProgressState(5.5)); + await Future.delayed(const Duration(seconds: 2)); + bloc.onCommunicationState(const communication_states.MeteringInProgressState(null)); + bloc.onCommunicationState(const communication_states.MeteringInProgressState(4)); + bloc.add(const MeasureEvent()); + bloc.onCommunicationState(const communication_states.MeteringEndedState(4)); }, verify: (_) { - verify(() => meteringInteractor.iso = isoValueToSet).called(1); + verify(() => meteringInteractor.quickVibration()).called(2); + verify(() => communicationBloc.add(const communication_events.MeasureEvent())).called(2); + verify(() => meteringInteractor.responseVibration()).called(4); + verify(() => meteringInteractor.errorVibration()).called(2); }, expect: () => [ + isA(), isA() - .having((_) => bloc.ev100, 'ev100', 1) - .having((state) => state.ev, 'ev', 1) - .having((state) => state.film, 'film', Film.values.first) - .having((state) => state.iso, 'iso', iso100) - .having((state) => state.nd, 'nd', NdValue.values.first), + .having((state) => state.continuousMetering, 'continuousMetering', true) + .having((state) => state.ev, 'ev', null), isA() - .having((_) => bloc.ev100, 'ev100', 1) - .having((_) => bloc.iso, 'blocIso', isoValueToSet) - .having((state) => state.ev, 'ev', 2) - .having((state) => state.film, 'film', Film.values.first) - .having((state) => state.iso, 'iso', isoValueToSet) - .having((state) => state.nd, 'nd', NdValue.values.first), - isA() - .having((state) => state.film, 'film', Film.values.first) - .having((state) => state.iso, 'iso', isoValueToSet) - .having((state) => state.nd, 'nd', NdValue.values.first), + .having((state) => state.continuousMetering, 'continuousMetering', true) + .having((state) => state.ev, 'ev', 2), isA() - //.having((_) => bloc.ev100, 'ev100', 3) - .having((_) => bloc.iso, 'blocIso', isoValueToSet) - //.having((state) => state.ev, 'ev', 4) - .having((state) => state.film, 'film', Film.values.first) - .having((state) => state.iso, 'iso', isoValueToSet) - .having((state) => state.nd, 'nd', NdValue.values.first), + .having((state) => state.continuousMetering, 'continuousMetering', true) + .having((state) => state.ev, 'ev', 5.5), + isA() + .having((state) => state.continuousMetering, 'continuousMetering', true) + .having((state) => state.ev, 'ev', null), + isA() + .having((state) => state.continuousMetering, 'continuousMetering', true) + .having((state) => state.ev, 'ev', 4), + isA(), + isA() + .having((state) => state.continuousMetering, 'continuousMetering', false) + .having((state) => state.ev, 'ev', 4), ], ); });