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
|
|
|
);
|
|
|
|
},
|
|
|
|
);
|
|
|
|
}
|