summaryrefslogtreecommitdiff
path: root/src/main/java/sevenUnitsGUI/Presenter.java
diff options
context:
space:
mode:
authorAdrien Hopkins <ahopk127@my.yorku.ca>2022-02-26 11:15:04 -0500
committerAdrien Hopkins <ahopk127@my.yorku.ca>2022-02-26 11:15:49 -0500
commit934213e08e85cc20bd994d0f39567426c21b89eb (patch)
treeb6a6ec78124e854246478f001fd0d816703e39ce /src/main/java/sevenUnitsGUI/Presenter.java
parent07c86e02be29aa3d3d878adce62c5c0a9a458e47 (diff)
Implemented expression conversion, tests now pass
Diffstat (limited to 'src/main/java/sevenUnitsGUI/Presenter.java')
-rw-r--r--src/main/java/sevenUnitsGUI/Presenter.java77
1 files changed, 56 insertions, 21 deletions
diff --git a/src/main/java/sevenUnitsGUI/Presenter.java b/src/main/java/sevenUnitsGUI/Presenter.java
index be02364..57d353d 100644
--- a/src/main/java/sevenUnitsGUI/Presenter.java
+++ b/src/main/java/sevenUnitsGUI/Presenter.java
@@ -23,6 +23,7 @@ import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
+import java.util.NoSuchElementException;
import java.util.Optional;
import java.util.OptionalDouble;
import java.util.Scanner;
@@ -34,6 +35,7 @@ import java.util.stream.Collectors;
import sevenUnits.ProgramInfo;
import sevenUnits.unit.BaseDimension;
import sevenUnits.unit.BritishImperial;
+import sevenUnits.unit.LinearUnitValue;
import sevenUnits.unit.Metric;
import sevenUnits.unit.Unit;
import sevenUnits.unit.UnitDatabase;
@@ -170,7 +172,7 @@ public final class Presenter {
/**
* The database that this presenter communicates with (effectively the model)
*/
- private final UnitDatabase database;
+ final UnitDatabase database;
/**
* The rule used for parsing input numbers. Any number-string inputted into
@@ -274,7 +276,58 @@ public final class Presenter {
* {@link ExpressionConversionView})
* @since 2021-12-15
*/
- public void convertExpressions() {}
+ public void convertExpressions() {
+ if (this.view instanceof ExpressionConversionView) {
+ final ExpressionConversionView xcview = (ExpressionConversionView) this.view;
+
+ final String fromExpression = xcview.getFromExpression();
+ final String toExpression = xcview.getToExpression();
+
+ // expressions must not be empty
+ if (fromExpression.isEmpty()) {
+ this.view.showErrorMessage("Parse Error",
+ "Please enter a unit expression in the From: box.");
+ return;
+ }
+ if (toExpression.isEmpty()) {
+ this.view.showErrorMessage("Parse Error",
+ "Please enter a unit expression in the To: box.");
+ return;
+ }
+
+ // evaluate expressions
+ final LinearUnitValue from;
+ final Unit to;
+ try {
+ from = this.database.evaluateUnitExpression(fromExpression);
+ } catch (final IllegalArgumentException | NoSuchElementException e) {
+ this.view.showErrorMessage("Parse Error",
+ "Could not recognize text in From entry: " + e.getMessage());
+ return;
+ }
+ try {
+ to = this.database.getUnitFromExpression(toExpression);
+ } catch (final IllegalArgumentException | NoSuchElementException e) {
+ this.view.showErrorMessage("Parse Error",
+ "Could not recognize text in To entry: " + e.getMessage());
+ return;
+ }
+
+ // convert and show output
+ if (from.getUnit().canConvertTo(to)) {
+ final double value = from.asUnitValue().convertTo(to).getValue();
+ xcview.showExpressionConversionOutput(fromExpression, toExpression,
+ value);
+ } else {
+ this.view.showErrorMessage("Conversion Error",
+ "Cannot convert between \"" + fromExpression + "\" and \""
+ + toExpression + "\".");
+ }
+
+ } else
+ throw new UnsupportedOperationException(
+ "This function can only be called when the view is an ExpressionConversionView");
+ }
/**
* Converts from the view's input unit to its output unit. Displays an error
@@ -326,8 +379,7 @@ public final class Presenter {
// convert!
final UnitValue initialValue = UnitValue.of(fromUnit, value);
final UnitValue converted = initialValue.convertTo(toUnit);
- ucview.showUnitConversionOutput(
- String.format("%s = %s", initialValue, converted));
+ ucview.showUnitConversionOutput(initialValue, converted);
} else
throw new UnsupportedOperationException(
"This function can only be called when the view is a UnitConversionView.");
@@ -365,23 +417,6 @@ public final class Presenter {
*/
public void saveSettings() {}
- /**
- * Returns true if and only if the unit represented by {@code unitName} has
- * the dimension represented by {@code dimensionName}.
- *
- * @param unitName name of unit to test
- * @param dimensionName name of dimension to test
- * @return whether unit has dimenision
- * @since 2019-04-13
- * @since v0.2.0
- */
- boolean unitMatchesDimension(String unitName, String dimensionName) {
- final Unit unit = this.database.getUnit(unitName);
- final ObjectProduct<BaseDimension> dimension = this.database
- .getDimension(dimensionName);
- return unit.getDimension().equals(dimension);
- }
-
void unitNameSelected() {}
/**