Skip to content

Commit 9cd933f

Browse files
[wpiunits] Fix incorrect magnitudes in some MutableMeasure mutations (#8620)
This PR fixes the magnitude units in `MutableMeasure#mut_acc` and `MutableMeasure#mut_plus`. Previously, both `mut_acc` and `mut_plus` were setting the base magnitude using the unit-ed magnitude value. While this would work fine for base units where `magnitude == baseUnitMagnitude`, this was creating issues with derived units. This PR also adds missing tests for the `MutableMeasure` class.
1 parent 77dfad9 commit 9cd933f

File tree

2 files changed

+170
-2
lines changed

2 files changed

+170
-2
lines changed

wpiunits/src/main/java/edu/wpi/first/units/MutableMeasure.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ default MutSelf mut_setBaseUnitMagnitude(double baseUnitMagnitude) {
7373
* @return the measure
7474
*/
7575
default MutSelf mut_acc(double raw) {
76-
return mut_setBaseUnitMagnitude(magnitude() + raw);
76+
return mut_setMagnitude(magnitude() + raw);
7777
}
7878

7979
/**
@@ -107,7 +107,7 @@ default MutSelf mut_plus(Base other) {
107107
* @return this measure
108108
*/
109109
default MutSelf mut_plus(double magnitude, U otherUnit) {
110-
return mut_setBaseUnitMagnitude(magnitude() + otherUnit.toBaseUnits(magnitude));
110+
return mut_setBaseUnitMagnitude(baseUnitMagnitude() + otherUnit.toBaseUnits(magnitude));
111111
}
112112

113113
/**
Lines changed: 168 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,168 @@
1+
// Copyright (c) FIRST and other WPILib contributors.
2+
// Open Source Software; you can modify and/or share it under the terms of
3+
// the WPILib BSD license file in the root directory of this project.
4+
5+
package edu.wpi.first.units;
6+
7+
import static org.junit.jupiter.api.Assertions.assertEquals;
8+
import static org.junit.jupiter.api.Assertions.assertSame;
9+
import static org.junit.jupiter.api.Assertions.assertTrue;
10+
11+
import edu.wpi.first.units.measure.Distance;
12+
import edu.wpi.first.units.measure.MutDistance;
13+
import org.junit.jupiter.api.Test;
14+
15+
class MutableMeasureTest {
16+
@Test
17+
void testBasics() {
18+
DistanceUnit unit = Units.Feet;
19+
double magnitude = 10;
20+
MutDistance m = unit.mutable(magnitude);
21+
assertEquals(unit, m.unit(), "Wrong units");
22+
assertEquals(magnitude, m.magnitude(), 0, "Wrong magnitude");
23+
}
24+
25+
@Test
26+
void testMultiply() {
27+
MutDistance m = Units.Feet.mutable(1);
28+
MutDistance m2 = m.mut_times(Units.Value.of(10));
29+
assertEquals(10, m.in(Units.Feet), 1e-12);
30+
assertSame(m, m2);
31+
}
32+
33+
@Test
34+
void testMultiplyScalar() {
35+
MutDistance m = Units.Feet.mutable(1);
36+
MutDistance m2 = m.mut_times(10);
37+
assertEquals(10, m.in(Units.Feet), 1e-12);
38+
assertSame(m, m2);
39+
}
40+
41+
@Test
42+
void testDivide() {
43+
MutDistance m = Units.Meters.mutable(1);
44+
MutDistance m2 = m.mut_divide(Units.Value.of(10));
45+
assertEquals(0.1, m.magnitude(), 0);
46+
assertSame(m, m2);
47+
}
48+
49+
@Test
50+
void testDivideScalar() {
51+
MutDistance m = Units.Meters.mutable(1);
52+
MutDistance m2 = m.mut_divide(10);
53+
assertEquals(0.1, m.magnitude(), 0);
54+
assertSame(m, m2);
55+
}
56+
57+
@Test
58+
void testAdd() {
59+
MutDistance m1 = Units.Feet.mutable(1);
60+
MutDistance m2 = Units.Inches.mutable(2);
61+
62+
Distance sum1 = m1.mut_plus(Units.Inches.of(2));
63+
assertTrue(sum1.isEquivalent(Units.Feet.of(1 + 2 / 12d)));
64+
assertSame(m1, sum1);
65+
66+
Distance sum2 = m2.mut_plus(Units.Feet.of(1));
67+
assertTrue(sum2.isEquivalent(Units.Inches.of(14)));
68+
assertSame(m2, sum2);
69+
}
70+
71+
@Test
72+
void testAddScalar() {
73+
MutDistance m1 = Units.Feet.mutable(1);
74+
MutDistance m2 = Units.Inches.mutable(2);
75+
76+
Distance sum1 = m1.mut_plus(2, Units.Inches);
77+
assertTrue(sum1.isEquivalent(Units.Feet.of(1 + 2 / 12d)));
78+
assertSame(m1, sum1);
79+
80+
Distance sum2 = m2.mut_plus(1, Units.Feet);
81+
assertTrue(sum2.isEquivalent(Units.Inches.of(14)));
82+
assertSame(m2, sum2);
83+
}
84+
85+
@Test
86+
void testAcc() {
87+
MutDistance m1 = Units.Feet.mutable(1);
88+
MutDistance m2 = Units.Inches.mutable(2);
89+
90+
Distance acc1 = m1.mut_acc(Units.Inches.of(2));
91+
assertTrue(acc1.isEquivalent(Units.Feet.of(1 + 2 / 12d)));
92+
assertSame(m1, acc1);
93+
94+
Distance acc2 = m2.mut_acc(Units.Feet.of(1));
95+
assertTrue(acc2.isEquivalent(Units.Inches.of(14)));
96+
assertSame(m2, acc2);
97+
}
98+
99+
@Test
100+
void testAccScalar() {
101+
MutDistance m1 = Units.Feet.mutable(1);
102+
MutDistance m2 = Units.Inches.mutable(2);
103+
104+
Distance acc1 = m1.mut_acc(2 / 12d);
105+
assertTrue(acc1.isEquivalent(Units.Feet.of(1 + 2 / 12d)));
106+
assertSame(m1, acc1);
107+
108+
Distance acc2 = m2.mut_acc(12);
109+
assertTrue(acc2.isEquivalent(Units.Inches.of(14)));
110+
assertSame(m2, acc2);
111+
}
112+
113+
@Test
114+
void testSubtract() {
115+
MutDistance m1 = Units.Feet.mutable(1);
116+
MutDistance m2 = Units.Inches.mutable(2);
117+
118+
Distance sub1 = m1.mut_minus(Units.Inches.of(2));
119+
assertTrue(sub1.isEquivalent(Units.Feet.of(1 - 2 / 12d)));
120+
assertSame(m1, sub1);
121+
122+
Distance sub2 = m2.mut_minus(Units.Feet.of(1));
123+
assertTrue(sub2.isEquivalent(Units.Inches.of(-10)));
124+
assertSame(m2, sub2);
125+
}
126+
127+
@Test
128+
void testSubtractScalar() {
129+
MutDistance m1 = Units.Feet.mutable(1);
130+
MutDistance m2 = Units.Inches.mutable(2);
131+
132+
Distance sub1 = m1.mut_minus(2, Units.Inches);
133+
assertTrue(sub1.isEquivalent(Units.Feet.of(1 - 2 / 12d)));
134+
assertSame(m1, sub1);
135+
136+
Distance sub2 = m2.mut_minus(1, Units.Feet);
137+
assertTrue(sub2.isEquivalent(Units.Inches.of(-10)));
138+
assertSame(m2, sub2);
139+
}
140+
141+
@Test
142+
void testReplace() {
143+
MutDistance m1 = Units.Feet.mutable(1);
144+
MutDistance m2 = Units.Inches.mutable(2);
145+
146+
Distance replace1 = m1.mut_replace(Units.Inches.of(2));
147+
assertTrue(replace1.isEquivalent(Units.Inches.of(2)));
148+
assertSame(m1, replace1);
149+
150+
Distance replace2 = m2.mut_replace(Units.Feet.of(1));
151+
assertTrue(replace2.isEquivalent(Units.Feet.of(1)));
152+
assertSame(m2, replace2);
153+
}
154+
155+
@Test
156+
void testReplaceScalar() {
157+
MutDistance m1 = Units.Feet.mutable(1);
158+
MutDistance m2 = Units.Inches.mutable(2);
159+
160+
Distance replace1 = m1.mut_replace(2, Units.Inches);
161+
assertTrue(replace1.isEquivalent(Units.Inches.of(2)));
162+
assertSame(m1, replace1);
163+
164+
Distance replace2 = m2.mut_replace(1, Units.Feet);
165+
assertTrue(replace2.isEquivalent(Units.Feet.of(1)));
166+
assertSame(m2, replace2);
167+
}
168+
}

0 commit comments

Comments
 (0)