1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.numbers.field;
18
19 import org.junit.jupiter.api.Assertions;
20 import org.junit.jupiter.params.ParameterizedTest;
21 import org.junit.jupiter.params.provider.MethodSource;
22 import java.util.Arrays;
23 import java.util.function.BiPredicate;
24 import java.util.stream.Stream;
25
26 import org.apache.commons.numbers.core.Addition;
27 import org.apache.commons.numbers.core.Multiplication;
28
29
30
31
32 class FieldParametricTest {
33
34 private static Stream<FieldTestData<?>> getList() {
35 return FieldsList.stream();
36 }
37
38 @ParameterizedTest
39 @MethodSource("getList")
40 <T> void testAdditionAssociativity(FieldTestData<T> data) {
41 Field<T> field = data.getField();
42 T a = data.getA();
43 T b = data.getB();
44 T c = data.getC();
45 final T r1 = field.add(field.add(a, b), c);
46 final T r2 = field.add(a, field.add(b, c));
47 assertEquals(r1, r2, data::equals);
48 }
49
50 @ParameterizedTest
51 @MethodSource("getList")
52 <T> void testAdditionCommutativity(FieldTestData<T> data) {
53 Field<T> field = data.getField();
54 T a = data.getA();
55 T b = data.getB();
56 final T r1 = field.add(a, b);
57 final T r2 = field.add(b, a);
58 assertEquals(r1, r2, data::equals);
59 }
60
61 @ParameterizedTest
62 @MethodSource("getList")
63 <T> void testAdditiveIdentity(FieldTestData<T> data) {
64 Field<T> field = data.getField();
65 T a = data.getA();
66 final T r1 = field.add(a, field.zero());
67 final T r2 = a;
68 assertEquals(r1, r2, data::equals);
69 }
70
71 @ParameterizedTest
72 @MethodSource("getList")
73 <T> void testAdditiveInverse(FieldTestData<T> data) {
74 Field<T> field = data.getField();
75 T a = data.getA();
76 final T r1 = field.add(a, field.negate(a));
77 final T r2 = field.zero();
78 assertEquals(r1, r2, data::equals);
79 }
80
81 @ParameterizedTest
82 @MethodSource("getList")
83 <T> void testMultiplicationAssociativity(FieldTestData<T> data) {
84 Field<T> field = data.getField();
85 T a = data.getA();
86 T b = data.getB();
87 T c = data.getC();
88 final T r1 = field.multiply(field.multiply(a, b), c);
89 final T r2 = field.multiply(a, field.multiply(b, c));
90 assertEquals(r1, r2, data::equals);
91 }
92
93 @ParameterizedTest
94 @MethodSource("getList")
95 <T> void testMultiplicationCommutativity(FieldTestData<T> data) {
96 Field<T> field = data.getField();
97 T a = data.getA();
98 T b = data.getB();
99 final T r1 = field.multiply(a, b);
100 final T r2 = field.multiply(b, a);
101 assertEquals(r1, r2, data::equals);
102 }
103
104 @ParameterizedTest
105 @MethodSource("getList")
106 <T> void testMultiplicativeIdentity(FieldTestData<T> data) {
107 Field<T> field = data.getField();
108 T a = data.getA();
109 final T r1 = field.multiply(a, field.one());
110 final T r2 = a;
111 assertEquals(r1, r2, data::equals);
112 }
113
114 @ParameterizedTest
115 @MethodSource("getList")
116 <T> void testMultiplicativeInverse(FieldTestData<T> data) {
117 Field<T> field = data.getField();
118 T a = data.getA();
119 final T r1 = field.multiply(a, field.reciprocal(a));
120 final T r2 = field.one();
121 assertEquals(r1, r2, data::equals);
122 }
123
124 @ParameterizedTest
125 @MethodSource("getList")
126 <T> void testDistributivity(FieldTestData<T> data) {
127 Field<T> field = data.getField();
128 T a = data.getA();
129 T b = data.getB();
130 T c = data.getC();
131 final T r1 = field.multiply(a, field.add(b, c));
132 final T r2 = field.add(field.multiply(a, b), field.multiply(a, c));
133 assertEquals(r1, r2, data::equals);
134 }
135
136 @ParameterizedTest
137 @MethodSource("getList")
138 <T extends Addition<T>> void testAdd(FieldTestData<T> data) {
139 Field<T> field = data.getField();
140 T a = data.getA();
141 T b = data.getB();
142
143 final T r1 = field.add(a, b);
144 final T r2 = a.add(b);
145 assertEquals(r1, r2, data::equals);
146 }
147
148 @ParameterizedTest
149 @MethodSource("getList")
150 <T extends Addition<T>> void testSubtract(FieldTestData<T> data) {
151 Field<T> field = data.getField();
152 T a = data.getA();
153 T b = data.getB();
154
155 final T r1 = field.subtract(a, b);
156 final T r2 = a.add(b.negate());
157 assertEquals(r1, r2, data::equals);
158 }
159
160 @ParameterizedTest
161 @MethodSource("getList")
162 <T extends Addition<T>> void testMultiplyInt(FieldTestData<T> data) {
163 Field<T> field = data.getField();
164 T a = data.getA();
165 final int n = 5;
166
167 final T r1 = field.multiply(n, a);
168
169 T r2 = field.zero();
170 for (int i = 0; i < n; i++) {
171 r2 = r2.add(a);
172 }
173
174 assertEquals(r1, r2, data::equals);
175 }
176
177 @ParameterizedTest
178 @MethodSource("getList")
179 <T extends Addition<T>> void testZero(FieldTestData<T> data) {
180 Field<T> field = data.getField();
181 T a = data.getA();
182
183 final T r1 = field.zero();
184 final T r2 = a.zero();
185 assertEquals(r1, r2, data::equals);
186
187
188
189
190 Arrays.asList(a, data.getB(), data.getC())
191 .forEach(t -> Assertions.assertEquals(t, r2.add(t), () -> "zero add " + t));
192 }
193
194 @ParameterizedTest
195 @MethodSource("getList")
196 <T extends Multiplication<T>> void testMultiply(FieldTestData<T> data) {
197 Field<T> field = data.getField();
198 T a = data.getA();
199 T b = data.getB();
200
201 final T r1 = field.multiply(a, b);
202 final T r2 = a.multiply(b);
203 assertEquals(r1, r2, data::equals);
204 }
205
206 @ParameterizedTest
207 @MethodSource("getList")
208 <T extends Multiplication<T>> void testDivide(FieldTestData<T> data) {
209 Field<T> field = data.getField();
210 T a = data.getA();
211 T b = data.getB();
212
213 final T r1 = field.divide(a, b);
214 final T r2 = a.multiply(b.reciprocal());
215 assertEquals(r1, r2, data::equals);
216 }
217
218 @ParameterizedTest
219 @MethodSource("getList")
220 <T extends Multiplication<T>> void testOne(FieldTestData<T> data) {
221 Field<T> field = data.getField();
222 T a = data.getA();
223
224 final T r1 = field.one();
225 final T r2 = a.one();
226 assertEquals(r1, r2, data::equals);
227
228
229
230
231 Arrays.asList(a, data.getB(), data.getC())
232 .forEach(t -> Assertions.assertEquals(t, r2.multiply(t), () -> "one multiply " + t));
233 }
234
235
236
237
238
239 private static <T> void assertEquals(T a,
240 T b,
241 BiPredicate<T, T> equals) {
242 Assertions.assertTrue(equals.test(a, b), () -> a + " != " + b);
243 }
244 }