View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
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   * Tests for fields.
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         // Test the definition:
188         // zero().add(a).equals(a)
189         // Here we ignore the equality predicate so there is no tolerance
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         // Test the definition:
229         // one().multiply(a).equals(a)
230         // Here we ignore the equality predicate so there is no tolerance
231         Arrays.asList(a, data.getB(), data.getC())
232               .forEach(t -> Assertions.assertEquals(t, r2.multiply(t), () -> "one multiply " + t));
233     }
234 
235     /**
236      * @param a Instance.
237      * @param b Instance.
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 }