summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAdrien Hopkins <ahopk127@my.yorku.ca>2022-04-16 15:57:00 -0500
committerAdrien Hopkins <ahopk127@my.yorku.ca>2022-04-16 15:57:00 -0500
commit4aaf6a8b60fbec63c2e0bee624b3859ded0ecde3 (patch)
tree7499f304f4c849ded2f9035cb64f87a8cf85e608 /src
parent4ad68a29f84538d3fb19eec8e0622731f5a5d7c8 (diff)
Added a full suite of frontend tests
(Added tests for the settings and unit/prefix viewer parts of the GUI, which are not yet implemented)
Diffstat (limited to 'src')
-rw-r--r--src/main/java/sevenUnits/unit/UnitPrefix.java135
-rw-r--r--src/main/java/sevenUnitsGUI/Presenter.java14
-rw-r--r--src/main/java/sevenUnitsGUI/StandardDisplayRules.java26
-rw-r--r--src/main/java/sevenUnitsGUI/ViewBot.java200
-rw-r--r--src/test/java/sevenUnitsGUI/PresenterTest.java210
5 files changed, 482 insertions, 103 deletions
diff --git a/src/main/java/sevenUnits/unit/UnitPrefix.java b/src/main/java/sevenUnits/unit/UnitPrefix.java
index bf9d1fd..e1f7788 100644
--- a/src/main/java/sevenUnits/unit/UnitPrefix.java
+++ b/src/main/java/sevenUnits/unit/UnitPrefix.java
@@ -17,69 +17,59 @@
package sevenUnits.unit;
import java.util.Objects;
-import java.util.Optional;
-import java.util.Set;
import sevenUnits.utils.DecimalComparison;
import sevenUnits.utils.NameSymbol;
+import sevenUnits.utils.Nameable;
/**
- * A prefix that can be applied to a {@code LinearUnit} to multiply it by some value
+ * A prefix that can be applied to a {@code LinearUnit} to multiply it by some
+ * value
*
* @author Adrien Hopkins
* @since 2019-10-16
*/
-public final class UnitPrefix {
+public final class UnitPrefix implements Nameable {
/**
* Gets a {@code UnitPrefix} from a multiplier
*
- * @param multiplier
- * multiplier of prefix
+ * @param multiplier multiplier of prefix
* @return prefix
* @since 2019-10-16
*/
public static UnitPrefix valueOf(final double multiplier) {
return new UnitPrefix(multiplier, NameSymbol.EMPTY);
}
-
+
/**
* Gets a {@code UnitPrefix} from a multiplier and a name
*
- * @param multiplier
- * multiplier of prefix
- * @param ns
- * name(s) and symbol of prefix
+ * @param multiplier multiplier of prefix
+ * @param ns name(s) and symbol of prefix
* @return prefix
* @since 2019-10-16
- * @throws NullPointerException
- * if ns is null
+ * @throws NullPointerException if ns is null
*/
- public static UnitPrefix valueOf(final double multiplier, final NameSymbol ns) {
- return new UnitPrefix(multiplier, Objects.requireNonNull(ns, "ns must not be null."));
+ public static UnitPrefix valueOf(final double multiplier,
+ final NameSymbol ns) {
+ return new UnitPrefix(multiplier,
+ Objects.requireNonNull(ns, "ns must not be null."));
}
-
- /**
- * This prefix's primary name
- */
- private final Optional<String> primaryName;
-
- /**
- * This prefix's symbol
- */
- private final Optional<String> symbol;
-
+
/**
- * Other names and symbols used by this prefix
+ * This prefix's name(s) and symbol.
+ *
+ * @since 2022-04-16
*/
- private final Set<String> otherNames;
-
+ private final NameSymbol nameSymbol;
+
/**
* The number that this prefix multiplies units by
*
* @since 2019-10-16
*/
private final double multiplier;
-
+
/**
* Creates the {@code DefaultUnitPrefix}.
*
@@ -89,28 +79,24 @@ public final class UnitPrefix {
*/
private UnitPrefix(final double multiplier, final NameSymbol ns) {
this.multiplier = multiplier;
- this.primaryName = ns.getPrimaryName();
- this.symbol = ns.getSymbol();
- this.otherNames = ns.getOtherNames();
+ this.nameSymbol = ns;
}
-
+
/**
* Divides this prefix by a scalar
*
- * @param divisor
- * number to divide by
+ * @param divisor number to divide by
* @return quotient of prefix and scalar
* @since 2019-10-16
*/
public UnitPrefix dividedBy(final double divisor) {
return valueOf(this.getMultiplier() / divisor);
}
-
+
/**
* Divides this prefix by {@code other}.
*
- * @param other
- * prefix to divide by
+ * @param other prefix to divide by
* @return quotient of prefixes
* @since 2019-04-13
* @since v0.2.0
@@ -118,7 +104,7 @@ public final class UnitPrefix {
public UnitPrefix dividedBy(final UnitPrefix other) {
return valueOf(this.getMultiplier() / other.getMultiplier());
}
-
+
/**
* {@inheritDoc}
*
@@ -133,9 +119,10 @@ public final class UnitPrefix {
if (!(obj instanceof UnitPrefix))
return false;
final UnitPrefix other = (UnitPrefix) obj;
- return DecimalComparison.equals(this.getMultiplier(), other.getMultiplier());
+ return DecimalComparison.equals(this.getMultiplier(),
+ other.getMultiplier());
}
-
+
/**
* @return prefix's multiplier
* @since 2019-11-26
@@ -143,31 +130,12 @@ public final class UnitPrefix {
public double getMultiplier() {
return this.multiplier;
}
-
- /**
- * @return other names
- * @since 2019-11-26
- */
- public final Set<String> getOtherNames() {
- return this.otherNames;
- }
-
- /**
- * @return primary name
- * @since 2019-11-26
- */
- public final Optional<String> getPrimaryName() {
- return this.primaryName;
- }
-
- /**
- * @return symbol
- * @since 2019-11-26
- */
- public final Optional<String> getSymbol() {
- return this.symbol;
+
+ @Override
+ public NameSymbol getNameSymbol() {
+ return this.nameSymbol;
}
-
+
/**
* {@inheritDoc}
*
@@ -177,24 +145,22 @@ public final class UnitPrefix {
public int hashCode() {
return DecimalComparison.hash(this.getMultiplier());
}
-
+
/**
* Multiplies this prefix by a scalar
*
- * @param multiplicand
- * number to multiply by
+ * @param multiplicand number to multiply by
* @return product of prefix and scalar
* @since 2019-10-16
*/
public UnitPrefix times(final double multiplicand) {
return valueOf(this.getMultiplier() * multiplicand);
}
-
+
/**
* Multiplies this prefix by {@code other}.
*
- * @param other
- * prefix to multiply by
+ * @param other prefix to multiply by
* @return product of prefixes
* @since 2019-04-13
* @since v0.2.0
@@ -202,12 +168,11 @@ public final class UnitPrefix {
public UnitPrefix times(final UnitPrefix other) {
return valueOf(this.getMultiplier() * other.getMultiplier());
}
-
+
/**
* Raises this prefix to an exponent.
*
- * @param exponent
- * exponent to raise to
+ * @param exponent exponent to raise to
* @return result of exponentiation.
* @since 2019-04-13
* @since v0.2.0
@@ -215,27 +180,27 @@ public final class UnitPrefix {
public UnitPrefix toExponent(final double exponent) {
return valueOf(Math.pow(this.getMultiplier(), exponent));
}
-
+
/**
* @return a string describing the prefix and its multiplier
*/
@Override
public String toString() {
- if (this.primaryName.isPresent())
- return String.format("%s (\u00D7 %s)", this.primaryName.get(), this.multiplier);
- else if (this.symbol.isPresent())
- return String.format("%s (\u00D7 %s)", this.symbol.get(), this.multiplier);
+ if (this.getPrimaryName().isPresent())
+ return String.format("%s (\u00D7 %s)", this.getPrimaryName().get(),
+ this.multiplier);
+ else if (this.getSymbol().isPresent())
+ return String.format("%s (\u00D7 %s)", this.getSymbol().get(),
+ this.multiplier);
else
return String.format("Unit Prefix (\u00D7 %s)", this.multiplier);
}
-
+
/**
- * @param ns
- * name(s) and symbol to use
+ * @param ns name(s) and symbol to use
* @return copy of this prefix with provided name(s) and symbol
* @since 2019-11-26
- * @throws NullPointerException
- * if ns is null
+ * @throws NullPointerException if ns is null
*/
public UnitPrefix withName(final NameSymbol ns) {
return valueOf(this.multiplier, ns);
diff --git a/src/main/java/sevenUnitsGUI/Presenter.java b/src/main/java/sevenUnitsGUI/Presenter.java
index b38f90b..5c8ce53 100644
--- a/src/main/java/sevenUnitsGUI/Presenter.java
+++ b/src/main/java/sevenUnitsGUI/Presenter.java
@@ -18,6 +18,7 @@ package sevenUnitsGUI;
import java.io.IOException;
import java.io.InputStream;
+import java.nio.file.Path;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
@@ -50,7 +51,8 @@ import sevenUnits.utils.UncertainDouble;
*/
public final class Presenter {
/** The default place where settings are stored. */
- private static final String DEFAULT_SETTINGS_FILEPATH = "settings.txt";
+ private static final Path DEFAULT_SETTINGS_FILEPATH = Path
+ .of("settings.txt");
/** The default place where units are stored. */
private static final String DEFAULT_UNITS_FILEPATH = "/unitsfile.txt";
/** The default place where dimensions are stored. */
@@ -406,17 +408,18 @@ public final class Presenter {
*
* @since 2022-03-30
*/
- public boolean isOneWayConversionEnabled() {
+ public boolean oneWayConversionEnabled() {
return this.oneWayConversionEnabled;
}
/**
* Loads settings from the user's settings file and applies them to the
* presenter.
- *
+ *
+ * @param settingsFile file settings should be loaded from
* @since 2021-12-15
*/
- private void loadSettings() {}
+ void loadSettings(Path settingsFile) {}
/**
* Completes creation of the presenter. This part of the initialization
@@ -438,9 +441,10 @@ public final class Presenter {
/**
* Saves the presenter's settings to the user settings file.
*
+ * @param settingsFile file settings should be saved to
* @since 2021-12-15
*/
- private void saveSettings() {}
+ void saveSettings(Path settingsFile) {}
/**
* @param numberDisplayRule the new rule that will be used by this presenter
diff --git a/src/main/java/sevenUnitsGUI/StandardDisplayRules.java b/src/main/java/sevenUnitsGUI/StandardDisplayRules.java
index 331f598..f6272c8 100644
--- a/src/main/java/sevenUnitsGUI/StandardDisplayRules.java
+++ b/src/main/java/sevenUnitsGUI/StandardDisplayRules.java
@@ -45,6 +45,32 @@ final class StandardDisplayRules {
};
/**
+ * Gets a display rule that rounds numbers to a fixed number of decimal
+ * places.
+ *
+ * @param decimalPlaces number of decimal places
+ * @return display rule
+ * @since 2022-04-16
+ */
+ public static final Function<UncertainDouble, String> getFixedPlacesRule(
+ int decimalPlaces) {
+ throw new UnsupportedOperationException("Not implemented yet");
+ }
+
+ /**
+ * Gets a display rule that rounds numbers to a fixed number of significant
+ * figures.
+ *
+ * @param significantFigures number of significant figures
+ * @return display rule
+ * @since 2022-04-16
+ */
+ public static final Function<UncertainDouble, String> getFixedPrecisionRule(
+ int significantFigures) {
+ throw new UnsupportedOperationException("Not implemented yet");
+ }
+
+ /**
* @return a rule that rounds using UncertainDouble's own toString(false)
* function.
* @since 2021-12-24
diff --git a/src/main/java/sevenUnitsGUI/ViewBot.java b/src/main/java/sevenUnitsGUI/ViewBot.java
index 9f9a524..988d1bc 100644
--- a/src/main/java/sevenUnitsGUI/ViewBot.java
+++ b/src/main/java/sevenUnitsGUI/ViewBot.java
@@ -25,6 +25,7 @@ import java.util.Set;
import sevenUnits.unit.UnitType;
import sevenUnits.utils.NameSymbol;
+import sevenUnits.utils.Nameable;
/**
* A class that simulates a View (supports both unit and expression conversion)
@@ -34,6 +35,163 @@ import sevenUnits.utils.NameSymbol;
* @since 2022-01-29
*/
final class ViewBot implements UnitConversionView, ExpressionConversionView {
+ /**
+ * A record of the parameters given to
+ * {@link View#showPrefix(NameSymbol, String)}, for testing.
+ *
+ * @since 2022-04-16
+ */
+ public static final class PrefixViewingRecord implements Nameable {
+ private final NameSymbol nameSymbol;
+ private final String multiplierString;
+
+ /**
+ * @param nameSymbol
+ * @param multiplierString
+ * @since 2022-04-16
+ */
+ public PrefixViewingRecord(NameSymbol nameSymbol,
+ String multiplierString) {
+ this.nameSymbol = nameSymbol;
+ this.multiplierString = multiplierString;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (!(obj instanceof PrefixViewingRecord))
+ return false;
+ final PrefixViewingRecord other = (PrefixViewingRecord) obj;
+ return Objects.equals(this.multiplierString, other.multiplierString)
+ && Objects.equals(this.nameSymbol, other.nameSymbol);
+ }
+
+ @Override
+ public NameSymbol getNameSymbol() {
+ return this.nameSymbol;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(this.multiplierString, this.nameSymbol);
+ }
+
+ public String multiplierString() {
+ return this.multiplierString;
+ }
+
+ public NameSymbol nameSymbol() {
+ return this.nameSymbol;
+ }
+
+ @Override
+ public String toString() {
+ final StringBuilder builder = new StringBuilder();
+ builder.append("PrefixViewingRecord [nameSymbol=");
+ builder.append(this.nameSymbol);
+ builder.append(", multiplierString=");
+ builder.append(this.multiplierString);
+ builder.append("]");
+ return builder.toString();
+ }
+ }
+
+ /**
+ * A record of the parameters given to
+ * {@link View#showUnit(NameSymbol, String, String, UnitType)}, for testing.
+ *
+ * @since 2022-04-16
+ */
+ public static final class UnitViewingRecord implements Nameable {
+ private final NameSymbol nameSymbol;
+ private final String definition;
+ private final String dimensionName;
+ private final UnitType unitType;
+
+ /**
+ * @since 2022-04-16
+ */
+ public UnitViewingRecord(NameSymbol nameSymbol, String definition,
+ String dimensionName, UnitType unitType) {
+ this.nameSymbol = nameSymbol;
+ this.definition = definition;
+ this.dimensionName = dimensionName;
+ this.unitType = unitType;
+ }
+
+ /**
+ * @return the definition
+ * @since 2022-04-16
+ */
+ public String definition() {
+ return this.definition;
+ }
+
+ /**
+ * @return the dimensionName
+ * @since 2022-04-16
+ */
+ public String dimensionName() {
+ return this.dimensionName;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (!(obj instanceof UnitViewingRecord))
+ return false;
+ final UnitViewingRecord other = (UnitViewingRecord) obj;
+ return Objects.equals(this.definition, other.definition)
+ && Objects.equals(this.dimensionName, other.dimensionName)
+ && Objects.equals(this.nameSymbol, other.nameSymbol)
+ && this.unitType == other.unitType;
+ }
+
+ /**
+ * @return the nameSymbol
+ * @since 2022-04-16
+ */
+ @Override
+ public NameSymbol getNameSymbol() {
+ return this.nameSymbol;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(this.definition, this.dimensionName,
+ this.nameSymbol, this.unitType);
+ }
+
+ public NameSymbol nameSymbol() {
+ return this.nameSymbol;
+ }
+
+ @Override
+ public String toString() {
+ final StringBuilder builder = new StringBuilder();
+ builder.append("UnitViewingRecord [nameSymbol=");
+ builder.append(this.nameSymbol);
+ builder.append(", definition=");
+ builder.append(this.definition);
+ builder.append(", dimensionName=");
+ builder.append(this.dimensionName);
+ builder.append(", unitType=");
+ builder.append(this.unitType);
+ builder.append("]");
+ return builder.toString();
+ }
+
+ /**
+ * @return the unitType
+ * @since 2022-04-16
+ */
+ public UnitType unitType() {
+ return this.unitType;
+ }
+ }
+
/** The presenter that works with this ViewBot */
private final Presenter presenter;
@@ -62,6 +220,10 @@ final class ViewBot implements UnitConversionView, ExpressionConversionView {
private final List<UnitConversionRecord> unitConversions;
/** Saved outputs of all unit expressions */
private final List<UnitConversionRecord> expressionConversions;
+ /** Saved outputs of all unit viewings */
+ private final List<UnitViewingRecord> unitViewingRecords;
+ /** Saved outputs of all prefix viewings */
+ private final List<PrefixViewingRecord> prefixViewingRecords;
/**
* Creates a new {@code ViewBot} with a new presenter.
@@ -73,6 +235,8 @@ final class ViewBot implements UnitConversionView, ExpressionConversionView {
this.unitConversions = new ArrayList<>();
this.expressionConversions = new ArrayList<>();
+ this.unitViewingRecords = new ArrayList<>();
+ this.prefixViewingRecords = new ArrayList<>();
}
/**
@@ -80,7 +244,7 @@ final class ViewBot implements UnitConversionView, ExpressionConversionView {
* @since 2022-04-09
*/
public List<UnitConversionRecord> expressionConversionList() {
- return this.expressionConversions;
+ return Collections.unmodifiableList(this.expressionConversions);
}
/**
@@ -158,6 +322,14 @@ final class ViewBot implements UnitConversionView, ExpressionConversionView {
throw new UnsupportedOperationException("Not implemented yet");
}
+ /**
+ * @return list of records of this viewBot's prefix views
+ * @since 2022-04-16
+ */
+ public List<PrefixViewingRecord> prefixViewList() {
+ return Collections.unmodifiableList(this.prefixViewingRecords);
+ }
+
@Override
public void setDimensionNames(Set<String> dimensionNames) {
this.dimensionNames = Objects.requireNonNull(dimensionNames,
@@ -259,6 +431,24 @@ final class ViewBot implements UnitConversionView, ExpressionConversionView {
throw new UnsupportedOperationException("Not implemented yet");
}
+ public void setViewedPrefixName(
+ @SuppressWarnings("unused") Optional<String> viewedPrefixName) {
+ throw new UnsupportedOperationException("Not implemented yet");
+ }
+
+ public void setViewedPrefixName(String viewedPrefixName) {
+ this.setViewedPrefixName(Optional.of(viewedPrefixName));
+ }
+
+ public void setViewedUnitName(
+ @SuppressWarnings("unused") Optional<String> viewedUnitName) {
+ throw new UnsupportedOperationException("Not implemented yet");
+ }
+
+ public void setViewedUnitName(String viewedUnitName) {
+ this.setViewedUnitName(Optional.of(viewedUnitName));
+ }
+
@Override
public void showErrorMessage(String title, String message) {
System.err.printf("%s: %s%n", title, message);
@@ -299,4 +489,12 @@ final class ViewBot implements UnitConversionView, ExpressionConversionView {
public List<UnitConversionRecord> unitConversionList() {
return Collections.unmodifiableList(this.unitConversions);
}
+
+ /**
+ * @return list of records of unit viewings made by this bot
+ * @since 2022-04-16
+ */
+ public List<UnitViewingRecord> unitViewList() {
+ return Collections.unmodifiableList(this.unitViewingRecords);
+ }
}
diff --git a/src/test/java/sevenUnitsGUI/PresenterTest.java b/src/test/java/sevenUnitsGUI/PresenterTest.java
index 3fe7e47..85ebe09 100644
--- a/src/test/java/sevenUnitsGUI/PresenterTest.java
+++ b/src/test/java/sevenUnitsGUI/PresenterTest.java
@@ -17,20 +17,29 @@
package sevenUnitsGUI;
import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assumptions.assumeTrue;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import java.nio.file.Path;
import java.util.List;
import java.util.Set;
+import java.util.function.Function;
import java.util.stream.Collectors;
+import java.util.stream.Stream;
import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.MethodSource;
import sevenUnits.unit.BaseDimension;
+import sevenUnits.unit.BritishImperial;
import sevenUnits.unit.Metric;
import sevenUnits.unit.Unit;
+import sevenUnits.unit.UnitType;
import sevenUnits.unit.UnitValue;
+import sevenUnits.utils.NameSymbol;
import sevenUnits.utils.Nameable;
import sevenUnits.utils.ObjectProduct;
+import sevenUnits.utils.UncertainDouble;
/**
* @author Adrien Hopkins
@@ -38,12 +47,27 @@ import sevenUnits.utils.ObjectProduct;
* @since 2022-02-10
*/
public final class PresenterTest {
+ private static final Path TEST_SETTINGS = Path.of("src", "test", "resources",
+ "test-settings.txt");
static final Set<Unit> testUnits = Set.of(Metric.METRE, Metric.KILOMETRE,
Metric.METRE_PER_SECOND, Metric.KILOMETRE_PER_HOUR);
static final Set<ObjectProduct<BaseDimension>> testDimensions = Set
.of(Metric.Dimensions.LENGTH, Metric.Dimensions.VELOCITY);
+ /**
+ * @return rounding rules used by {@link #testRoundingRules}
+ * @since 2022-04-16
+ */
+ private static final Stream<Function<UncertainDouble, String>> getRoundingRules() {
+ final var SCIENTIFIC_ROUNDING = StandardDisplayRules.getScientificRule();
+ final var INTEGER_ROUNDING = StandardDisplayRules.getFixedPlacesRule(0);
+ final var SIG_FIG_ROUNDING = StandardDisplayRules
+ .getFixedPrecisionRule(4);
+
+ return Stream.of(SCIENTIFIC_ROUNDING, INTEGER_ROUNDING, SIG_FIG_ROUNDING);
+ }
+
private static final Set<String> names(Set<? extends Nameable> units) {
return units.stream().map(Nameable::getName).collect(Collectors.toSet());
}
@@ -106,23 +130,185 @@ public final class PresenterTest {
assertEquals(List.of(expectedUC), viewBot.unitConversionList());
}
+ /**
+ * Tests that duplicate units are successfully removed, if that is asked for
+ *
+ * @since 2022-04-16
+ */
@Test
void testDuplicateUnits() {
- assumeTrue(false, "Not yet implemented");
- /*
- * enable and disable duplicate units and check for those in From and To,
- * include duplicate units in the input set
- */
+ final var metre = Metric.METRE;
+ final var meter = Metric.METRE.withName(NameSymbol.of("meter", "m"));
+
+ // load 2 duplicate units
+ final var viewBot = new ViewBot();
+ final var presenter = new Presenter(viewBot);
+ presenter.database.clear();
+ presenter.database.addUnit("metre", metre);
+ presenter.database.addUnit("meter", meter);
+
+ // test that only one of them is included if duplicate units disabled
+ presenter.setShowDuplicateUnits(false);
+ presenter.updateView();
+ assertEquals(1, viewBot.getFromUnitNames().size());
+ assertEquals(1, viewBot.getToUnitNames().size());
+
+ // test that both of them is included if duplicate units enabled
+ presenter.setShowDuplicateUnits(true);
+ presenter.updateView();
+ assertEquals(2, viewBot.getFromUnitNames().size());
+ assertEquals(2, viewBot.getToUnitNames().size());
}
+ /**
+ * Tests that one-way conversion correctly filters From and To units
+ *
+ * @since 2022-04-16
+ */
@Test
void testOneWayConversion() {
- assumeTrue(false, "Not yet implemented");
- /*
- * enable and disable one-way conversion, testing the units in From and To
- * on each setting to ensure they match the rule. Include at least one
- * metric exception.
- */
+ // metre is metric, inch is non-metric, tempC is semi-metric
+ final var allNames = Set.of("metre", "inch", "tempC");
+ final var metricNames = Set.of("metre", "tempC");
+ final var nonMetricNames = Set.of("inch", "tempC");
+
+ // load view with one metric and one non-metric unit
+ final var viewBot = new ViewBot();
+ final var presenter = new Presenter(viewBot);
+ presenter.database.clear();
+ presenter.database.addUnit("metre", Metric.METRE);
+ presenter.database.addUnit("inch", BritishImperial.Length.INCH);
+ presenter.database.addUnit("tempC", Metric.CELSIUS);
+
+ // test that units are removed from each side when one-way conversion is
+ // enabled
+ presenter.setOneWayConversionEnabled(true);
+ presenter.updateView();
+ assertEquals(metricNames, viewBot.getFromUnitNames());
+ assertEquals(nonMetricNames, viewBot.getToUnitNames());
+
+ // test that units are kept when one-way conversion is disabled
+ presenter.setOneWayConversionEnabled(false);
+ presenter.updateView();
+ assertEquals(allNames, viewBot.getFromUnitNames());
+ assertEquals(allNames, viewBot.getToUnitNames());
+ }
+
+ /**
+ * Tests the prefix-viewing functionality.
+ *
+ * @since 2022-04-16
+ */
+ @Test
+ void testPrefixViewing() {
+ // setup
+ final var viewBot = new ViewBot();
+ final var presenter = new Presenter(viewBot);
+ viewBot.setViewablePrefixNames(Set.of("kilo", "milli"));
+ presenter.setNumberDisplayRule(UncertainDouble::toString);
+
+ // view prefix
+ viewBot.setViewedPrefixName("kilo");
+ presenter.prefixSelected(); // just in case
+
+ // get correct values
+ final var expectedNameSymbol = Metric.KILO.getNameSymbol();
+ final var expectedMultiplierString = String
+ .valueOf(Metric.KILO.getMultiplier());
+
+ // test that presenter's values are correct
+ final var prefixRecord = viewBot.prefixViewList().get(0);
+ assertEquals(expectedNameSymbol, prefixRecord.getNameSymbol());
+ assertEquals(expectedMultiplierString, prefixRecord.multiplierString());
+ }
+
+ /**
+ * Tests that rounding rules are used correctly.
+ *
+ * @since 2022-04-16
+ */
+ @ParameterizedTest
+ @MethodSource("getRoundingRules")
+ void testRoundingRules(Function<UncertainDouble, String> roundingRule) {
+ // setup
+ final var viewBot = new ViewBot();
+ final var presenter = new Presenter(viewBot);
+ presenter.setNumberDisplayRule(roundingRule);
+
+ // convert and round
+ viewBot.setInputValue("12345.6789");
+ viewBot.setFromSelection("metre");
+ viewBot.setToSelection("kilometre");
+ presenter.convertUnits();
+
+ // test the result of the rounding
+ final String expectedOutputString = roundingRule
+ .apply(UncertainDouble.of(12.3456789, 0));
+ final String actualOutputString = viewBot.unitConversionList().get(0)
+ .outputValueString();
+ assertEquals(expectedOutputString, actualOutputString);
+ }
+
+ /**
+ * Tests that settings can be saved to and loaded from a file.
+ *
+ * @since 2022-04-16
+ */
+ @Test
+ void testSettingsSaving() {
+ // setup
+ final var viewBot = new ViewBot();
+ final var presenter = new Presenter(viewBot);
+
+ // set and save custom settings
+ presenter.setOneWayConversionEnabled(true);
+ presenter.setShowDuplicateUnits(true);
+ presenter.setNumberDisplayRule(
+ StandardDisplayRules.getFixedPrecisionRule(11));
+ presenter.saveSettings(TEST_SETTINGS);
+
+ // overwrite custom settings
+ presenter.setOneWayConversionEnabled(false);
+ presenter.setShowDuplicateUnits(false);
+ presenter.setNumberDisplayRule(StandardDisplayRules.getScientificRule());
+
+ // load settings & test that they're the same
+ presenter.loadSettings(TEST_SETTINGS);
+ assertTrue(presenter.oneWayConversionEnabled());
+ assertTrue(presenter.duplicateUnitsShown());
+ assertEquals(StandardDisplayRules.getFixedPlacesRule(11),
+ presenter.getNumberDisplayRule());
+ }
+
+ /**
+ * Ensures the Presenter generates the correct data upon a unit-viewing.
+ *
+ * @since 2022-04-16
+ */
+ @Test
+ void testUnitViewing() {
+ // setup
+ final var viewBot = new ViewBot();
+ final var presenter = new Presenter(viewBot);
+ viewBot.setViewableUnitNames(names(testUnits));
+
+ // view unit
+ viewBot.setViewedUnitName("metre");
+ presenter.unitNameSelected(); // just in case this isn't triggered
+ // automatically
+
+ // get correct values
+ final var expectedNameSymbol = Metric.METRE.getNameSymbol();
+ final var expectedDefinition = Metric.METRE.toDefinitionString();
+ final var expectedDimensionName = Metric.METRE.getDimension().getName();
+ final var expectedUnitType = UnitType.METRIC;
+
+ // test for correctness
+ final var viewRecord = viewBot.unitViewList().get(0);
+ assertEquals(expectedNameSymbol, viewRecord.getNameSymbol());
+ assertEquals(expectedDefinition, viewRecord.definition());
+ assertEquals(expectedDimensionName, viewRecord.dimensionName());
+ assertEquals(expectedUnitType, viewRecord.unitType());
}
/**