diff --git a/iap/pubspec.yaml b/iap/pubspec.yaml index 6aed37e..c011063 100644 --- a/iap/pubspec.yaml +++ b/iap/pubspec.yaml @@ -13,7 +13,7 @@ dependencies: m3_lightmeter_resources: git: url: "https://github.com/vodemn/m3_lightmeter_resources" - ref: main + ref: v1.2.0 shared_preferences: 2.2.0 dev_dependencies: diff --git a/integration_test/e2e_test.dart b/integration_test/e2e_test.dart index e84f73b..ed9de80 100644 --- a/integration_test/e2e_test.dart +++ b/integration_test/e2e_test.dart @@ -44,7 +44,7 @@ void testE2E(String description) { testWidgets( description, (tester) async { - await tester.pumpApplication(equipmentProfiles: [], films: []); + await tester.pumpApplication(equipmentProfiles: [], filmsInUse: []); /// Create Praktica + Zenitar profile from scratch await tester.openSettings(); @@ -60,7 +60,7 @@ void testE2E(String description) { await tester.setZoomValue(0, mockEquipmentProfiles[0].lensZoom); expect(find.text('x1.91'), findsOneWidget); expect(find.text('f/1.7 - f/16'), findsOneWidget); - expect(find.text('1/1000 - 16"'), findsOneWidget); + expect(find.text('1/1000 - B'), findsOneWidget); /// Create Praktica + Jupiter profile from Zenitar profile await tester.tap(find.byIcon(Icons.copy).first); @@ -71,7 +71,7 @@ void testE2E(String description) { await tester.setZoomValue(1, mockEquipmentProfiles[1].lensZoom); expect(find.text('x5.02'), findsOneWidget); expect(find.text('f/3.5 - f/22'), findsOneWidget); - expect(find.text('1/1000 - 16"'), findsNWidgets(2)); + expect(find.text('1/1000 - B'), findsNWidgets(2)); await tester.navigatorPop(); /// Select some films diff --git a/integration_test/mocks/paid_features_mock.dart b/integration_test/mocks/paid_features_mock.dart index 84c5090..34e8fb0 100644 --- a/integration_test/mocks/paid_features_mock.dart +++ b/integration_test/mocks/paid_features_mock.dart @@ -10,18 +10,21 @@ class _MockIAPStorageService extends Mock implements IAPStorageService {} class MockIAPProviders extends StatefulWidget { final List? equipmentProfiles; final String selectedEquipmentProfileId; - final List? films; + final List availableFilms; + final List filmsInUse; final Film selectedFilm; final Widget child; const MockIAPProviders({ this.equipmentProfiles = const [], this.selectedEquipmentProfileId = '', - this.films = mockFilms, + List? availableFilms, + List? filmsInUse, this.selectedFilm = const Film.other(), required this.child, super.key, - }); + }) : availableFilms = availableFilms ?? mockFilms, + filmsInUse = filmsInUse ?? mockFilms; @override State createState() => _MockIAPProvidersState(); @@ -36,7 +39,7 @@ class _MockIAPProvidersState extends State { mockIAPStorageService = _MockIAPStorageService(); when(() => mockIAPStorageService.equipmentProfiles).thenReturn(widget.equipmentProfiles ?? mockEquipmentProfiles); when(() => mockIAPStorageService.selectedEquipmentProfileId).thenReturn(widget.selectedEquipmentProfileId); - when(() => mockIAPStorageService.filmsInUse).thenReturn(widget.films ?? mockFilms); + when(() => mockIAPStorageService.filmsInUse).thenReturn(widget.filmsInUse); when(() => mockIAPStorageService.selectedFilm).thenReturn(widget.selectedFilm); } @@ -46,7 +49,7 @@ class _MockIAPProvidersState extends State { storageService: mockIAPStorageService, child: FilmsProvider( storageService: mockIAPStorageService, - availableFilms: widget.films ?? mockFilms, + availableFilms: widget.availableFilms, child: widget.child, ), ); @@ -78,7 +81,7 @@ final mockEquipmentProfiles = [ ], shutterSpeedValues: ShutterSpeedValue.values.sublist( ShutterSpeedValue.values.indexOf(const ShutterSpeedValue(1000, true, StopType.full)), - ShutterSpeedValue.values.indexOf(const ShutterSpeedValue(16, false, StopType.full)) + 1, + ShutterSpeedValue.values.indexOf(const ShutterSpeedValue(1, false, StopType.full)) + 1, ), isoValues: const [ IsoValue(50, StopType.full), @@ -108,7 +111,7 @@ final mockEquipmentProfiles = [ ], shutterSpeedValues: ShutterSpeedValue.values.sublist( ShutterSpeedValue.values.indexOf(const ShutterSpeedValue(1000, true, StopType.full)), - ShutterSpeedValue.values.indexOf(const ShutterSpeedValue(16, false, StopType.full)) + 1, + ShutterSpeedValue.values.indexOf(const ShutterSpeedValue(1, false, StopType.full)) + 1, ), isoValues: const [ IsoValue(50, StopType.full), diff --git a/integration_test/utils/widget_tester_actions.dart b/integration_test/utils/widget_tester_actions.dart index 6ae0194..7732d1a 100644 --- a/integration_test/utils/widget_tester_actions.dart +++ b/integration_test/utils/widget_tester_actions.dart @@ -22,7 +22,8 @@ extension WidgetTesterCommonActions on WidgetTester { IAPProductStatus productStatus = IAPProductStatus.purchased, List? equipmentProfiles, String selectedEquipmentProfileId = '', - List? films, + List? availableFilms, + List? filmsInUse, Film selectedFilm = const Film.other(), }) async { await pumpWidget( @@ -33,7 +34,8 @@ extension WidgetTesterCommonActions on WidgetTester { child: MockIAPProviders( equipmentProfiles: equipmentProfiles, selectedEquipmentProfileId: selectedEquipmentProfileId, - films: films, + availableFilms: availableFilms, + filmsInUse: filmsInUse, selectedFilm: selectedFilm, child: const Application(), ), diff --git a/lib/l10n/intl_en.arb b/lib/l10n/intl_en.arb index 46b8ad8..b041500 100644 --- a/lib/l10n/intl_en.arb +++ b/lib/l10n/intl_en.arb @@ -58,6 +58,8 @@ "ndFiltersFilterDescription": "Select the ND filters to display. These may be your most commonly used ND filters or the ones that fit your lens.", "shutterSpeedValues": "Shutter speed values", "shutterSpeedValuesFilterDescription": "Select the range of shutter speed values to display. This is usually determined by the camera body you are using.", + "shutterSpeedManualShort": "B", + "shutterSpeedManual": "Manual", "isoValues": "ISO values", "isoValuesFilterDescription": "Select the ISO values to display. These may be your most commonly used values or those supported by your camera.", "lensZoom": "Lens zoom", @@ -116,4 +118,4 @@ "tooltipUseLightSensor": "Use lightsensor", "tooltipUseCamera": "Use camera", "tooltipOpenSettings": "Open settings" -} +} \ No newline at end of file diff --git a/lib/l10n/intl_fr.arb b/lib/l10n/intl_fr.arb index fd661a3..c3941ba 100644 --- a/lib/l10n/intl_fr.arb +++ b/lib/l10n/intl_fr.arb @@ -58,6 +58,8 @@ "ndFiltersFilterDescription": "Sélectionnez les filtres ND à afficher. Ce sont peut-être vos filtres ND les plus couramment utilisés ou ceux qui correspondent à votre lentille.", "shutterSpeedValues": "Valeurs de la vitesse d'obturation", "shutterSpeedValuesFilterDescription": "Sélectionnez la plage de valeurs de vitesse d'obturation à afficher. Cela est généralement déterminé par le corps de l'appareil que vous utilisez.", + "shutterSpeedManualShort": "B", + "shutterSpeedManual": "Manuelle", "isoValues": "Valeurs ISO", "isoValuesFilterDescription": "Sélectionnez les valeurs ISO à afficher. Ce sont peut-être vos valeurs les plus couramment utilisées ou celles prises en charge par votre caméra.", "lensZoom": "Zoom sur l'objectif", diff --git a/lib/l10n/intl_ru.arb b/lib/l10n/intl_ru.arb index 4543e1f..ef182d8 100644 --- a/lib/l10n/intl_ru.arb +++ b/lib/l10n/intl_ru.arb @@ -58,6 +58,8 @@ "ndFiltersFilterDescription": "Выберите ND фильтры для отображения. Это могут быть наиболее часто используемые ND фильтры или фильтры, подходящие под ваш объектив.", "shutterSpeedValues": "Значения выдержки", "shutterSpeedValuesFilterDescription": "Выберите диапазон значений выдержки. Обычно ограничивается возможностями вашей камеры.", + "shutterSpeedManualShort": "B", + "shutterSpeedManual": "Ручная", "isoValues": "Значения ISO", "isoValuesFilterDescription": "Выберите значения ISO для отображения. Это может быть наиболее часто используемые значения или значения, поддерживаемые вашей камерой.", "lensZoom": "Зум объектива", diff --git a/lib/l10n/intl_zh.arb b/lib/l10n/intl_zh.arb index 8994e91..5d26833 100644 --- a/lib/l10n/intl_zh.arb +++ b/lib/l10n/intl_zh.arb @@ -58,6 +58,8 @@ "ndFiltersFilterDescription": "选择要显示的 ND 滤镜系数。可能是您最常用的 ND 滤镜,也可能是适合您镜头的减光镜。", "shutterSpeedValues": "快门速度", "shutterSpeedValuesFilterDescription": "选择要显示的快门速度范围。这通常由您使用的相机机身决定。", + "shutterSpeedManualShort": "B", + "shutterSpeedManual": "手册", "isoValues": "ISO", "isoValuesFilterDescription": "选择要显示的 ISO 。这些可能是您常用的ISO值,也可以是相机支持的ISO范围。", "lensZoom": "镜头变焦", diff --git a/lib/screens/metering/components/shared/exposure_pairs_list/components/exposure_pairs_list_item/widget_item_list_exposure_pairs.dart b/lib/screens/metering/components/shared/exposure_pairs_list/components/exposure_pairs_list_item/widget_item_list_exposure_pairs.dart index 9514fbe..ece28b0 100644 --- a/lib/screens/metering/components/shared/exposure_pairs_list/components/exposure_pairs_list_item/widget_item_list_exposure_pairs.dart +++ b/lib/screens/metering/components/shared/exposure_pairs_list/components/exposure_pairs_list_item/widget_item_list_exposure_pairs.dart @@ -15,9 +15,13 @@ class ExposurePairsListItem extends StatelessWid @override Widget build(BuildContext context) { final List rowChildren = [ - Text( - value.toString(), - style: labelTextStyle(context).copyWith(color: Theme.of(context).colorScheme.onBackground), + Flexible( + child: Text( + value.toString(), + style: labelTextStyle(context).copyWith(color: Theme.of(context).colorScheme.onBackground), + softWrap: false, + overflow: TextOverflow.fade, + ), ), const SizedBox(width: Dimens.grid8), ColoredBox( diff --git a/lib/screens/metering/screen_metering.dart b/lib/screens/metering/screen_metering.dart index 836e6d0..4a0aa83 100644 --- a/lib/screens/metering/screen_metering.dart +++ b/lib/screens/metering/screen_metering.dart @@ -158,22 +158,40 @@ class MeteringContainerBuidler extends StatelessWidget { shutterSpeedOffset = 0; } - final int itemsCount = min( + int itemsCount = min( apertureValues.length + shutterSpeedOffset, shutterSpeedValues.length + apertureOffset, ) - max(apertureOffset, shutterSpeedOffset); - if (itemsCount <= 0) { + if (apertureOffset == apertureValues.length) { return List.empty(); } + final lastPreCalcShutterSpeed = + shutterSpeedValues.elementAtOrNull(itemsCount - 1 + shutterSpeedOffset) ?? shutterSpeedValues.last; + final preCalculatedItemsCount = itemsCount; + if (itemsCount <= 0) { + itemsCount = apertureValues.length; + } else { + itemsCount += (apertureValues.length - 1) - (itemsCount - 1 + apertureOffset); + } + final exposurePairs = List.generate( itemsCount, - (index) => ExposurePair( - apertureValues[index + apertureOffset], - shutterSpeedValues[index + shutterSpeedOffset], - ), + (index) { + final stopDifference = (index - (preCalculatedItemsCount - 1)) / (stopType.index + 1); + final newShutterSpeed = log2(lastPreCalcShutterSpeed.rawValue) + stopDifference; + return ExposurePair( + apertureValues[index + apertureOffset], + shutterSpeedValues.elementAtOrNull(index + shutterSpeedOffset) ?? + ShutterSpeedValue( + calcShutterSpeed(newShutterSpeed), + false, + stopDifference == stopDifference.roundToDouble() ? StopType.full : stopType, + ), + ); + }, growable: false, ); @@ -191,7 +209,9 @@ class MeteringContainerBuidler extends StatelessWidget { ); final endCutEV = max( equipmentApertureValues.last.difference(exposurePairs.last.aperture), - equipmentShutterSpeedValues.last.difference(exposurePairs.last.shutterSpeed), + equipmentShutterSpeedValues.last != ShutterSpeedValue.values.last + ? equipmentShutterSpeedValues.last.difference(exposurePairs.last.shutterSpeed) + : double.negativeInfinity, ); final startCut = (startCutEV * (stopType.index + 1)).round().clamp(0, itemsCount); @@ -203,3 +223,12 @@ class MeteringContainerBuidler extends StatelessWidget { return exposurePairs.sublist(startCut, itemsCount - endCut); } } + +double calcShutterSpeed(double stopValue) { + final shutterSpeed = pow(2, stopValue); + if (stopValue < 1.5) { + return (shutterSpeed * 10).round() / 10; + } else { + return shutterSpeed.roundToDouble(); + } +} diff --git a/lib/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/components/range_picker_list_tile/widget_list_tile_range_picker.dart b/lib/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/components/range_picker_list_tile/widget_list_tile_range_picker.dart index bad6081..95b2435 100644 --- a/lib/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/components/range_picker_list_tile/widget_list_tile_range_picker.dart +++ b/lib/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/components/range_picker_list_tile/widget_list_tile_range_picker.dart @@ -8,6 +8,8 @@ class RangePickerListTile extends StatelessWidget { final String description; final List selectedValues; final List values; + final String Function(BuildContext context, T value)? trailingAdapter; + final String Function(BuildContext context, T value)? dialogValueAdapter; final ValueChanged> onChanged; const RangePickerListTile({ @@ -16,6 +18,8 @@ class RangePickerListTile extends StatelessWidget { required this.description, required this.selectedValues, required this.values, + this.trailingAdapter, + this.dialogValueAdapter, required this.onChanged, super.key, }); @@ -25,7 +29,7 @@ class RangePickerListTile extends StatelessWidget { return ListTile( leading: Icon(icon), title: Text(title), - trailing: Text("${selectedValues.first} - ${selectedValues.last}"), + trailing: Text(_trailing(context)), onTap: () { showDialog>( context: context, @@ -35,7 +39,7 @@ class RangePickerListTile extends StatelessWidget { description: description, values: values, selectedValues: selectedValues, - titleAdapter: (_, value) => value.toString(), + valueAdapter: (context, value) => dialogValueAdapter?.call(context, value) ?? value.toString(), ), ).then((values) { if (values != null) { @@ -45,4 +49,16 @@ class RangePickerListTile extends StatelessWidget { }, ); } + + String _trailing(BuildContext context) { + final buffer = StringBuffer(); + buffer.write(trailingAdapter?.call(context, selectedValues.first) ?? selectedValues.first); + if (selectedValues.first != selectedValues.last) { + buffer.writeAll([ + ' - ', + trailingAdapter?.call(context, selectedValues.last) ?? selectedValues.last, + ]); + } + return buffer.toString(); + } } diff --git a/lib/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/widget_container_equipment_profile.dart b/lib/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/widget_container_equipment_profile.dart index bb1cc72..8504c67 100644 --- a/lib/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/widget_container_equipment_profile.dart +++ b/lib/screens/settings/components/metering/components/equipment_profiles/components/equipment_profile_screen/components/equipment_profile_container/widget_container_equipment_profile.dart @@ -269,6 +269,10 @@ class _AnimatedEquipmentListTiles extends AnimatedWidget { values: ShutterSpeedValue.values, selectedValues: equipmentData.shutterSpeedValues, onChanged: onShutterSpeedValuesSelected, + trailingAdapter: (context, value) => + value.value == 1 ? S.of(context).shutterSpeedManualShort : value.toString(), + dialogValueAdapter: (context, value) => + value.value == 1 ? S.of(context).shutterSpeedManual : value.toString(), ), SliderPickerListTile( icon: Icons.zoom_in, diff --git a/lib/screens/settings/components/shared/dialog_range_picker/widget_dialog_picker_range.dart b/lib/screens/settings/components/shared/dialog_range_picker/widget_dialog_picker_range.dart index 56f7967..aedf1aa 100644 --- a/lib/screens/settings/components/shared/dialog_range_picker/widget_dialog_picker_range.dart +++ b/lib/screens/settings/components/shared/dialog_range_picker/widget_dialog_picker_range.dart @@ -9,7 +9,7 @@ class DialogRangePicker extends StatefulWidget { final String description; final List values; final List selectedValues; - final String Function(BuildContext context, T value) titleAdapter; + final String Function(BuildContext context, T value) valueAdapter; const DialogRangePicker({ required this.icon, @@ -17,7 +17,7 @@ class DialogRangePicker extends StatefulWidget { required this.description, required this.values, required this.selectedValues, - required this.titleAdapter, + required this.valueAdapter, super.key, }); @@ -52,8 +52,8 @@ class _DialogRangePickerState extends State { child: MockIAPProviders( equipmentProfiles: mockEquipmentProfiles, selectedEquipmentProfileId: mockEquipmentProfiles.first.id, - films: films, + selectedFilm: mockFilms.first, child: Builder( builder: (context) { return MaterialApp( diff --git a/test/screens/metering/components/shared/readings_container/equipment_profile_picker_test.dart b/test/screens/metering/components/shared/readings_container/equipment_profile_picker_test.dart index 731ce4e..0953190 100644 --- a/test/screens/metering/components/shared/readings_container/equipment_profile_picker_test.dart +++ b/test/screens/metering/components/shared/readings_container/equipment_profile_picker_test.dart @@ -91,7 +91,7 @@ final _mockEquipmentProfiles = [ ndValues: NdValue.values.sublist(0, 3), shutterSpeedValues: ShutterSpeedValue.values.sublist( ShutterSpeedValue.values.indexOf(const ShutterSpeedValue(1000, true, StopType.full)), - ShutterSpeedValue.values.indexOf(const ShutterSpeedValue(16, false, StopType.full)) + 1, + ShutterSpeedValue.values.indexOf(const ShutterSpeedValue(1, false, StopType.full)) + 1, ), isoValues: const [ IsoValue(50, StopType.full), diff --git a/test/screens/metering/components/shared/readings_container/extreme_exposure_pairs_container_test.dart b/test/screens/metering/components/shared/readings_container/extreme_exposure_pairs_container_test.dart index 819a9eb..1a6641f 100644 --- a/test/screens/metering/components/shared/readings_container/extreme_exposure_pairs_container_test.dart +++ b/test/screens/metering/components/shared/readings_container/extreme_exposure_pairs_container_test.dart @@ -38,7 +38,7 @@ void main() { expect(find.descendant(of: pickerFinder, matching: find.text(S.current.fastestExposurePair)), findsOneWidget); expect(find.descendant(of: pickerFinder, matching: find.text(S.current.slowestExposurePair)), findsOneWidget); expect(find.descendant(of: pickerFinder, matching: find.text('f/1.0 - 1/2000')), findsOneWidget); - expect(find.descendant(of: pickerFinder, matching: find.text('f/45 - 16"')), findsOneWidget); + expect(find.descendant(of: pickerFinder, matching: find.text('f/45 - 1"')), findsOneWidget); }, ); } diff --git a/test/screens/metering/goldens/metering_screen.png b/test/screens/metering/goldens/metering_screen.png index dfcad3f..05ccb4e 100644 Binary files a/test/screens/metering/goldens/metering_screen.png and b/test/screens/metering/goldens/metering_screen.png differ diff --git a/test/screens/metering/screen_metering_test.dart b/test/screens/metering/screen_metering_test.dart index ffcca8d..44d0ee5 100644 --- a/test/screens/metering/screen_metering_test.dart +++ b/test/screens/metering/screen_metering_test.dart @@ -2,6 +2,7 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:lightmeter/data/models/exposure_pair.dart'; import 'package:lightmeter/screens/metering/screen_metering.dart'; import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart'; +import 'package:meta/meta.dart'; void main() { const defaultEquipmentProfile = EquipmentProfile( @@ -13,7 +14,7 @@ void main() { isoValues: IsoValue.values, ); - group('Empty list', () { + group('Edge cases', () { List exposurePairsFull(double ev) => MeteringContainerBuidler.buildExposureValues( ev, StopType.full, @@ -28,312 +29,87 @@ void main() { expect(exposurePairsFull(double.infinity), const []); }); - test('Big ass number', () { + test('Small number', () { + final exposurePairs = exposurePairsFull(-5); + expect( + exposurePairs.first, + const ExposurePair( + ApertureValue(1.0, StopType.full), + ShutterSpeedValue(32, false, StopType.full), + ), + ); + expect( + exposurePairs.last, + const ExposurePair( + ApertureValue(45, StopType.full), + ShutterSpeedValue(65536, false, StopType.full), + ), + ); + }); + + test('Big number', () { expect(exposurePairsFull(23), const []); }); }); - group('Default equipment profile', () { - group("StopType.full", () { - List exposurePairsFull(double ev) => - MeteringContainerBuidler.buildExposureValues( - ev, - StopType.full, - defaultEquipmentProfile, - ); + _testEvForStops( + 'Default equipment profile /', + equipmentProfile: defaultEquipmentProfile, + ev10: ( + first: const ExposurePair( + ApertureValue(1, StopType.full), + ShutterSpeedValue(2, true, StopType.full), + ), + last: const ExposurePair( + ApertureValue(45, StopType.full), + ShutterSpeedValue(1024, false, StopType.full), + ), + ), + ev13: ( + first: const ExposurePair( + ApertureValue(1, StopType.full), + ShutterSpeedValue(2.5, true, StopType.third), + ), + last: const ExposurePair( + ApertureValue(45, StopType.full), + ShutterSpeedValue(813, false, StopType.third), + ), + ), + ev15: ( + first: const ExposurePair( + ApertureValue(1, StopType.full), + ShutterSpeedValue(3, true, StopType.half), + ), + last: const ExposurePair( + ApertureValue(45, StopType.full), + ShutterSpeedValue(724, false, StopType.full), + ), + ), + ev17: ( + first: const ExposurePair( + ApertureValue(1, StopType.full), + ShutterSpeedValue(3, true, StopType.third), + ), + last: const ExposurePair( + ApertureValue(45, StopType.full), + ShutterSpeedValue(645, false, StopType.third), + ), + ), + ev20: ( + first: const ExposurePair( + ApertureValue(1, StopType.full), + ShutterSpeedValue(4, true, StopType.full), + ), + last: const ExposurePair( + ApertureValue(45, StopType.full), + ShutterSpeedValue(512, false, StopType.full), + ), + ), + ); - test('EV 1', () { - final exposurePairs = exposurePairsFull(1); - expect( - exposurePairs.first, - const ExposurePair( - ApertureValue(1, StopType.full), - ShutterSpeedValue(2, true, StopType.full), - ), - ); - expect( - exposurePairs.last, - const ExposurePair( - ApertureValue(5.6, StopType.full), - ShutterSpeedValue(16, false, StopType.full), - ), - ); - }); - - test('EV 1.3', () { - final exposurePairs = exposurePairsFull(1.3); - expect( - exposurePairs.first, - const ExposurePair( - ApertureValue(1, StopType.full), - ShutterSpeedValue(2, true, StopType.full), - ), - ); - expect( - exposurePairs.last, - const ExposurePair( - ApertureValue(5.6, StopType.full), - ShutterSpeedValue(16, false, StopType.full), - ), - ); - }); - - test('EV 1.5', () { - final exposurePairs = exposurePairsFull(1.5); - expect( - exposurePairs.first, - const ExposurePair( - ApertureValue(1, StopType.full), - ShutterSpeedValue(4, true, StopType.full), - ), - ); - expect( - exposurePairs.last, - const ExposurePair( - ApertureValue(8, StopType.full), - ShutterSpeedValue(16, false, StopType.full), - ), - ); - }); - - test('EV 1.7', () { - final exposurePairs = exposurePairsFull(1.7); - expect( - exposurePairs.first, - const ExposurePair( - ApertureValue(1, StopType.full), - ShutterSpeedValue(4, true, StopType.full), - ), - ); - expect( - exposurePairs.last, - const ExposurePair( - ApertureValue(8, StopType.full), - ShutterSpeedValue(16, false, StopType.full), - ), - ); - }); - - test('EV 2', () { - final exposurePairs = exposurePairsFull(2); - expect( - exposurePairs.first, - const ExposurePair( - ApertureValue(1, StopType.full), - ShutterSpeedValue(4, true, StopType.full), - ), - ); - expect( - exposurePairs.last, - const ExposurePair( - ApertureValue(8, StopType.full), - ShutterSpeedValue(16, false, StopType.full), - ), - ); - }); - }); - - group("StopType.half", () { - List exposurePairsFull(double ev) => - MeteringContainerBuidler.buildExposureValues( - ev, - StopType.half, - defaultEquipmentProfile, - ); - - test('EV 1', () { - final exposurePairs = exposurePairsFull(1); - expect( - exposurePairs.first, - const ExposurePair( - ApertureValue(1, StopType.full), - ShutterSpeedValue(2, true, StopType.full), - ), - ); - expect( - exposurePairs.last, - const ExposurePair( - ApertureValue(5.6, StopType.full), - ShutterSpeedValue(16, false, StopType.full), - ), - ); - }); - - test('EV 1.3', () { - final exposurePairs = exposurePairsFull(1.3); - expect( - exposurePairs.first, - const ExposurePair( - ApertureValue(1, StopType.full), - ShutterSpeedValue(3, true, StopType.half), - ), - ); - expect( - exposurePairs.last, - const ExposurePair( - ApertureValue(6.7, StopType.full), - ShutterSpeedValue(16, false, StopType.full), - ), - ); - }); - - test('EV 1.5', () { - final exposurePairs = exposurePairsFull(1.5); - expect( - exposurePairs.first, - const ExposurePair( - ApertureValue(1, StopType.full), - ShutterSpeedValue(3, true, StopType.half), - ), - ); - expect( - exposurePairs.last, - const ExposurePair( - ApertureValue(6.7, StopType.full), - ShutterSpeedValue(16, false, StopType.full), - ), - ); - }); - - test('EV 1.7', () { - final exposurePairs = exposurePairsFull(1.7); - expect( - exposurePairs.first, - const ExposurePair( - ApertureValue(1, StopType.full), - ShutterSpeedValue(3, true, StopType.half), - ), - ); - expect( - exposurePairs.last, - const ExposurePair( - ApertureValue(6.7, StopType.full), - ShutterSpeedValue(16, false, StopType.full), - ), - ); - }); - - test('EV 2', () { - final exposurePairs = exposurePairsFull(2); - expect( - exposurePairs.first, - const ExposurePair( - ApertureValue(1, StopType.full), - ShutterSpeedValue(4, true, StopType.full), - ), - ); - expect( - exposurePairs.last, - const ExposurePair( - ApertureValue(8, StopType.full), - ShutterSpeedValue(16, false, StopType.full), - ), - ); - }); - }); - - group("StopType.third", () { - List exposurePairsFull(double ev) => - MeteringContainerBuidler.buildExposureValues( - ev, - StopType.third, - defaultEquipmentProfile, - ); - - test('EV 1', () { - final exposurePairs = exposurePairsFull(1); - expect( - exposurePairs.first, - const ExposurePair( - ApertureValue(1, StopType.full), - ShutterSpeedValue(2, true, StopType.full), - ), - ); - expect( - exposurePairs.last, - const ExposurePair( - ApertureValue(5.6, StopType.full), - ShutterSpeedValue(16, false, StopType.full), - ), - ); - }); - - test('EV 1.3', () { - final exposurePairs = exposurePairsFull(1.3); - expect( - exposurePairs.first, - const ExposurePair( - ApertureValue(1, StopType.full), - ShutterSpeedValue(2.5, true, StopType.third), - ), - ); - expect( - exposurePairs.last, - const ExposurePair( - ApertureValue(6.3, StopType.third), - ShutterSpeedValue(16, false, StopType.full), - ), - ); - }); - - test('EV 1.5', () { - final exposurePairs = exposurePairsFull(1.5); - expect( - exposurePairs.first, - const ExposurePair( - ApertureValue(1, StopType.full), - ShutterSpeedValue(3, true, StopType.third), - ), - ); - expect( - exposurePairs.last, - const ExposurePair( - ApertureValue(7.1, StopType.third), - ShutterSpeedValue(16, false, StopType.full), - ), - ); - }); - - test('EV 1.7', () { - final exposurePairs = exposurePairsFull(1.7); - expect( - exposurePairs.first, - const ExposurePair( - ApertureValue(1, StopType.full), - ShutterSpeedValue(3, true, StopType.third), - ), - ); - expect( - exposurePairs.last, - const ExposurePair( - ApertureValue(7.1, StopType.third), - ShutterSpeedValue(16, false, StopType.full), - ), - ); - }); - - test('EV 2', () { - final exposurePairs = exposurePairsFull(2); - expect( - exposurePairs.first, - const ExposurePair( - ApertureValue(1, StopType.full), - ShutterSpeedValue(4, true, StopType.full), - ), - ); - expect( - exposurePairs.last, - const ExposurePair( - ApertureValue(8, StopType.full), - ShutterSpeedValue(16, false, StopType.full), - ), - ); - }); - }); - }); - - group('Shutter speed 1/1000-1/2"', () { - final equipmentProfile = EquipmentProfile( + _testEvForStops( + 'Shutter speed 1/1000-1/2" /', + equipmentProfile: EquipmentProfile( id: "1", name: 'Test1', apertureValues: ApertureValue.values, @@ -343,612 +119,244 @@ void main() { ShutterSpeedValue.values.indexOf(const ShutterSpeedValue(2, true, StopType.full)) + 1, ), isoValues: IsoValue.values, - ); + ), + ev10: ( + first: const ExposurePair( + ApertureValue(1.0, StopType.full), + ShutterSpeedValue(2, true, StopType.full), + ), + last: const ExposurePair( + ApertureValue(1.0, StopType.full), + ShutterSpeedValue(2, true, StopType.full), + ), + ), + ev13: ( + first: const ExposurePair( + ApertureValue(1.0, StopType.full), + ShutterSpeedValue(2.5, true, StopType.third), + ), + last: const ExposurePair( + ApertureValue(1.1, StopType.third), + ShutterSpeedValue(2, true, StopType.full), + ), + ), + ev15: ( + first: const ExposurePair( + ApertureValue(1.0, StopType.full), + ShutterSpeedValue(3, true, StopType.half), + ), + last: const ExposurePair( + ApertureValue(1.2, StopType.half), + ShutterSpeedValue(2, true, StopType.full), + ), + ), + ev17: ( + first: const ExposurePair( + ApertureValue(1.0, StopType.full), + ShutterSpeedValue(3, true, StopType.third), + ), + last: const ExposurePair( + ApertureValue(1.2, StopType.third), + ShutterSpeedValue(2, true, StopType.full), + ), + ), + ev20: ( + first: const ExposurePair( + ApertureValue(1.0, StopType.full), + ShutterSpeedValue(4, true, StopType.full), + ), + last: const ExposurePair( + ApertureValue(1.4, StopType.full), + ShutterSpeedValue(2, true, StopType.full), + ), + ), + ); - group("StopType.full", () { - List exposurePairsFull(double ev) => - MeteringContainerBuidler.buildExposureValues( - ev, - StopType.full, - equipmentProfile, - ); - - test('EV 1', () { - final exposurePairs = exposurePairsFull(1); - expect( - exposurePairs.first, - const ExposurePair( - ApertureValue(1.0, StopType.full), - ShutterSpeedValue(2, true, StopType.full), - ), - ); - expect( - exposurePairs.last, - const ExposurePair( - ApertureValue(1.0, StopType.full), - ShutterSpeedValue(2, true, StopType.full), - ), - ); - }); - - test('EV 1.3', () { - final exposurePairs = exposurePairsFull(1.3); - expect( - exposurePairs.first, - const ExposurePair( - ApertureValue(1.0, StopType.full), - ShutterSpeedValue(2, true, StopType.full), - ), - ); - expect( - exposurePairs.last, - const ExposurePair( - ApertureValue(1.0, StopType.full), - ShutterSpeedValue(2, true, StopType.full), - ), - ); - }); - - test('EV 1.5', () { - final exposurePairs = exposurePairsFull(1.5); - expect( - exposurePairs.first, - const ExposurePair( - ApertureValue(1.0, StopType.full), - ShutterSpeedValue(4, true, StopType.full), - ), - ); - expect( - exposurePairs.last, - const ExposurePair( - ApertureValue(1.4, StopType.full), - ShutterSpeedValue(2, true, StopType.full), - ), - ); - }); - - test('EV 1.7', () { - final exposurePairs = exposurePairsFull(1.7); - expect( - exposurePairs.first, - const ExposurePair( - ApertureValue(1.0, StopType.full), - ShutterSpeedValue(4, true, StopType.full), - ), - ); - expect( - exposurePairs.last, - const ExposurePair( - ApertureValue(1.4, StopType.full), - ShutterSpeedValue(2, true, StopType.full), - ), - ); - }); - - test('EV 2', () { - final exposurePairs = exposurePairsFull(2); - expect( - exposurePairs.first, - const ExposurePair( - ApertureValue(1.0, StopType.full), - ShutterSpeedValue(4, true, StopType.full), - ), - ); - expect( - exposurePairs.last, - const ExposurePair( - ApertureValue(1.4, StopType.full), - ShutterSpeedValue(2, true, StopType.full), - ), - ); - }); - }); - - group("StopType.half", () { - List exposurePairsFull(double ev) => - MeteringContainerBuidler.buildExposureValues( - ev, - StopType.half, - equipmentProfile, - ); - - test('EV 1', () { - final exposurePairs = exposurePairsFull(1); - expect( - exposurePairs.first, - const ExposurePair( - ApertureValue(1.0, StopType.full), - ShutterSpeedValue(2, true, StopType.full), - ), - ); - expect( - exposurePairs.last, - const ExposurePair( - ApertureValue(1.0, StopType.full), - ShutterSpeedValue(2, true, StopType.full), - ), - ); - }); - - test('EV 1.3', () { - final exposurePairs = exposurePairsFull(1.3); - expect( - exposurePairs.first, - const ExposurePair( - ApertureValue(1.0, StopType.full), - ShutterSpeedValue(3, true, StopType.half), - ), - ); - expect( - exposurePairs.last, - const ExposurePair( - ApertureValue(1.2, StopType.half), - ShutterSpeedValue(2, true, StopType.full), - ), - ); - }); - - test('EV 1.5', () { - final exposurePairs = exposurePairsFull(1.5); - expect( - exposurePairs.first, - const ExposurePair( - ApertureValue(1.0, StopType.full), - ShutterSpeedValue(3, true, StopType.half), - ), - ); - expect( - exposurePairs.last, - const ExposurePair( - ApertureValue(1.2, StopType.half), - ShutterSpeedValue(2, true, StopType.full), - ), - ); - }); - - test('EV 1.7', () { - final exposurePairs = exposurePairsFull(1.7); - expect( - exposurePairs.first, - const ExposurePair( - ApertureValue(1.0, StopType.full), - ShutterSpeedValue(3, true, StopType.half), - ), - ); - expect( - exposurePairs.last, - const ExposurePair( - ApertureValue(1.2, StopType.half), - ShutterSpeedValue(2, true, StopType.full), - ), - ); - }); - - test('EV 2', () { - final exposurePairs = exposurePairsFull(2); - expect( - exposurePairs.first, - const ExposurePair( - ApertureValue(1.0, StopType.full), - ShutterSpeedValue(4, true, StopType.full), - ), - ); - expect( - exposurePairs.last, - const ExposurePair( - ApertureValue(1.4, StopType.full), - ShutterSpeedValue(2, true, StopType.full), - ), - ); - }); - }); - - group("StopType.third", () { - List exposurePairsFull(double ev) => - MeteringContainerBuidler.buildExposureValues( - ev, - StopType.third, - equipmentProfile, - ); - - test('EV 1', () { - final exposurePairs = exposurePairsFull(1); - expect( - exposurePairs.first, - const ExposurePair( - ApertureValue(1.0, StopType.full), - ShutterSpeedValue(2, true, StopType.full), - ), - ); - expect( - exposurePairs.last, - const ExposurePair( - ApertureValue(1.0, StopType.full), - ShutterSpeedValue(2, true, StopType.full), - ), - ); - }); - - test('EV 1.3', () { - final exposurePairs = exposurePairsFull(1.3); - expect( - exposurePairs.first, - const ExposurePair( - ApertureValue(1.0, StopType.full), - ShutterSpeedValue(2.5, true, StopType.third), - ), - ); - expect( - exposurePairs.last, - const ExposurePair( - ApertureValue(1.1, StopType.third), - ShutterSpeedValue(2, true, StopType.full), - ), - ); - }); - - test('EV 1.5', () { - final exposurePairs = exposurePairsFull(1.5); - expect( - exposurePairs.first, - const ExposurePair( - ApertureValue(1.0, StopType.full), - ShutterSpeedValue(3, true, StopType.third), - ), - ); - expect( - exposurePairs.last, - const ExposurePair( - ApertureValue(1.2, StopType.third), - ShutterSpeedValue(2, true, StopType.full), - ), - ); - }); - - test('EV 1.7', () { - final exposurePairs = exposurePairsFull(1.7); - expect( - exposurePairs.first, - const ExposurePair( - ApertureValue(1.0, StopType.full), - ShutterSpeedValue(3, true, StopType.third), - ), - ); - expect( - exposurePairs.last, - const ExposurePair( - ApertureValue(1.2, StopType.third), - ShutterSpeedValue(2, true, StopType.full), - ), - ); - }); - - test('EV 2', () { - final exposurePairs = exposurePairsFull(2); - expect( - exposurePairs.first, - const ExposurePair( - ApertureValue(1.0, StopType.full), - ShutterSpeedValue(4, true, StopType.full), - ), - ); - expect( - exposurePairs.last, - const ExposurePair( - ApertureValue(1.4, StopType.full), - ShutterSpeedValue(2, true, StopType.full), - ), - ); - }); - }); - }); - - group('Shutter speed 2"-16"', () { - final equipmentProfile = EquipmentProfile( + _testEvForStops( + 'Shutter speed 1/1000-B /', + equipmentProfile: EquipmentProfile( id: "1", name: 'Test1', apertureValues: ApertureValue.values.sublist(4), ndValues: NdValue.values, - shutterSpeedValues: ShutterSpeedValue.values.sublist( - ShutterSpeedValue.values.indexOf(const ShutterSpeedValue(2, false, StopType.full)), - ), + shutterSpeedValues: [ShutterSpeedValue.values.last], isoValues: IsoValue.values, - ); + ), + ev10: ( + first: const ExposurePair( + ApertureValue(1.4, StopType.full), + ShutterSpeedValue(1, false, StopType.full), + ), + last: const ExposurePair( + ApertureValue(45, StopType.full), + ShutterSpeedValue(17 * 60 + 4, false, StopType.full), + ), + ), + ev13: ( + first: const ExposurePair( + ApertureValue(1.6, StopType.third), + ShutterSpeedValue(1, false, StopType.full), + ), + last: const ExposurePair( + ApertureValue(45, StopType.full), + ShutterSpeedValue(13 * 60 + 33, false, StopType.full), + ), + ), + ev15: ( + first: const ExposurePair( + ApertureValue(1.7, StopType.half), + ShutterSpeedValue(1, false, StopType.full), + ), + last: const ExposurePair( + ApertureValue(45, StopType.full), + ShutterSpeedValue(12 * 60 + 4, false, StopType.full), + ), + ), + ev17: ( + first: const ExposurePair( + ApertureValue(1.8, StopType.third), + ShutterSpeedValue(1, false, StopType.full), + ), + last: const ExposurePair( + ApertureValue(45, StopType.full), + ShutterSpeedValue(10 * 60 + 45, false, StopType.full), + ), + ), + ev20: ( + first: const ExposurePair( + ApertureValue(2.0, StopType.full), + ShutterSpeedValue(1, false, StopType.full), + ), + last: const ExposurePair( + ApertureValue(45, StopType.full), + ShutterSpeedValue(8 * 60 + 32, false, StopType.full), + ), + ), + ); +} - group("StopType.full", () { - List exposurePairsFull(double ev) => - MeteringContainerBuidler.buildExposureValues( +@isTestGroup +void _testEvForStops( + String description, { + required EquipmentProfile equipmentProfile, + required ({ExposurePair first, ExposurePair last}) ev10, + required ({ExposurePair first, ExposurePair last}) ev13, + required ({ExposurePair first, ExposurePair last}) ev15, + required ({ExposurePair first, ExposurePair last}) ev17, + required ({ExposurePair first, ExposurePair last}) ev20, +}) { + group(description, () { + group("StopType.full /", () { + List exposurePairsFull(double ev) => MeteringContainerBuidler.buildExposureValues( ev, StopType.full, equipmentProfile, ); - test('EV 1', () { + test('EV 1.0', () { final exposurePairs = exposurePairsFull(1); - expect( - exposurePairs.first, - const ExposurePair( - ApertureValue(2.0, StopType.full), - ShutterSpeedValue(2, false, StopType.full), - ), - ); - expect( - exposurePairs.last, - const ExposurePair( - ApertureValue(5.6, StopType.full), - ShutterSpeedValue(16, false, StopType.full), - ), - ); + expect(exposurePairs.first, ev10.first); + expect(exposurePairs.last, ev10.last); }); test('EV 1.3', () { final exposurePairs = exposurePairsFull(1.3); - expect( - exposurePairs.first, - const ExposurePair( - ApertureValue(2.0, StopType.full), - ShutterSpeedValue(2, false, StopType.full), - ), - ); - expect( - exposurePairs.last, - const ExposurePair( - ApertureValue(5.6, StopType.full), - ShutterSpeedValue(16, false, StopType.full), - ), - ); + expect(exposurePairs.first, ev10.first); + expect(exposurePairs.last, ev10.last); }); test('EV 1.5', () { final exposurePairs = exposurePairsFull(1.5); - expect( - exposurePairs.first, - const ExposurePair( - ApertureValue(2.8, StopType.full), - ShutterSpeedValue(2, false, StopType.full), - ), - ); - expect( - exposurePairs.last, - const ExposurePair( - ApertureValue(8, StopType.full), - ShutterSpeedValue(16, false, StopType.full), - ), - ); + expect(exposurePairs.first, ev20.first); + expect(exposurePairs.last, ev20.last); }); test('EV 1.7', () { final exposurePairs = exposurePairsFull(1.7); - expect( - exposurePairs.first, - const ExposurePair( - ApertureValue(2.8, StopType.full), - ShutterSpeedValue(2, false, StopType.full), - ), - ); - expect( - exposurePairs.last, - const ExposurePair( - ApertureValue(8, StopType.full), - ShutterSpeedValue(16, false, StopType.full), - ), - ); + expect(exposurePairs.first, ev20.first); + expect(exposurePairs.last, ev20.last); }); - test('EV 2', () { + test('EV 2.0', () { final exposurePairs = exposurePairsFull(2); - expect( - exposurePairs.first, - const ExposurePair( - ApertureValue(2.8, StopType.full), - ShutterSpeedValue(2, false, StopType.full), - ), - ); - expect( - exposurePairs.last, - const ExposurePair( - ApertureValue(8, StopType.full), - ShutterSpeedValue(16, false, StopType.full), - ), - ); + expect(exposurePairs.first, ev20.first); + expect(exposurePairs.last, ev20.last); }); }); - group("StopType.half", () { - List exposurePairsFull(double ev) => - MeteringContainerBuidler.buildExposureValues( + group("StopType.half /", () { + List exposurePairsFull(double ev) => MeteringContainerBuidler.buildExposureValues( ev, StopType.half, equipmentProfile, ); - test('EV 1', () { + test('EV 1.0', () { final exposurePairs = exposurePairsFull(1); - expect( - exposurePairs.first, - const ExposurePair( - ApertureValue(2.0, StopType.full), - ShutterSpeedValue(2, false, StopType.full), - ), - ); - expect( - exposurePairs.last, - const ExposurePair( - ApertureValue(5.6, StopType.full), - ShutterSpeedValue(16, false, StopType.full), - ), - ); + expect(exposurePairs.first, ev10.first); + expect(exposurePairs.last, ev10.last); }); test('EV 1.3', () { final exposurePairs = exposurePairsFull(1.3); - expect( - exposurePairs.first, - const ExposurePair( - ApertureValue(2.4, StopType.half), - ShutterSpeedValue(2, false, StopType.full), - ), - ); - expect( - exposurePairs.last, - const ExposurePair( - ApertureValue(6.7, StopType.full), - ShutterSpeedValue(16, false, StopType.full), - ), - ); + expect(exposurePairs.first, ev15.first); + expect(exposurePairs.last, ev15.last); }); test('EV 1.5', () { final exposurePairs = exposurePairsFull(1.5); - expect( - exposurePairs.first, - const ExposurePair( - ApertureValue(2.4, StopType.half), - ShutterSpeedValue(2, false, StopType.full), - ), - ); - expect( - exposurePairs.last, - const ExposurePair( - ApertureValue(6.7, StopType.full), - ShutterSpeedValue(16, false, StopType.full), - ), - ); + expect(exposurePairs.first, ev15.first); + expect(exposurePairs.last, ev15.last); }); test('EV 1.7', () { final exposurePairs = exposurePairsFull(1.7); - expect( - exposurePairs.first, - const ExposurePair( - ApertureValue(2.4, StopType.half), - ShutterSpeedValue(2, false, StopType.full), - ), - ); - expect( - exposurePairs.last, - const ExposurePair( - ApertureValue(6.7, StopType.full), - ShutterSpeedValue(16, false, StopType.full), - ), - ); + expect(exposurePairs.first, ev15.first); + expect(exposurePairs.last, ev15.last); }); - test('EV 2', () { + test('EV 2.0', () { final exposurePairs = exposurePairsFull(2); - expect( - exposurePairs.first, - const ExposurePair( - ApertureValue(2.8, StopType.full), - ShutterSpeedValue(2, false, StopType.full), - ), - ); - expect( - exposurePairs.last, - const ExposurePair( - ApertureValue(8, StopType.full), - ShutterSpeedValue(16, false, StopType.full), - ), - ); + expect(exposurePairs.first, ev20.first); + expect(exposurePairs.last, ev20.last); }); }); - group("StopType.third", () { - List exposurePairsFull(double ev) => - MeteringContainerBuidler.buildExposureValues( + group("StopType.third /", () { + List exposurePairsFull(double ev) => MeteringContainerBuidler.buildExposureValues( ev, StopType.third, equipmentProfile, ); - test('EV 1', () { + test('EV 1.0', () { final exposurePairs = exposurePairsFull(1); - expect( - exposurePairs.first, - const ExposurePair( - ApertureValue(2.0, StopType.full), - ShutterSpeedValue(2, false, StopType.full), - ), - ); - expect( - exposurePairs.last, - const ExposurePair( - ApertureValue(5.6, StopType.full), - ShutterSpeedValue(16, false, StopType.full), - ), - ); + expect(exposurePairs.first, ev10.first); + expect(exposurePairs.last, ev10.last); }); test('EV 1.3', () { final exposurePairs = exposurePairsFull(1.3); - expect( - exposurePairs.first, - const ExposurePair( - ApertureValue(2.2, StopType.full), - ShutterSpeedValue(2, false, StopType.full), - ), - ); - expect( - exposurePairs.last, - const ExposurePair( - ApertureValue(6.3, StopType.full), - ShutterSpeedValue(16, false, StopType.full), - ), - ); + expect(exposurePairs.first, ev13.first); + expect(exposurePairs.last, ev13.last); }); test('EV 1.5', () { final exposurePairs = exposurePairsFull(1.5); - expect( - exposurePairs.first, - const ExposurePair( - ApertureValue(2.4, StopType.full), - ShutterSpeedValue(2, false, StopType.full), - ), - ); - expect( - exposurePairs.last, - const ExposurePair( - ApertureValue(7.1, StopType.full), - ShutterSpeedValue(16, false, StopType.full), - ), - ); + expect(exposurePairs.first, ev17.first); + expect(exposurePairs.last, ev17.last); }); test('EV 1.7', () { final exposurePairs = exposurePairsFull(1.7); - expect( - exposurePairs.first, - const ExposurePair( - ApertureValue(2.4, StopType.full), - ShutterSpeedValue(2, false, StopType.third), - ), - ); - expect( - exposurePairs.last, - const ExposurePair( - ApertureValue(7.1, StopType.third), - ShutterSpeedValue(16, false, StopType.full), - ), - ); + expect(exposurePairs.first, ev17.first); + expect(exposurePairs.last, ev17.last); }); - test('EV 2', () { + test('EV 2.0', () { final exposurePairs = exposurePairsFull(2); - expect( - exposurePairs.first, - const ExposurePair( - ApertureValue(2.8, StopType.full), - ShutterSpeedValue(2, false, StopType.full), - ), - ); - expect( - exposurePairs.last, - const ExposurePair( - ApertureValue(8, StopType.full), - ShutterSpeedValue(16, false, StopType.full), - ), - ); + expect(exposurePairs.first, ev20.first); + expect(exposurePairs.last, ev20.last); }); }); });