/** * 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 . */ package test.java; import static org.junit.Assert.assertEquals; import java.util.Random; import java.util.concurrent.ThreadLocalRandom; import org.junit.Test; import org.unitConverter.dimension.StandardDimensions; import org.unitConverter.math.DecimalComparison; import org.unitConverter.unit.BaseUnit; import org.unitConverter.unit.LinearUnit; import org.unitConverter.unit.SI; import org.unitConverter.unit.SIPrefix; import org.unitConverter.unit.Unit; /** * Testing the various Unit classes. This is NOT part of this program's public API. * * @author Adrien Hopkins * @since 2018-12-22 * @since v0.1.0 */ public class UnitTest { /** A random number generator */ private static final Random rng = ThreadLocalRandom.current(); @Test public void testAdditionAndSubtraction() { final LinearUnit inch = SI.METRE.times(0.0254); final LinearUnit foot = SI.METRE.times(0.3048); assertEquals(inch.plus(foot), SI.METRE.times(0.3302)); assertEquals(foot.minus(inch), SI.METRE.times(0.2794)); } @Test public void testBaseUnitExclusives() { // this test should have a compile error if I am doing something wrong final BaseUnit metrePerSecondSquared = SI.METRE.dividedBy(SI.SECOND.toExponent(2)); assertEquals(metrePerSecondSquared, SI.SI.getBaseUnit(StandardDimensions.ACCELERATION)); } @Test public void testConversion() { final BaseUnit metre = SI.METRE; final Unit inch = metre.times(0.0254); assertEquals(1.9, inch.convertTo(metre, 75), 0.01); // try random stuff for (int i = 0; i < 1000; i++) { // initiate random values final double conversionFactor = rng.nextDouble() * 1000000; final double testValue = rng.nextDouble() * 1000000; final double expected = testValue * conversionFactor; // test final Unit unit = SI.METRE.times(conversionFactor); final double actual = unit.convertToBase(testValue); assertEquals(actual, expected, expected * DecimalComparison.DOUBLE_EPSILON); } } @Test public void testEquals() { final BaseUnit metre = SI.METRE; final Unit meter = SI.SI.getBaseUnit(StandardDimensions.LENGTH); assertEquals(metre, meter); } @Test public void testMultiplicationAndDivision() { // test unit-times-unit multiplication final LinearUnit generatedJoule = SI.KILOGRAM.times(SI.METRE.toExponent(2)).dividedBy(SI.SECOND.toExponent(2)); final LinearUnit actualJoule = SI.SI.getBaseUnit(StandardDimensions.ENERGY); assertEquals(generatedJoule, actualJoule); // test multiplication by conversion factors final LinearUnit kilometre = SI.METRE.times(1000); final LinearUnit hour = SI.SECOND.times(3600); final LinearUnit generatedKPH = kilometre.dividedBy(hour); final LinearUnit actualKPH = SI.SI.getBaseUnit(StandardDimensions.VELOCITY).dividedBy(3.6); assertEquals(generatedKPH, actualKPH); } @Test public void testPrefixes() { final LinearUnit generatedKilometre = SI.METRE.withPrefix(SIPrefix.KILO); final LinearUnit actualKilometre = SI.METRE.times(1000); assertEquals(generatedKilometre, actualKilometre); } }