[wpiunits] Java units API rewrite (#6958)

Java generics are too limited to do what we need. This refactors generic code previously in Unit and Measure into unit-specific classes that can have unit-safe math operations (notably, times and divide) that can return values in known units instead of a wildcarded Measure<?>.

Unit-specific measure implementations are automatically generated by ./wpiunits/generate_units.py, which generates generic interfaces and mutable and immutable implementations of those interfaces. These make up the bulk of the diff of this PR (approximately 9300 LOC).

This also adds units for angular and linear velocities, accelerations, and momenta; moment of inertia; and torque.
This commit is contained in:
Sam Carlberg
2024-09-07 13:59:29 -04:00
committed by GitHub
parent 496e7c1bba
commit a9b885070e
178 changed files with 14750 additions and 2158 deletions

View File

@@ -0,0 +1,37 @@
// Copyright (c) FIRST and other WPILib contributors.
// Open Source Software; you can modify and/or share it under the terms of
// the WPILib BSD license file in the root directory of this project.
package edu.wpi.first.units;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertSame;
import org.junit.jupiter.api.Test;
class MultUnitTest {
@Test
void testAutomaticNames() {
var unitA = new ExampleUnit(1, "Ay", "a");
var unitB = new ExampleUnit(1, "Bee", "b");
var mult = MultUnit.combine(unitA, unitB);
assertEquals("Ay-Bee", mult.name());
assertEquals("a*b", mult.symbol());
}
@Test
void testCombine() {
var unitA = new ExampleUnit(100);
var unitB = new ExampleUnit(0.912);
var mult = MultUnit.combine(unitA, unitB);
assertEquals(91.2, mult.toBaseUnits(1));
}
@Test
void testCaches() {
var unitA = new ExampleUnit(1);
var unitB = new ExampleUnit(2);
var mult = MultUnit.combine(unitA, unitB);
assertSame(mult, MultUnit.combine(unitA, unitB));
}
}