[wpiunits] Change units to track their base unit, instead of their base class (#6342)

Unit objects now have a reference to the base unit from which they're derived. Constructing a unit object without specifying a base unit implicitly signifies that it's its own base unit, eg new Angle(null, 1, "Radian", "rad") would be the base angle unit of radians, while new Angle(Radians, 2 * PI, "Rotation", "R") would be a new angle unit based on radians.

This fixes much of the hacky code surrounding the derived unit types Velocity, Per, and Mult, but is a breaking change for any user code that defines custom unit classes or uses the anonymous unit type.
This commit is contained in:
Sam Carlberg
2024-05-12 09:15:56 -04:00
committed by GitHub
parent dc00a13d83
commit 6c9dcc157e
23 changed files with 312 additions and 162 deletions

View File

@@ -12,9 +12,10 @@ import org.junit.jupiter.api.Test;
class DistanceTest {
@Test
void testBaseUnitDistancePerTime() {
Velocity<Distance> anonBaseUnit = new Distance(1, "D", "d").per(new Time(1, "T", "t"));
Velocity<Distance> anonBaseUnit =
new Distance(null, 1, "D", "d").per(new Time(null, 1, "T", "t"));
assertTrue(BaseUnits.Velocity.equivalent(anonBaseUnit));
assertTrue(Units.MetersPerSecond.equivalent(anonBaseUnit));
}
@Test

View File

@@ -9,11 +9,16 @@ class ExampleUnit extends Unit<ExampleUnit> {
this(baseUnitEquivalent, "Example", "ex");
}
ExampleUnit(UnaryFunction toBase, UnaryFunction fromBase, String name, String symbol) {
super(ExampleUnit.class, toBase, fromBase, name, symbol);
ExampleUnit(
ExampleUnit baseUnit,
UnaryFunction toBase,
UnaryFunction fromBase,
String name,
String symbol) {
super(baseUnit, toBase, fromBase, name, symbol);
}
ExampleUnit(double baseUnitEquivalent, String name, String symbol) {
super(ExampleUnit.class, baseUnitEquivalent, name, symbol);
super(null, baseUnitEquivalent, name, symbol);
}
}

View File

@@ -135,7 +135,7 @@ class UnitsTest {
assertEquals(9.80665, Gs.of(1).in(MetersPerSecondPerSecond), thresh);
assertEquals("G", Gs.name());
assertEquals("G", Gs.symbol());
assertEquals(Units.AnonymousBaseUnit, Gs.getUnit());
assertEquals(MetersPerSecond, Gs.getUnit());
assertEquals(Seconds, Gs.getPeriod());
}

View File

@@ -20,8 +20,8 @@ import org.junit.jupiter.api.Test;
class VelocityTest {
@Test
void testBaseUnit() {
assertTrue(MetersPerSecond.equivalent(BaseUnits.Velocity));
assertTrue(Meters.per(Second).equivalent(BaseUnits.Velocity));
assertTrue(MetersPerSecond.equivalent(MetersPerSecond));
assertTrue(Meters.per(Second).equivalent(MetersPerSecond));
}
@Test