summaryrefslogtreecommitdiff
path: root/src/org/unitConverter/unit
diff options
context:
space:
mode:
Diffstat (limited to 'src/org/unitConverter/unit')
-rw-r--r--src/org/unitConverter/unit/UnitDatabase.java43
-rw-r--r--src/org/unitConverter/unit/UnitDatabaseTest.java44
2 files changed, 31 insertions, 56 deletions
diff --git a/src/org/unitConverter/unit/UnitDatabase.java b/src/org/unitConverter/unit/UnitDatabase.java
index 56846a1..9812bd0 100644
--- a/src/org/unitConverter/unit/UnitDatabase.java
+++ b/src/org/unitConverter/unit/UnitDatabase.java
@@ -1680,37 +1680,30 @@ public final class UnitDatabase {
* @since 2020-08-26
*/
List<UnitPrefix> getPrefixesFromName(final String unitName) {
- if (this.prefixlessUnits.containsKey(unitName))
- return new ArrayList<>();
- else {
+ final List<UnitPrefix> prefixes = new ArrayList<>();
+ String name = unitName;
+
+ while (!this.prefixlessUnits.containsKey(name)) {
// find the longest prefix
- String longestPrefix = null;
- int longestLength = 0;
+ String longestPrefixName = null;
+ int longestLength = name.length();
- for (final String prefixName : this.prefixes.keySet()) {
- // a prefix name is valid if:
- // - it is prefixed (i.e. the unit name starts with it)
- // - it is longer than the existing largest prefix (since I am
- // looking for the longest valid prefix)
- // - the part after the prefix is a valid unit name
- // - the unit described that name is a linear unit (since only
- // linear units can have prefixes)
- if (unitName.startsWith(prefixName)
- && prefixName.length() > longestLength) {
- final String rest = unitName.substring(prefixName.length());
- if (this.containsUnitName(rest)
- && this.getUnit(rest) instanceof LinearUnit) {
- longestPrefix = prefixName;
- longestLength = prefixName.length();
- }
+ while (longestPrefixName == null) {
+ longestLength--;
+ if (longestLength <= 0)
+ throw new AssertionError(
+ "No prefix found in " + name + ", but it is not a unit!");
+ if (this.prefixes.containsKey(name.substring(0, longestLength))) {
+ longestPrefixName = name.substring(0, longestLength);
}
}
- final List<UnitPrefix> prefixes = this
- .getPrefixesFromName(unitName.substring(longestLength));
- prefixes.add(this.getPrefix(longestPrefix));
- return prefixes;
+ // longest prefix found!
+ final UnitPrefix prefix = this.getPrefix(longestPrefixName);
+ prefixes.add(0, prefix);
+ name = name.substring(longestLength);
}
+ return prefixes;
}
/**
diff --git a/src/org/unitConverter/unit/UnitDatabaseTest.java b/src/org/unitConverter/unit/UnitDatabaseTest.java
index 96a0b83..2b981b6 100644
--- a/src/org/unitConverter/unit/UnitDatabaseTest.java
+++ b/src/org/unitConverter/unit/UnitDatabaseTest.java
@@ -20,7 +20,6 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
-import static org.junit.jupiter.api.Assertions.fail;
import java.util.Arrays;
import java.util.Iterator;
@@ -28,6 +27,7 @@ import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.NoSuchElementException;
+import java.util.Set;
import org.junit.jupiter.api.Test;
@@ -55,9 +55,12 @@ class UnitDatabaseTest {
.fromConversionFunctions(SI.METRE.getBase(), o -> o + 1, o -> o - 1);
// make the prefix values prime so I can tell which multiplications were made
- private static final UnitPrefix A = UnitPrefix.valueOf(2);
- private static final UnitPrefix B = UnitPrefix.valueOf(3);
- private static final UnitPrefix C = UnitPrefix.valueOf(5);
+ private static final UnitPrefix A = UnitPrefix.valueOf(2)
+ .withName(NameSymbol.ofName("A"));
+ private static final UnitPrefix B = UnitPrefix.valueOf(3)
+ .withName(NameSymbol.ofName("B"));
+ private static final UnitPrefix C = UnitPrefix.valueOf(5)
+ .withName(NameSymbol.ofName("C"));
private static final UnitPrefix AB = UnitPrefix.valueOf(7);
private static final UnitPrefix BC = UnitPrefix.valueOf(11);
@@ -68,6 +71,7 @@ class UnitDatabaseTest {
* @since 2019-05-03
*/
@Test
+ // @Timeout(value = 5, unit = TimeUnit.SECONDS)
public void testInfiniteSetExceptions() {
// load units
final UnitDatabase infiniteDatabase = new UnitDatabase();
@@ -79,33 +83,11 @@ class UnitDatabaseTest {
infiniteDatabase.addPrefix("B", B);
infiniteDatabase.addPrefix("C", C);
- {
- boolean exceptionThrown = false;
- try {
- infiniteDatabase.unitMap().entrySet().toArray();
- } catch (final IllegalStateException e) {
- exceptionThrown = true;
- // pass!
- } finally {
- if (!exceptionThrown) {
- fail("No IllegalStateException thrown");
- }
- }
- }
-
- {
- boolean exceptionThrown = false;
- try {
- infiniteDatabase.unitMap().keySet().toArray();
- } catch (final IllegalStateException e) {
- exceptionThrown = true;
- // pass!
- } finally {
- if (!exceptionThrown) {
- fail("No IllegalStateException thrown");
- }
- }
- }
+ final Set<Entry<String, Unit>> entrySet = infiniteDatabase.unitMap()
+ .entrySet();
+ final Set<String> keySet = infiniteDatabase.unitMap().keySet();
+ assertThrows(IllegalStateException.class, () -> entrySet.toArray());
+ assertThrows(IllegalStateException.class, () -> keySet.toArray());
}
/**