From 54e36eda34a508379915b270f4a234693aa1775b Mon Sep 17 00:00:00 2001 From: Adrien Hopkins Date: Wed, 22 Sep 2021 16:51:02 -0500 Subject: Added a test to test loading unitfiles --- src/test/resources/test-unitsfile-valid1.txt | 3 +++ src/test/resources/test-unitsfile-valid2.txt | 3 +++ 2 files changed, 6 insertions(+) create mode 100644 src/test/resources/test-unitsfile-valid1.txt create mode 100644 src/test/resources/test-unitsfile-valid2.txt (limited to 'src/test/resources') diff --git a/src/test/resources/test-unitsfile-valid1.txt b/src/test/resources/test-unitsfile-valid1.txt new file mode 100644 index 0000000..704fd7c --- /dev/null +++ b/src/test/resources/test-unitsfile-valid1.txt @@ -0,0 +1,3 @@ +test1 CBAU +test2 BW CV +test3 AU + CU - BU \ No newline at end of file diff --git a/src/test/resources/test-unitsfile-valid2.txt b/src/test/resources/test-unitsfile-valid2.txt new file mode 100644 index 0000000..7b15e27 --- /dev/null +++ b/src/test/resources/test-unitsfile-valid2.txt @@ -0,0 +1,3 @@ +A- 7 +B- 11 +C- 13 \ No newline at end of file -- cgit v1.2.3 From 544ba103f9903bf885e346d34639c05934655f3f Mon Sep 17 00:00:00 2001 From: Adrien Hopkins Date: Mon, 27 Sep 2021 17:31:22 -0500 Subject: Added some tests for invalid unitfiles --- src/main/java/sevenUnits/unit/UnitDatabase.java | 9 +++++---- src/main/java/sevenUnits/utils/ExpressionParser.java | 8 ++++++++ src/test/java/sevenUnits/unit/UnitDatabaseTest.java | 20 ++++++++++++++++++++ src/test/resources/test-unitsfile-invalid1.txt | 1 + src/test/resources/test-unitsfile-invalid2.txt | 1 + src/test/resources/test-unitsfile-invalid3.txt | 1 + src/test/resources/test-unitsfile-invalid4.txt | 1 + src/test/resources/test-unitsfile-invalid5.txt | 1 + src/test/resources/test-unitsfile-valid1.txt | 5 ++++- 9 files changed, 42 insertions(+), 5 deletions(-) create mode 100644 src/test/resources/test-unitsfile-invalid1.txt create mode 100644 src/test/resources/test-unitsfile-invalid2.txt create mode 100644 src/test/resources/test-unitsfile-invalid3.txt create mode 100644 src/test/resources/test-unitsfile-invalid4.txt create mode 100644 src/test/resources/test-unitsfile-invalid5.txt (limited to 'src/test/resources') diff --git a/src/main/java/sevenUnits/unit/UnitDatabase.java b/src/main/java/sevenUnits/unit/UnitDatabase.java index b45d9cf..a1dbb0a 100644 --- a/src/main/java/sevenUnits/unit/UnitDatabase.java +++ b/src/main/java/sevenUnits/unit/UnitDatabase.java @@ -1427,10 +1427,11 @@ public final class UnitDatabase { final String expression = lineMatcher.group(2); - if (name.endsWith(" ")) { - System.err.printf("Warning - line %d's unit name ends in a space", - lineCounter); - } + // this code should never occur + // if (name.endsWith(" ")) { + // System.err.printf("Warning - line %d's unit name ends in a space", + // lineCounter); + // } // if expression is "!", search for an existing unit // if no unit found, throw an error diff --git a/src/main/java/sevenUnits/utils/ExpressionParser.java b/src/main/java/sevenUnits/utils/ExpressionParser.java index 1d3d44d..3c4abad 100644 --- a/src/main/java/sevenUnits/utils/ExpressionParser.java +++ b/src/main/java/sevenUnits/utils/ExpressionParser.java @@ -461,6 +461,8 @@ public final class ExpressionParser { * * @param expression expression * @return expression in RPN + * @throws IllegalArgumentException if expression is invalid (e.g. + * "{@code 3 *}") * @since 2019-03-17 * @since v0.2.0 */ @@ -541,6 +543,9 @@ public final class ExpressionParser { switch (this .getTokenType(components.get(highestPriorityOperatorPosition))) { case UNARY_OPERATOR: + if (components.size() < 2) + throw new IllegalArgumentException( + "Invalid expression \"" + expression + "\""); final String unaryOperator = components .remove(highestPriorityOperatorPosition); final String operand = components @@ -549,6 +554,9 @@ public final class ExpressionParser { operand + " " + unaryOperator); break; case BINARY_OPERATOR: + if (components.size() < 3) + throw new IllegalArgumentException( + "Invalid expression \"" + expression + "\""); final String binaryOperator = components .remove(highestPriorityOperatorPosition); final String operand1 = components diff --git a/src/test/java/sevenUnits/unit/UnitDatabaseTest.java b/src/test/java/sevenUnits/unit/UnitDatabaseTest.java index 15bebcb..31323a7 100644 --- a/src/test/java/sevenUnits/unit/UnitDatabaseTest.java +++ b/src/test/java/sevenUnits/unit/UnitDatabaseTest.java @@ -33,6 +33,8 @@ import java.util.NoSuchElementException; import java.util.Set; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; /** * A test for the {@link UnitDatabase} class. This is NOT part of this program's @@ -111,6 +113,22 @@ class UnitDatabaseTest { assertThrows(IllegalStateException.class, () -> keySet.toArray()); } + /** + * A bunch of tests for invalid unit files + * + * @param num which file to test + * @since 2021-09-27 + */ + @ParameterizedTest + @ValueSource(ints = { 1, 2, 3, 4, 5 }) + public void testLoadingInvalidFile(int num) { + final UnitDatabase database = new UnitDatabase(); + final String filename = String.format("/test-unitsfile-invalid%d.txt", + num); + assertThrows(IllegalArgumentException.class, + () -> loadUnitsFile(database, filename)); + } + /** * Tests loading a valid unitfile with some prefixes and no units. * @@ -161,6 +179,8 @@ class UnitDatabaseTest { .times(A.getMultiplier() + C.getMultiplier() - B.getMultiplier()); final Unit actual3 = database.getUnit("test3"); assertEquals(expected3, actual3); + + assertTrue(System.err.toString().length() > 0); } /** diff --git a/src/test/resources/test-unitsfile-invalid1.txt b/src/test/resources/test-unitsfile-invalid1.txt new file mode 100644 index 0000000..813bf54 --- /dev/null +++ b/src/test/resources/test-unitsfile-invalid1.txt @@ -0,0 +1 @@ +justaunit \ No newline at end of file diff --git a/src/test/resources/test-unitsfile-invalid2.txt b/src/test/resources/test-unitsfile-invalid2.txt new file mode 100644 index 0000000..890ed13 --- /dev/null +++ b/src/test/resources/test-unitsfile-invalid2.txt @@ -0,0 +1 @@ +nonexistent ! diff --git a/src/test/resources/test-unitsfile-invalid3.txt b/src/test/resources/test-unitsfile-invalid3.txt new file mode 100644 index 0000000..88d3c65 --- /dev/null +++ b/src/test/resources/test-unitsfile-invalid3.txt @@ -0,0 +1 @@ +badunit ^ diff --git a/src/test/resources/test-unitsfile-invalid4.txt b/src/test/resources/test-unitsfile-invalid4.txt new file mode 100644 index 0000000..0fbc514 --- /dev/null +++ b/src/test/resources/test-unitsfile-invalid4.txt @@ -0,0 +1 @@ +badprefix- * 35 \ No newline at end of file diff --git a/src/test/resources/test-unitsfile-invalid5.txt b/src/test/resources/test-unitsfile-invalid5.txt new file mode 100644 index 0000000..c561393 --- /dev/null +++ b/src/test/resources/test-unitsfile-invalid5.txt @@ -0,0 +1 @@ +anotherinvalidunit (3 + 5) * (^) + 57 \ No newline at end of file diff --git a/src/test/resources/test-unitsfile-valid1.txt b/src/test/resources/test-unitsfile-valid1.txt index 704fd7c..1ea6cd9 100644 --- a/src/test/resources/test-unitsfile-valid1.txt +++ b/src/test/resources/test-unitsfile-valid1.txt @@ -1,3 +1,6 @@ +U ! +V ! + test1 CBAU test2 BW CV -test3 AU + CU - BU \ No newline at end of file +test3 AU + CU - BU # easily the most complex one yet \ No newline at end of file -- cgit v1.2.3 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 (limited to 'src/test/resources') 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