From b59082c6b558705d4bd5effce2ae4b98c8a3ebe5 Mon Sep 17 00:00:00 2001 From: Adrien Hopkins Date: Mon, 4 Oct 2021 18:26:58 -0500 Subject: Added tests for valid & invalid dimension files --- src/main/java/sevenUnits/unit/UnitDatabase.java | 32 +++++++--- .../java/sevenUnits/unit/UnitDatabaseTest.java | 68 +++++++++++++++++++++- src/test/resources/test-dimensionfile-invalid1.txt | 3 + src/test/resources/test-dimensionfile-invalid2.txt | 1 + src/test/resources/test-dimensionfile-invalid3.txt | 5 ++ src/test/resources/test-dimensionfile-valid1.txt | 12 ++++ 6 files changed, 110 insertions(+), 11 deletions(-) create mode 100644 src/test/resources/test-dimensionfile-invalid1.txt create mode 100644 src/test/resources/test-dimensionfile-invalid2.txt create mode 100644 src/test/resources/test-dimensionfile-invalid3.txt create mode 100644 src/test/resources/test-dimensionfile-valid1.txt diff --git a/src/main/java/sevenUnits/unit/UnitDatabase.java b/src/main/java/sevenUnits/unit/UnitDatabase.java index a1dbb0a..7c72570 100644 --- a/src/main/java/sevenUnits/unit/UnitDatabase.java +++ b/src/main/java/sevenUnits/unit/UnitDatabase.java @@ -1344,10 +1344,10 @@ public final class UnitDatabase { final String name = lineMatcher.group(1); final String expression = lineMatcher.group(2); - if (name.endsWith(" ")) { - System.err.printf("Warning - line %d's dimension name ends in a space", - lineCounter); - } + // if (name.endsWith(" ")) { + // System.err.printf("Warning - line %d's dimension name ends in a space", + // lineCounter); + // } // if expression is "!", search for an existing dimension // if no unit found, throw an error @@ -1360,7 +1360,7 @@ public final class UnitDatabase { final ObjectProduct dimension; try { dimension = this.getDimensionFromExpression(expression); - } catch (final IllegalArgumentException e) { + } catch (final IllegalArgumentException | NoSuchElementException e) { System.err.printf("Parsing error on line %d:%n", lineCounter); throw e; } @@ -1444,7 +1444,8 @@ public final class UnitDatabase { final UnitPrefix prefix; try { prefix = this.getPrefixFromExpression(expression); - } catch (final IllegalArgumentException e) { + } catch (final IllegalArgumentException + | NoSuchElementException e) { System.err.printf("Parsing error on line %d:%n", lineCounter); throw e; } @@ -1454,7 +1455,8 @@ public final class UnitDatabase { final Unit unit; try { unit = this.getUnitFromExpression(expression); - } catch (final IllegalArgumentException e) { + } catch (final IllegalArgumentException + | NoSuchElementException e) { System.err.printf("Parsing error on line %d:%n", lineCounter); throw e; } @@ -1582,8 +1584,15 @@ public final class UnitDatabase { } return base.toExponent(exponent); + } else { + final ObjectProduct dimension = this.dimensions + .get(name); + if (dimension == null) + throw new NoSuchElementException( + "No dimension with name \"" + name + "\"."); + else + return dimension; } - return this.dimensions.get(name); } /** @@ -1696,7 +1705,12 @@ public final class UnitDatabase { try { return UnitPrefix.valueOf(Double.parseDouble(name)); } catch (final NumberFormatException e) { - return this.prefixes.get(name); + final UnitPrefix prefix = this.prefixes.get(name); + if (prefix == null) + throw new NoSuchElementException( + "No prefix with name \"" + name + "\"."); + else + return prefix; } } diff --git a/src/test/java/sevenUnits/unit/UnitDatabaseTest.java b/src/test/java/sevenUnits/unit/UnitDatabaseTest.java index 7612fc5..ed3b6b5 100644 --- a/src/test/java/sevenUnits/unit/UnitDatabaseTest.java +++ b/src/test/java/sevenUnits/unit/UnitDatabaseTest.java @@ -72,6 +72,23 @@ class UnitDatabaseTest { private static final UnitPrefix AB = UnitPrefix.valueOf(7); private static final UnitPrefix BC = UnitPrefix.valueOf(11); + /** + * Loads the dimensionfile at src/test/resources/[path] to the database + * {@code loadTo}. + * + * @param loadTo database to load to + * @param path path of file to load + * @since 2021-10-04 + */ + private static void loadDimensionFile(UnitDatabase loadTo, String path) { + try (final InputStream testFile = UnitDatabaseTest.class + .getResourceAsStream(path)) { + loadTo.loadDimensionsFromStream(testFile); + } catch (final IOException e) { + fail(e.getClass() + " occurred upon loading file \"" + path + "\"."); + } + } + /** * Loads the unitfile at src/test/resources/[path] to the database * {@code loadTo}. @@ -140,6 +157,27 @@ class UnitDatabaseTest { assertThrows(IllegalStateException.class, () -> keySet.toArray()); } + /** + * A bunch of tests for invalid dimension files + * + * @param num which file to test + * @since 2021-10-04 + */ + @ParameterizedTest + @ValueSource(ints = { 1, 2, 3 }) + public void testLoadingInvalidDimensionFile(int num) { + final UnitDatabase database = new UnitDatabase(); + database.addDimension("LENGTH", Metric.Dimensions.LENGTH); + database.addDimension("MASS", Metric.Dimensions.MASS); + database.addDimension("TIME", Metric.Dimensions.TIME); + final String filename = String.format("/test-dimensionfile-invalid%d.txt", + num); + final RuntimeException e = assertThrows(RuntimeException.class, + () -> loadDimensionFile(database, filename)); + assertTrue(e instanceof IllegalArgumentException + || e instanceof NoSuchElementException); + } + /** * A bunch of tests for invalid unit files * @@ -148,12 +186,32 @@ class UnitDatabaseTest { */ @ParameterizedTest @ValueSource(ints = { 1, 2, 3, 4, 5 }) - public void testLoadingInvalidFile(int num) { + public void testLoadingInvalidUnitFile(int num) { final UnitDatabase database = new UnitDatabase(); final String filename = String.format("/test-unitsfile-invalid%d.txt", num); - assertThrows(IllegalArgumentException.class, + final RuntimeException e = assertThrows(RuntimeException.class, () -> loadUnitsFile(database, filename)); + assertTrue(e instanceof IllegalArgumentException + || e instanceof NoSuchElementException); + } + + /** + * Tests loading a valid dimension-file with some derived dimensions. + * + * @since 2021-10-04 + */ + @Test + public void testLoadingValidDimensions() { + final UnitDatabase database = new UnitDatabase(); + database.addDimension("LENGTH", Metric.Dimensions.LENGTH); + database.addDimension("MASS", Metric.Dimensions.MASS); + database.addDimension("TIME", Metric.Dimensions.TIME); + + loadDimensionFile(database, "/test-dimensionfile-valid1.txt"); + assertEquals(Metric.Dimensions.ENERGY, database.getDimension("ENERGY")); + assertEquals(Metric.Dimensions.POWER, database.getDimension("POWER")); + } /** @@ -207,6 +265,12 @@ class UnitDatabaseTest { final Unit actual3 = database.getUnit("test3"); assertEquals(expected3, actual3); + final UnitValue expected4 = UnitValue.of(U, 1); + final UnitValue actual4 = database + .evaluateUnitExpression("-5 * U + -3 * U + 12 * U - 3 * U") + .asUnitValue(); + assertEquals(expected4, actual4); + assertTrue(System.err.toString().length() > 0); } diff --git a/src/test/resources/test-dimensionfile-invalid1.txt b/src/test/resources/test-dimensionfile-invalid1.txt new file mode 100644 index 0000000..ff9ccd8 --- /dev/null +++ b/src/test/resources/test-dimensionfile-invalid1.txt @@ -0,0 +1,3 @@ +LENGTH +MASS +TIME diff --git a/src/test/resources/test-dimensionfile-invalid2.txt b/src/test/resources/test-dimensionfile-invalid2.txt new file mode 100644 index 0000000..2818cfc --- /dev/null +++ b/src/test/resources/test-dimensionfile-invalid2.txt @@ -0,0 +1 @@ +NONEXISTENT ! diff --git a/src/test/resources/test-dimensionfile-invalid3.txt b/src/test/resources/test-dimensionfile-invalid3.txt new file mode 100644 index 0000000..a16f941 --- /dev/null +++ b/src/test/resources/test-dimensionfile-invalid3.txt @@ -0,0 +1,5 @@ +LENGTH ! +MASS ! +TIME ! + +BAD LENGTH +-+ TIME \ No newline at end of file diff --git a/src/test/resources/test-dimensionfile-valid1.txt b/src/test/resources/test-dimensionfile-valid1.txt new file mode 100644 index 0000000..fc6a426 --- /dev/null +++ b/src/test/resources/test-dimensionfile-valid1.txt @@ -0,0 +1,12 @@ +LENGTH ! +MASS ! +TIME ! + +ENERGY MASS * LENGTH^2 / TIME^2 +POWER ENERGY / TIME + +# doesn't work, but would require major changes to fix properly +# for now, just don't use brackets in dimension expressions +# (note that the unit/prefix expressions use a complete hack +# to enable this, one that doesn't work for dimensions) +# POWER MASS * (LENGTH / TIME)^2 / TIME \ No newline at end of file -- cgit v1.2.3