m3_lightmeter/test/screens/metering/components/light_sensor/bloc_container_light_sensor_test.dart

82 lines
3.2 KiB
Dart
Raw Normal View History

2023-06-12 14:10:40 +00:00
import 'package:bloc_test/bloc_test.dart';
import 'package:lightmeter/interactors/metering_interactor.dart';
import 'package:lightmeter/screens/metering/communication/bloc_communication_metering.dart';
import 'package:lightmeter/screens/metering/communication/event_communication_metering.dart'
as communication_events;
import 'package:lightmeter/screens/metering/communication/state_communication_metering.dart'
as communication_states;
import 'package:lightmeter/screens/metering/components/light_sensor_container/bloc_container_light_sensor.dart';
import 'package:lightmeter/screens/metering/components/light_sensor_container/state_container_light_sensor.dart';
import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart';
import 'package:mocktail/mocktail.dart';
import 'package:test/test.dart';
class _MockMeteringCommunicationBloc extends MockBloc<
communication_events.MeteringCommunicationEvent,
communication_states.MeteringCommunicationState> implements MeteringCommunicationBloc {}
class _MockMeteringInteractor extends Mock implements MeteringInteractor {}
void main() {
late _MockMeteringInteractor meteringInteractor;
2023-06-12 15:02:04 +00:00
late _MockMeteringCommunicationBloc communicationBloc;
2023-06-12 14:10:40 +00:00
late LightSensorContainerBloc bloc;
setUpAll(() {
meteringInteractor = _MockMeteringInteractor();
2023-06-12 15:02:04 +00:00
communicationBloc = _MockMeteringCommunicationBloc();
2023-06-12 14:10:40 +00:00
});
setUp(() {
bloc = LightSensorContainerBloc(
meteringInteractor,
communicationBloc,
);
});
tearDown(() {
bloc.close();
});
group(
2023-06-15 12:57:03 +00:00
'`LuxMeteringEvent`',
2023-06-12 14:10:40 +00:00
() {
2023-06-12 14:13:03 +00:00
const List<int> luxIterable = [1, 2, 2, 2, 3];
2023-06-12 14:10:40 +00:00
final List<double> resultList = luxIterable.map((lux) => log2(lux / 2.5)).toList();
blocTest<LightSensorContainerBloc, LightSensorContainerState>(
'Turn measuring on/off',
build: () => bloc,
setUp: () {
when(() => meteringInteractor.luxStream())
.thenAnswer((_) => Stream.fromIterable(luxIterable));
when(() => meteringInteractor.lightSensorEvCalibration).thenReturn(0.0);
},
act: (bloc) async {
bloc.onCommunicationState(const communication_states.MeasureState());
await Future.delayed(Duration.zero);
bloc.onCommunicationState(const communication_states.MeasureState());
},
verify: (_) {
verify(() => meteringInteractor.luxStream().listen((_) {})).called(1);
2023-06-12 14:13:03 +00:00
verify(() => meteringInteractor.lightSensorEvCalibration).called(5);
2023-06-12 14:10:40 +00:00
verify(() {
2023-06-12 14:13:03 +00:00
communicationBloc.add(communication_events.MeteringInProgressEvent(resultList.first));
2023-06-12 14:10:40 +00:00
}).called(1);
verify(() {
communicationBloc.add(communication_events.MeteringInProgressEvent(resultList[1]));
2023-06-12 14:13:03 +00:00
}).called(3);
2023-06-12 14:10:40 +00:00
verify(() {
2023-06-12 14:13:03 +00:00
communicationBloc.add(communication_events.MeteringInProgressEvent(resultList.last));
2023-06-12 14:10:40 +00:00
}).called(1);
verify(() {
2023-06-12 14:13:03 +00:00
communicationBloc.add(communication_events.MeteringEndedEvent(resultList.last));
2023-06-12 14:10:40 +00:00
}).called(2); // +1 from dispose
},
2023-06-12 14:13:03 +00:00
expect: () => resultList.map(
(e) => isA<LightSensorContainerState>().having((state) => state.ev100, 'ev100', e),
),
2023-06-12 14:10:40 +00:00
);
},
);
}