Skip to content

Commit

Permalink
Refactor temperature unit helpers
Browse files Browse the repository at this point in the history
  • Loading branch information
duddu committed Oct 22, 2023
1 parent 1afef81 commit 3d7d5e0
Show file tree
Hide file tree
Showing 17 changed files with 155 additions and 103 deletions.
2 changes: 1 addition & 1 deletion VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1.9.2
1.9.3
4 changes: 2 additions & 2 deletions integration_test/calculator.test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import 'package:flutter_test/flutter_test.dart';
import 'package:integration_test/integration_test.dart';
import 'package:sourdoc/constants/locale.dart' as locale;
import 'package:sourdoc/main.dart';
import 'package:sourdoc/methods/convert_temperature_unit.dart';
import 'package:sourdoc/methods/temperature_unit_helpers.dart';

void _expectCalculatorValues({
required TemperatureUnit temperatureUnit,
Expand All @@ -29,7 +29,7 @@ void _expectCalculatorValues({
widget.decoration!.prefixText ==
'${locale.inputPrefixTemperature}:' &&
widget.decoration!.suffixText ==
temperatureUnitMap[temperatureUnit]?.unit &&
getTemperatureUnitSymbol(temperatureUnit) &&
widget.controller!.text == temperature),
findsOneWidget);
expect(
Expand Down
32 changes: 21 additions & 11 deletions lib/constants/form.dart
Original file line number Diff line number Diff line change
@@ -1,22 +1,32 @@
import 'package:sourdoc/methods/convert_temperature_unit.dart';
import 'package:sourdoc/methods/temperature_unit_helpers.dart';

// Default initial values
const TemperatureUnit defaultTemperatureUnit = TemperatureUnit.celsius;
final String defaultTemperatureUnitValue =
temperatureUnitMap[defaultTemperatureUnit]!.unit;
const Map<TemperatureUnit, String> defaultTemperatureMap = {
TemperatureUnit.celsius: '22',
TemperatureUnit.farenheit: '72'
};
final String defaultTemperatureUnitSymbol =
getTemperatureUnitSymbol(defaultTemperatureUnit);
const String defaultTotalWeight = '700';
const String defaultHydration = '70';
const String defaultSaltLevel = '2';
String getDefaultTemperature(TemperatureUnit temperatureUnit) {
if (temperatureUnit == TemperatureUnit.celsius) {
return '22';
}
if (temperatureUnit == TemperatureUnit.farenheit) {
return '72';
}
throw ArgumentError.value('temperatureUnit');
}

// Maximum values
const Map<TemperatureUnit, double> maxValueTemperatureMap = {
TemperatureUnit.celsius: 40,
TemperatureUnit.farenheit: 104
};
const double maxValueTotalWeight = 9999;
const double maxValueHydration = 99;
const double maxValueSaltLevel = 10;
double getMaxValueTemperature(TemperatureUnit temperatureUnit) {
if (temperatureUnit == TemperatureUnit.celsius) {
return 40;
}
if (temperatureUnit == TemperatureUnit.farenheit) {
return 104;
}
throw ArgumentError.value('temperatureUnit');
}
26 changes: 0 additions & 26 deletions lib/methods/convert_temperature_unit.dart

This file was deleted.

4 changes: 2 additions & 2 deletions lib/methods/get_fermentation_values.dart
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import 'package:sourdoc/methods/convert_temperature_unit.dart';
import 'package:sourdoc/methods/temperature_unit_helpers.dart';

double _convertFromFarenheit(double temperature, TemperatureUnit unit) {
double convertedTemperature = temperature;
if (unit == TemperatureUnit.farenheit) {
convertedTemperature =
convertTemperatureUnit(convertedTemperature, TemperatureUnit.celsius);
convertTemperatureToUnit(convertedTemperature, TemperatureUnit.celsius);
}
return convertedTemperature;
}
Expand Down
43 changes: 43 additions & 0 deletions lib/methods/temperature_unit_helpers.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
import 'package:sourdoc/constants/locale.dart' as locale;

enum TemperatureUnit { celsius, farenheit }

class TemperatureUnitDescriptor {
TemperatureUnitDescriptor(
{required this.name, required this.symbol, required this.description});

final TemperatureUnit name;
final String symbol;
final String description;
}

final Set<TemperatureUnitDescriptor> temperatureUnitSet = {
TemperatureUnitDescriptor(
name: TemperatureUnit.celsius,
symbol: locale.unitDegreesCelsius,
description: locale.degreesCelsius),
TemperatureUnitDescriptor(
name: TemperatureUnit.farenheit,
symbol: locale.unitDegreesFarenheit,
description: locale.degreesFarenheit)
};

String getTemperatureUnitSymbol(TemperatureUnit temperatureUnit) {
return temperatureUnitSet
.singleWhere((unit) => unit.name == temperatureUnit)
.symbol;
}

TemperatureUnit getTemperatureUnitName(String symbol) {
return temperatureUnitSet.singleWhere((unit) => unit.symbol == symbol).name;
}

double convertTemperatureToUnit(double temperature, TemperatureUnit toUnit) {
if (toUnit == TemperatureUnit.celsius) {
return 5 / 9 * (temperature - 32);
}
if (toUnit == TemperatureUnit.farenheit) {
return 9 / 5 * temperature + 32;
}
throw ArgumentError.value('toUnit');
}
2 changes: 1 addition & 1 deletion lib/models/calculator_model.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import 'package:flutter/foundation.dart';
import 'package:sourdoc/methods/convert_temperature_unit.dart';
import 'package:sourdoc/methods/temperature_unit_helpers.dart';
import 'package:sourdoc/methods/get_fermentation_values.dart';
import 'package:sourdoc/methods/get_ingredients_values.dart';

Expand Down
6 changes: 3 additions & 3 deletions lib/models/temperature_unit_model.dart
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
import 'package:flutter/foundation.dart';
import 'package:sourdoc/constants/form.dart' as form;
import 'package:sourdoc/methods/convert_temperature_unit.dart';
import 'package:sourdoc/methods/temperature_unit_helpers.dart';

class TemperatureUnitModel extends ChangeNotifier {
TemperatureUnit _temperatureUnit = form.defaultTemperatureUnit;

TemperatureUnit get temperatureUnit => _temperatureUnit;
String get temperatureUnitToString =>
temperatureUnitMap[_temperatureUnit]!.unit;
String get temperatureUnitSymbol =>
getTemperatureUnitSymbol(_temperatureUnit);

void updateTemperatureUnit(TemperatureUnit newTemperatureUnit) {
if (newTemperatureUnit == _temperatureUnit) {
Expand Down
44 changes: 22 additions & 22 deletions lib/widgets/home_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import 'package:sourdoc/constants/form.dart' as form;
import 'package:sourdoc/constants/locale.dart' as locale;
import 'package:sourdoc/constants/routes.dart';
import 'package:sourdoc/constants/style.dart' as style;
import 'package:sourdoc/methods/convert_temperature_unit.dart';
import 'package:sourdoc/methods/temperature_unit_helpers.dart';
import 'package:sourdoc/methods/persist_initial_values.dart';
import 'package:sourdoc/models/calculator_model.dart';
import 'package:sourdoc/models/temperature_unit_model.dart';
Expand Down Expand Up @@ -105,6 +105,13 @@ class _CalculatorFormState extends State<CalculatorForm> {
final hydrationController = TextEditingController();
final saltController = TextEditingController();

final unitChoiceList = temperatureUnitSet
.map((element) => UnitSingleChoiceDescriptor(
value: element.name,
label: element.symbol,
tooltip: element.description))
.toList();

double _parseValue(TextEditingController controller) {
if (controller.value.text.isEmpty) {
return 0;
Expand All @@ -127,12 +134,12 @@ class _CalculatorFormState extends State<CalculatorForm> {
void _onTemperatureUnitSelectionChanged(TemperatureUnit selection) {
Provider.of<TemperatureUnitModel>(context, listen: false)
.updateTemperatureUnit(selection);
storeInitialValue(temperatureUnitKey, temperatureUnitMap[selection]!.unit);
storeInitialValue(temperatureUnitKey, getTemperatureUnitSymbol(selection));
if (temperatureController.text.isNotEmpty) {
temperatureController.text =
convertTemperatureUnit(_parseValue(temperatureController), selection)
.toStringAsFixed(1)
.replaceFirst('.0', '');
temperatureController.text = convertTemperatureToUnit(
_parseValue(temperatureController), selection)
.toStringAsFixed(1)
.replaceFirst('.0', '');
storeInitialValue(temperatureKey, temperatureController.text);
}
}
Expand All @@ -158,19 +165,17 @@ class _CalculatorFormState extends State<CalculatorForm> {
storeInitialValue(saltLevelKey, saltController.text);
}

Future<TemperatureUnit> _getInitialTemperatureUnit() async {
Future<TemperatureUnit> _getInitialTemperatureSymbol() async {
final String initialValueUnit = await getInitialOrDefaultValue(
temperatureUnitKey, form.defaultTemperatureUnitValue);
return temperatureUnitMap.entries
.firstWhere((e) => e.value.unit == initialValueUnit)
.key;
temperatureUnitKey, form.defaultTemperatureUnitSymbol);
return getTemperatureUnitName(initialValueUnit);
}

Future<void> _loadInitialValues() async {
final TemperatureUnit initialTemperatureUnit =
await _getInitialTemperatureUnit();
await _getInitialTemperatureSymbol();
temperatureController.text = await getInitialOrDefaultValue(
temperatureKey, form.defaultTemperatureMap[initialTemperatureUnit]!);
temperatureKey, form.getDefaultTemperature(initialTemperatureUnit));
totalWeightController.text =
await getInitialOrDefaultValue(totalWeightKey, form.defaultTotalWeight);
hydrationController.text =
Expand Down Expand Up @@ -201,13 +206,8 @@ class _CalculatorFormState extends State<CalculatorForm> {
.merge(TextStyle(color: Colors.grey.shade800))),
UnitChoice<TemperatureUnit>(
a11yLabel: locale.a11yTemperatureUnitChoiceLabel,
unitList: temperatureUnitMap.entries
.map((element) => UnitSingleChoiceDescriptor(
value: element.key,
label: element.value.unit,
tooltip: element.value.description))
.toList(),
getInitialUnitValue: _getInitialTemperatureUnit,
unitList: unitChoiceList,
getInitialUnitValue: _getInitialTemperatureSymbol,
onSelectionChanged: _onTemperatureUnitSelectionChanged),
],
),
Expand All @@ -218,9 +218,9 @@ class _CalculatorFormState extends State<CalculatorForm> {
paddingTop: 10,
controller: temperatureController,
prefixText: locale.inputPrefixTemperature,
suffixText: model.temperatureUnitToString,
suffixText: model.temperatureUnitSymbol,
tooltip: locale.inputTooltipTemperature,
maxValue: form.maxValueTemperatureMap[model.temperatureUnit]!,
maxValue: form.getMaxValueTemperature(model.temperatureUnit),
onChangedCallback: () {
_onTemperatureChanged(model.temperatureUnit);
},
Expand Down
2 changes: 1 addition & 1 deletion lib/widgets/version_info.dart
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ class VersionInfoItem extends StatelessWidget {
Future<void> _launchUrl(String url) async {
if (!await launchUrl(Uri.parse(url),
mode: LaunchMode.externalApplication)) {
throw Exception('Could not launch $_commitUrl');
throw Exception('Could not launch the url: $url');
}
}

Expand Down
25 changes: 0 additions & 25 deletions test/methods/convert_temperature_unit_test.dart

This file was deleted.

2 changes: 1 addition & 1 deletion test/methods/get_fermentation_values_test.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import 'package:flutter_test/flutter_test.dart';
import 'package:sourdoc/methods/convert_temperature_unit.dart';
import 'package:sourdoc/methods/temperature_unit_helpers.dart';
import 'package:sourdoc/methods/get_fermentation_values.dart';

void main() {
Expand Down
50 changes: 50 additions & 0 deletions test/methods/temperature_unit_helpers_test.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
import 'package:flutter_test/flutter_test.dart';
import 'package:sourdoc/constants/locale.dart' as locale;
import 'package:sourdoc/methods/temperature_unit_helpers.dart';

void main() {
group('temperatureUnitSet', () {
test('should have the correct lenght', () {
expect(temperatureUnitSet.length, 2);
});

test('should have the correct ordered keys', () {
expect(
temperatureUnitSet
.singleWhere((unit) => unit.name == TemperatureUnit.celsius),
isInstanceOf<TemperatureUnitDescriptor>());
expect(
temperatureUnitSet
.singleWhere((unit) => unit.name == TemperatureUnit.farenheit),
isInstanceOf<TemperatureUnitDescriptor>());
});
});

group('getTemperatureUnitSymbol', () {
test('should get the unit\'s symbol from its name', () {
expect(getTemperatureUnitSymbol(TemperatureUnit.celsius),
locale.unitDegreesCelsius);
expect(getTemperatureUnitSymbol(TemperatureUnit.farenheit),
locale.unitDegreesFarenheit);
});
});

group('getTemperatureUnitSymbol', () {
test('should get the unit\'s name from its symbol', () {
expect(getTemperatureUnitName(locale.unitDegreesCelsius),
TemperatureUnit.celsius);
expect(getTemperatureUnitName(locale.unitDegreesFarenheit),
TemperatureUnit.farenheit);
});
});

group('convertTemperatureUnit', () {
test('should convert farenheit to celsius', () {
expect(convertTemperatureToUnit(20, TemperatureUnit.farenheit), 68);
});

test('should convert celsius to farenheit', () {
expect(convertTemperatureToUnit(68, TemperatureUnit.celsius), 20);
});
});
}
2 changes: 1 addition & 1 deletion test/models/calculator_model_test.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import 'package:flutter_test/flutter_test.dart';
import 'package:sourdoc/methods/convert_temperature_unit.dart';
import 'package:sourdoc/methods/temperature_unit_helpers.dart';
import 'package:sourdoc/models/calculator_model.dart';

void main() {
Expand Down
10 changes: 5 additions & 5 deletions test/models/temperature_unit_model_test.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import 'package:flutter_test/flutter_test.dart';
import 'package:sourdoc/methods/convert_temperature_unit.dart';
import 'package:sourdoc/methods/temperature_unit_helpers.dart';
import 'package:sourdoc/models/temperature_unit_model.dart';

void main() {
Expand All @@ -11,17 +11,17 @@ void main() {

test('should have a default unit to string', () {
final model = TemperatureUnitModel();
expect(model.temperatureUnitToString,
temperatureUnitMap[TemperatureUnit.celsius]!.unit);
expect(model.temperatureUnitSymbol,
getTemperatureUnitSymbol(TemperatureUnit.celsius));
});

test('should update unit', () {
final model = TemperatureUnitModel();
var i = 0;
model.addListener(() {
expect(model.temperatureUnit, TemperatureUnit.farenheit);
expect(model.temperatureUnitToString,
temperatureUnitMap[TemperatureUnit.farenheit]!.unit);
expect(model.temperatureUnitSymbol,
getTemperatureUnitSymbol(TemperatureUnit.farenheit));
i++;
});
model.updateTemperatureUnit(TemperatureUnit.farenheit);
Expand Down
Loading

0 comments on commit 3d7d5e0

Please sign in to comment.