diff options
author | Adrien Hopkins <adrien.p.hopkins@gmail.com> | 2019-01-25 12:30:52 -0500 |
---|---|---|
committer | Adrien Hopkins <adrien.p.hopkins@gmail.com> | 2019-01-25 12:30:52 -0500 |
commit | 28c861db52484eefa37bd0ef795b9329aa8b0290 (patch) | |
tree | 843fe036415e01379002c03a3743b1304b582fc2 |
Initial commit
-rw-r--r-- | .classpath | 7 | ||||
-rw-r--r-- | .gitignore | 3 | ||||
-rw-r--r-- | .project | 17 | ||||
-rw-r--r-- | .settings/org.eclipse.jdt.core.prefs | 11 | ||||
-rw-r--r-- | src/unitConverter/converter/package-info.java | 23 | ||||
-rwxr-xr-x | src/unitConverter/dimension/BaseDimension.java | 37 | ||||
-rwxr-xr-x | src/unitConverter/dimension/OtherBaseDimension.java | 53 | ||||
-rwxr-xr-x | src/unitConverter/dimension/SIBaseDimension.java | 55 | ||||
-rwxr-xr-x | src/unitConverter/dimension/StandardDimensions.java | 79 | ||||
-rwxr-xr-x | src/unitConverter/dimension/UnitDimension.java | 230 | ||||
-rwxr-xr-x | src/unitConverter/dimension/UnitDimensionTest.java | 56 | ||||
-rwxr-xr-x | src/unitConverter/dimension/package-info.java | 23 | ||||
-rw-r--r-- | src/unitConverter/package-info.java | 23 | ||||
-rwxr-xr-x | src/unitConverter/unit/Unit.java | 103 | ||||
-rwxr-xr-x | src/unitConverter/unit/UnitSystem.java | 31 | ||||
-rw-r--r-- | src/unitConverter/unit/package-info.java | 23 |
16 files changed, 774 insertions, 0 deletions
diff --git a/.classpath b/.classpath new file mode 100644 index 0000000..145a671 --- /dev/null +++ b/.classpath @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<classpath> + <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/> + <classpathentry kind="src" path="src"/> + <classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/5"/> + <classpathentry kind="output" path="bin"/> +</classpath> diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..866d01d --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +bin/ +*.class +*~
\ No newline at end of file diff --git a/.project b/.project new file mode 100644 index 0000000..656186b --- /dev/null +++ b/.project @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8"?> +<projectDescription> + <name>Unit Converter</name> + <comment></comment> + <projects> + </projects> + <buildSpec> + <buildCommand> + <name>org.eclipse.jdt.core.javabuilder</name> + <arguments> + </arguments> + </buildCommand> + </buildSpec> + <natures> + <nature>org.eclipse.jdt.core.javanature</nature> + </natures> +</projectDescription> diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..3a21537 --- /dev/null +++ b/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/src/unitConverter/converter/package-info.java b/src/unitConverter/converter/package-info.java new file mode 100644 index 0000000..6148784 --- /dev/null +++ b/src/unitConverter/converter/package-info.java @@ -0,0 +1,23 @@ +/** + * Copyright (C) 2019 Adrien Hopkins + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ +/** + * All classes that work to convert units. + * + * @author Adrien Hopkins + * @since 2019-01-25 + */ +package unitConverter.converter;
\ No newline at end of file diff --git a/src/unitConverter/dimension/BaseDimension.java b/src/unitConverter/dimension/BaseDimension.java new file mode 100755 index 0000000..6a727a9 --- /dev/null +++ b/src/unitConverter/dimension/BaseDimension.java @@ -0,0 +1,37 @@ +/** + * Copyright (C) 2018 Adrien Hopkins + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ +package unitConverter.dimension; + +/** + * A base dimension that makes up {@code UnitDimension} objects. + * + * @author Adrien Hopkins + * @since 2018-12-22 + */ +public interface BaseDimension { + /** + * @return the dimension's name + * @since 2019-01-25 + */ + String getName(); + + /** + * @return a short string (usually one character) that represents this base dimension + * @since 2018-12-22 + */ + String getSymbol(); +} diff --git a/src/unitConverter/dimension/OtherBaseDimension.java b/src/unitConverter/dimension/OtherBaseDimension.java new file mode 100755 index 0000000..2ab19b3 --- /dev/null +++ b/src/unitConverter/dimension/OtherBaseDimension.java @@ -0,0 +1,53 @@ +/** + * Copyright (C) 2018 Adrien Hopkins + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ +package unitConverter.dimension; + +import java.util.Objects; + +/** + * Non-SI base dimensions. + * + * @author Adrien Hopkins + * @since 2019-01-14 + */ +public enum OtherBaseDimension implements BaseDimension { + INFORMATION("Info"), CURRENCY("$$"); + + /** The dimension's symbol */ + private final String symbol; + + /** + * Creates the {@code SIBaseDimension}. + * + * @param symbol + * dimension's symbol + * @since 2018-12-11 + */ + private OtherBaseDimension(final String symbol) { + this.symbol = Objects.requireNonNull(symbol, "symbol must not be null."); + } + + @Override + public String getName() { + return this.toString(); + } + + @Override + public String getSymbol() { + return this.symbol; + } +} diff --git a/src/unitConverter/dimension/SIBaseDimension.java b/src/unitConverter/dimension/SIBaseDimension.java new file mode 100755 index 0000000..b731b00 --- /dev/null +++ b/src/unitConverter/dimension/SIBaseDimension.java @@ -0,0 +1,55 @@ +/**
+ * Copyright (C) 2018 Adrien Hopkins
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+package unitConverter.dimension;
+
+import java.util.Objects;
+
+/**
+ * The seven base dimensions that make up the SI.
+ *
+ * @author Adrien Hopkins
+ * @since 2018-12-11
+ */
+public enum SIBaseDimension implements BaseDimension {
+ LENGTH("L"), MASS("M"), TIME("T"), ELECTRIC_CURRENT("I"), TEMPERATURE("\u0398"), // u0398 is the theta symbol
+ QUANTITY("N"), LUMINOUS_INTENSITY("J");
+
+ /** The dimension's symbol */
+ private final String symbol;
+
+ /**
+ * Creates the {@code SIBaseDimension}.
+ *
+ * @param symbol
+ * dimension's symbol
+ * @since 2018-12-11
+ */
+ private SIBaseDimension(final String symbol) {
+ this.symbol = Objects.requireNonNull(symbol, "symbol must not be null.");
+ }
+
+ @Override
+ public String getName() {
+ return this.toString();
+ }
+
+ @Override
+ public String getSymbol() {
+ return this.symbol;
+ }
+
+}
diff --git a/src/unitConverter/dimension/StandardDimensions.java b/src/unitConverter/dimension/StandardDimensions.java new file mode 100755 index 0000000..c830f00 --- /dev/null +++ b/src/unitConverter/dimension/StandardDimensions.java @@ -0,0 +1,79 @@ +/**
+ * Copyright (C) 2018 Adrien Hopkins
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+package unitConverter.dimension;
+
+/**
+ * All of the dimensions that are used by the SI.
+ *
+ * @author Adrien Hopkins
+ * @since 2018-12-11
+ */
+public final class StandardDimensions {
+ // base dimensions
+ public static final UnitDimension EMPTY = UnitDimension.EMPTY;
+ public static final UnitDimension LENGTH = UnitDimension.getBase(SIBaseDimension.LENGTH);
+ public static final UnitDimension MASS = UnitDimension.getBase(SIBaseDimension.MASS);
+ public static final UnitDimension TIME = UnitDimension.getBase(SIBaseDimension.TIME);
+ public static final UnitDimension ELECTRIC_CURRENT = UnitDimension.getBase(SIBaseDimension.ELECTRIC_CURRENT);
+ public static final UnitDimension TEMPERATURE = UnitDimension.getBase(SIBaseDimension.TEMPERATURE);
+ public static final UnitDimension QUANTITY = UnitDimension.getBase(SIBaseDimension.QUANTITY);
+ public static final UnitDimension LUMINOUS_INTENSITY = UnitDimension.getBase(SIBaseDimension.LUMINOUS_INTENSITY);
+ public static final UnitDimension INFORMATION = UnitDimension.getBase(OtherBaseDimension.INFORMATION);
+ public static final UnitDimension CURRENCY = UnitDimension.getBase(OtherBaseDimension.CURRENCY);
+ // derived dimensions without named SI units
+ public static final UnitDimension AREA = LENGTH.times(LENGTH);
+
+ public static final UnitDimension VOLUME = AREA.times(LENGTH);
+ public static final UnitDimension VELOCITY = LENGTH.dividedBy(TIME);
+ public static final UnitDimension ACCELERATION = VELOCITY.dividedBy(TIME);
+ public static final UnitDimension WAVENUMBER = EMPTY.dividedBy(LENGTH);
+ public static final UnitDimension MASS_DENSITY = MASS.dividedBy(VOLUME);
+ public static final UnitDimension SURFACE_DENSITY = MASS.dividedBy(AREA);
+ public static final UnitDimension SPECIFIC_VOLUME = VOLUME.dividedBy(MASS);
+ public static final UnitDimension CURRENT_DENSITY = ELECTRIC_CURRENT.dividedBy(AREA);
+ public static final UnitDimension MAGNETIC_FIELD_STRENGTH = ELECTRIC_CURRENT.dividedBy(LENGTH);
+ public static final UnitDimension CONCENTRATION = QUANTITY.dividedBy(VOLUME);
+ public static final UnitDimension MASS_CONCENTRATION = CONCENTRATION.times(MASS);
+ public static final UnitDimension LUMINANCE = LUMINOUS_INTENSITY.dividedBy(AREA);
+ public static final UnitDimension REFRACTIVE_INDEX = VELOCITY.dividedBy(VELOCITY);
+ public static final UnitDimension REFLACTIVE_PERMEABILITY = EMPTY.times(EMPTY);
+ public static final UnitDimension ANGLE = LENGTH.dividedBy(LENGTH);
+ public static final UnitDimension SOLID_ANGLE = AREA.dividedBy(AREA);
+ // derived dimensions with named SI units
+ public static final UnitDimension FREQUENCY = EMPTY.dividedBy(TIME);
+
+ public static final UnitDimension FORCE = MASS.times(ACCELERATION);
+ public static final UnitDimension ENERGY = FORCE.times(LENGTH);
+ public static final UnitDimension POWER = ENERGY.dividedBy(TIME);
+ public static final UnitDimension ELECTRIC_CHARGE = ELECTRIC_CURRENT.times(TIME);
+ public static final UnitDimension VOLTAGE = ENERGY.dividedBy(ELECTRIC_CHARGE);
+ public static final UnitDimension CAPACITANCE = ELECTRIC_CHARGE.dividedBy(VOLTAGE);
+ public static final UnitDimension ELECTRIC_RESISTANCE = VOLTAGE.dividedBy(ELECTRIC_CURRENT);
+ public static final UnitDimension ELECTRIC_CONDUCTANCE = ELECTRIC_CURRENT.dividedBy(VOLTAGE);
+ public static final UnitDimension MAGNETIC_FLUX = VOLTAGE.times(TIME);
+ public static final UnitDimension MAGNETIC_FLUX_DENSITY = MAGNETIC_FLUX.dividedBy(AREA);
+ public static final UnitDimension INDUCTANCE = MAGNETIC_FLUX.dividedBy(ELECTRIC_CURRENT);
+ public static final UnitDimension LUMINOUS_FLUX = LUMINOUS_INTENSITY.times(SOLID_ANGLE);
+ public static final UnitDimension ILLUMINANCE = LUMINOUS_FLUX.dividedBy(AREA);
+ public static final UnitDimension SPECIFIC_ENERGY = ENERGY.dividedBy(MASS);
+ public static final UnitDimension CATALYTIC_ACTIVITY = QUANTITY.dividedBy(TIME);
+
+ // You may NOT get StandardDimensions instances!
+ private StandardDimensions() {
+ throw new AssertionError();
+ }
+}
diff --git a/src/unitConverter/dimension/UnitDimension.java b/src/unitConverter/dimension/UnitDimension.java new file mode 100755 index 0000000..ba2a750 --- /dev/null +++ b/src/unitConverter/dimension/UnitDimension.java @@ -0,0 +1,230 @@ +/**
+ * Copyright (C) 2018 Adrien Hopkins
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+package unitConverter.dimension;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+
+/**
+ * An object that represents what a unit measures, like length, mass, area, energy, etc.
+ *
+ * @author Adrien Hopkins
+ * @since 2018-12-11
+ */
+public final class UnitDimension {
+ /**
+ * The unit dimension where every exponent is zero
+ *
+ * @since 2018-12-12
+ */
+ public static final UnitDimension EMPTY = new UnitDimension(new HashMap<>());
+
+ /**
+ * Gets an UnitDimension that has 1 of a certain dimension and nothing else
+ *
+ * @param dimension
+ * dimension to get
+ * @return unit dimension
+ * @since 2018-12-11
+ */
+ public static final UnitDimension getBase(final BaseDimension dimension) {
+ final Map<BaseDimension, Integer> map = new HashMap<>();
+ map.put(dimension, 1);
+ return new UnitDimension(map);
+ }
+
+ /**
+ * The base dimensions that make up this dimension.
+ *
+ * @since 2018-12-11
+ */
+ final Map<BaseDimension, Integer> exponents;
+
+ /**
+ * Creates the {@code UnitDimension}.
+ *
+ * @param exponents
+ * base dimensions that make up this dimension
+ * @since 2018-12-11
+ */
+ private UnitDimension(final Map<BaseDimension, Integer> exponents) {
+ this.exponents = new HashMap<>(exponents);
+ }
+
+ /**
+ * Divides this dimension by another
+ *
+ * @param other
+ * other dimension
+ * @return quotient of two dimensions
+ * @since 2018-12-11
+ */
+ public UnitDimension dividedBy(final UnitDimension other) {
+ final Map<BaseDimension, Integer> map = new HashMap<>(this.exponents);
+
+ for (final BaseDimension key : other.exponents.keySet()) {
+ if (map.containsKey(key)) {
+ // add the dimensions
+ map.put(key, map.get(key) - other.exponents.get(key));
+ } else {
+ map.put(key, -other.exponents.get(key));
+ }
+ }
+ return new UnitDimension(map);
+ }
+
+ @Override
+ public boolean equals(final Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (!(obj instanceof UnitDimension))
+ return false;
+ final UnitDimension other = (UnitDimension) obj;
+
+ // anything with a value of 0 is equal to a nonexistent value
+ for (final BaseDimension b : this.getBaseSet()) {
+ if (this.exponents.get(b) != other.exponents.get(b))
+ if (!(this.exponents.get(b) == 0 && !other.exponents.containsKey(b)))
+ return false;
+ }
+ for (final BaseDimension b : other.getBaseSet()) {
+ if (this.exponents.get(b) != other.exponents.get(b))
+ if (!(other.exponents.get(b) == 0 && !this.exponents.containsKey(b)))
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * @return a set of all of the base dimensions with non-zero exponents that make up this dimension.
+ * @since 2018-12-12
+ */
+ public final Set<BaseDimension> getBaseSet() {
+ final Set<BaseDimension> dimensions = new HashSet<>();
+
+ // add all dimensions with a nonzero exponent - they shouldn't be there in the first place
+ for (final BaseDimension dimension : this.exponents.keySet()) {
+ if (!this.exponents.get(dimension).equals(0)) {
+ dimensions.add(dimension);
+ }
+ }
+
+ return dimensions;
+ }
+
+ /**
+ * Gets the exponent for a specific dimension.
+ *
+ * @param dimension
+ * dimension to check
+ * @return exponent for that dimension
+ * @since 2018-12-12
+ */
+ public int getExponent(final BaseDimension dimension) {
+ return this.exponents.getOrDefault(dimension, 0);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(this.exponents);
+ }
+
+ /**
+ * @return true if this dimension is a base, i.e. it has one exponent of one and no other nonzero exponents
+ * @since 2019-01-15
+ */
+ public boolean isBase() {
+ int oneCount = 0;
+ boolean twoOrMore = false; // has exponents of 2 or more
+ for (final BaseDimension b : this.getBaseSet()) {
+ if (this.exponents.get(b) == 1) {
+ oneCount++;
+ } else if (this.exponents.get(b) != 0) {
+ twoOrMore = true;
+ }
+ }
+ return (oneCount == 0 || oneCount == 1) && !twoOrMore;
+ }
+
+ /**
+ * Multiplies this dimension by another
+ *
+ * @param other
+ * other dimension
+ * @return product of two dimensions
+ * @since 2018-12-11
+ */
+ public UnitDimension times(final UnitDimension other) {
+ final Map<BaseDimension, Integer> map = new HashMap<>(this.exponents);
+
+ for (final BaseDimension key : other.exponents.keySet()) {
+ if (map.containsKey(key)) {
+ // add the dimensions
+ map.put(key, map.get(key) + other.exponents.get(key));
+ } else {
+ map.put(key, other.exponents.get(key));
+ }
+ }
+ return new UnitDimension(map);
+ }
+
+ /**
+ * Returns this dimension, but to an exponent
+ *
+ * @param exp
+ * exponent
+ * @return result of exponientation
+ * @since 2019-01-15
+ */
+ public UnitDimension toExponent(final int exp) {
+ final Map<BaseDimension, Integer> map = new HashMap<>(this.exponents);
+ for (final BaseDimension key : this.exponents.keySet()) {
+ map.put(key, this.getExponent(key) * exp);
+ }
+ return new UnitDimension(map);
+ }
+
+ @Override
+ public String toString() {
+ final List<String> positiveStringComponents = new ArrayList<>();
+ final List<String> negativeStringComponents = new ArrayList<>();
+
+ // for each base dimension that makes up this dimension, add it and its exponent
+ for (final BaseDimension dimension : this.getBaseSet()) {
+ final int exponent = this.exponents.get(dimension);
+ if (exponent > 0) {
+ positiveStringComponents.add(String.format("%s^%d", dimension.getSymbol(), exponent));
+ } else if (exponent < 0) {
+ negativeStringComponents.add(String.format("%s^%d", dimension.getSymbol(), -exponent));
+ }
+ }
+
+ final String positiveString = positiveStringComponents.isEmpty() ? "1"
+ : String.join(" ", positiveStringComponents);
+ final String negativeString = negativeStringComponents.isEmpty() ? ""
+ : " / " + String.join(" ", negativeStringComponents);
+
+ return positiveString + negativeString;
+ }
+}
diff --git a/src/unitConverter/dimension/UnitDimensionTest.java b/src/unitConverter/dimension/UnitDimensionTest.java new file mode 100755 index 0000000..603320b --- /dev/null +++ b/src/unitConverter/dimension/UnitDimensionTest.java @@ -0,0 +1,56 @@ +/** + * Copyright (C) 2018 Adrien Hopkins + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ +package unitConverter.dimension; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static unitConverter.dimension.StandardDimensions.AREA; +import static unitConverter.dimension.StandardDimensions.ENERGY; +import static unitConverter.dimension.StandardDimensions.LENGTH; +import static unitConverter.dimension.StandardDimensions.MASS; +import static unitConverter.dimension.StandardDimensions.MASS_DENSITY; +import static unitConverter.dimension.StandardDimensions.QUANTITY; +import static unitConverter.dimension.StandardDimensions.TIME; +import static unitConverter.dimension.StandardDimensions.VOLUME; + +import org.junit.jupiter.api.Test; + +/** + * @author Adrien Hopkins + * @since 2018-12-12 + */ +class UnitDimensionTest { + @Test + void testEquals() { + assertEquals(LENGTH, LENGTH); + assertFalse(LENGTH.equals(QUANTITY)); + } + + @Test + void testExponents() { + assertEquals(1, LENGTH.getExponent(SIBaseDimension.LENGTH)); + assertEquals(3, VOLUME.getExponent(SIBaseDimension.LENGTH)); + } + + @Test + void testMultiplicationAndDivision() { + assertEquals(AREA, LENGTH.times(LENGTH)); + assertEquals(MASS_DENSITY, MASS.dividedBy(VOLUME)); + assertEquals(ENERGY, AREA.times(MASS).dividedBy(TIME).dividedBy(TIME)); + assertEquals(LENGTH, LENGTH.times(TIME).dividedBy(TIME)); + } +} diff --git a/src/unitConverter/dimension/package-info.java b/src/unitConverter/dimension/package-info.java new file mode 100755 index 0000000..74895ce --- /dev/null +++ b/src/unitConverter/dimension/package-info.java @@ -0,0 +1,23 @@ +/** + * Copyright (C) 2018 Adrien Hopkins + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ +/** + * Everything to do with what a unit measures, or its dimension. + * + * @author Adrien Hopkins + * @since 2018-12-22 + */ +package unitConverter.dimension;
\ No newline at end of file diff --git a/src/unitConverter/package-info.java b/src/unitConverter/package-info.java new file mode 100644 index 0000000..e2f7ff7 --- /dev/null +++ b/src/unitConverter/package-info.java @@ -0,0 +1,23 @@ +/** + * Copyright (C) 2019 Adrien Hopkins + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ +/** + * A program that converts units. + * + * @author Adrien Hopkins + * @since 2019-01-25 + */ +package unitConverter;
\ No newline at end of file diff --git a/src/unitConverter/unit/Unit.java b/src/unitConverter/unit/Unit.java new file mode 100755 index 0000000..3e7f9da --- /dev/null +++ b/src/unitConverter/unit/Unit.java @@ -0,0 +1,103 @@ +/** + * Copyright (C) 2018 Adrien Hopkins + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ +package unitConverter.unit; + +import java.util.Objects; + +import unitConverter.dimension.UnitDimension; + +/** + * A unit that has an associated base unit, and can convert a value expressed in it to and from that base. + * + * @author Adrien Hopkins + * @since 2018-12-22 + */ +public interface Unit { + /** + * Checks if a value expressed in this unit can be converted to a value expressed in {@code other} + * + * @param other + * unit to test with + * @return true if the units are compatible + * @since 2019-01-13 + */ + default boolean canConvertTo(final Unit other) { + return Objects.equals(this.getBase(), other.getBase()); + } + + /** + * Converts from a value expressed in this unit's base unit to a value expressed in this unit. + * <p> + * This must be the inverse of {@code convertToBase}, so {@code convertFromBase(convertToBase(value))} must be equal + * to {@code value} for any value, ignoring precision loss by roundoff error. + * </p> + * <p> + * If this unit <i>is</i> a base unit, this method should return {@code value}. + * </p> + * + * @param value + * value expressed in <b>base</b> unit + * @return value expressed in <b>this</b> unit + * @since 2018-12-22 + */ + double convertFromBase(double value); + + /** + * Converts from a value expressed in this unit to a value expressed in this unit's base unit. + * <p> + * This must be the inverse of {@code convertFromBase}, so {@code convertToBase(convertFromBase(value))} must be + * equal to {@code value} for any value, ignoring precision loss by roundoff error. + * </p> + * <p> + * If this unit <i>is</i> a base unit, this method should return {@code value}. + * </p> + * + * @param value + * value expressed in <b>this</b> unit + * @return value expressed in <b>base</b> unit + * @since 2018-12-22 + */ + double convertToBase(double value); + + /** + * <p> + * Returns the base unit associated with this unit. + * </p> + * <p> + * The dimension of this unit must be equal to the dimension of the returned unit. + * </p> + * <p> + * If this unit <i>is</i> a base unit, this method should return this unit.\ + * </p> + * + * @return base unit associated with this unit + * @since 2018-12-22 + */ + Unit getBase(); + + /** + * @return dimension measured by this unit + * @since 2018-12-22 + */ + UnitDimension getDimension(); + + /** + * @return system that this unit is a part of + * @since 2018-12-23 + */ + UnitSystem getSystem(); +} diff --git a/src/unitConverter/unit/UnitSystem.java b/src/unitConverter/unit/UnitSystem.java new file mode 100755 index 0000000..2e3a5d8 --- /dev/null +++ b/src/unitConverter/unit/UnitSystem.java @@ -0,0 +1,31 @@ +/** + * Copyright (C) 2018 Adrien Hopkins + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ +package unitConverter.unit; + +/** + * A system of units. Each unit should be aware of its system. + * + * @author Adrien Hopkins + * @since 2018-12-23 + */ +public interface UnitSystem { + /** + * @return name of system + * @since 2019-01-25 + */ + String getName(); +} diff --git a/src/unitConverter/unit/package-info.java b/src/unitConverter/unit/package-info.java new file mode 100644 index 0000000..b5deb0c --- /dev/null +++ b/src/unitConverter/unit/package-info.java @@ -0,0 +1,23 @@ +/** + * Copyright (C) 2019 Adrien Hopkins + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ +/** + * All of the classes that correspond to the units being converted. + * + * @author Adrien Hopkins + * @since 2019-01-25 + */ +package unitConverter.unit;
\ No newline at end of file |