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    *      https://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.lang3.builder;
18  
19  import static org.apache.commons.lang3.LangAssertions.assertNullPointerException;
20  import static org.junit.jupiter.api.Assertions.assertEquals;
21  import static org.junit.jupiter.api.Assertions.assertThrows;
22  import static org.junit.jupiter.api.Assertions.assertTrue;
23  
24  import java.math.BigInteger;
25  import java.util.Objects;
26  
27  import org.apache.commons.lang3.AbstractLangTest;
28  import org.junit.jupiter.api.Test;
29  
30  /**
31   * Tests {@link CompareToBuilder}.
32   */
33  class CompareToBuilderTest extends AbstractLangTest {
34  
35      static class TestObject implements Comparable<TestObject> {
36          private int a;
37          TestObject(final int a) {
38              this.a = a;
39          }
40          @Override
41          public int compareTo(final TestObject rhs) {
42              return Integer.compare(a, rhs.a);
43          }
44  
45          @Override
46          public boolean equals(final Object o) {
47              if (o == this) {
48                  return true;
49              }
50              if (!(o instanceof TestObject)) {
51                  return false;
52              }
53              final TestObject rhs = (TestObject) o;
54              return a == rhs.a;
55          }
56  
57          public int getA() {
58              return a;
59          }
60  
61          @Override
62          public int hashCode() {
63              return a;
64          }
65          public void setA(final int a) {
66              this.a = a;
67          }
68      }
69  
70      static class TestSubObject extends TestObject {
71          private int b;
72  
73          TestSubObject() {
74              super(0);
75          }
76  
77          TestSubObject(final int a, final int b) {
78              super(a);
79              this.b = b;
80          }
81  
82          @Override
83          public boolean equals(final Object o) {
84              if (o == this) {
85                  return true;
86              }
87              if (!(o instanceof TestSubObject)) {
88                  return false;
89              }
90              final TestSubObject rhs = (TestSubObject) o;
91              return super.equals(o) && b == rhs.b;
92          }
93  
94          @Override
95          public int hashCode() {
96              return Objects.hash(getA(), b);
97          }
98      }
99  
100     static class TestTransientSubObject extends TestObject {
101         @SuppressWarnings("unused")
102         private final transient int t;
103         TestTransientSubObject(final int a, final int t) {
104             super(a);
105             this.t = t;
106         }
107     }
108 
109     /**
110      * See "Effective Java" under "Consider Implementing Comparable".
111      *
112      * @param x an object to compare
113      * @param y an object to compare
114      * @param z an object to compare
115      * @param testTransients Whether to include transients in the comparison
116      * @param excludeFields fields to exclude
117      */
118     private void assertReflectionCompareContract(final Object x, final Object y, final Object z, final boolean testTransients, final String[] excludeFields) {
119 
120         // signum
121         assertEquals(reflectionCompareSignum(x, y, testTransients, excludeFields), -reflectionCompareSignum(y, x, testTransients, excludeFields));
122 
123         // transitive
124         if (CompareToBuilder.reflectionCompare(x, y, testTransients, null, excludeFields) > 0
125                 && CompareToBuilder.reflectionCompare(y, z, testTransients, null, excludeFields) > 0) {
126             assertTrue(CompareToBuilder.reflectionCompare(x, z, testTransients, null, excludeFields) > 0);
127         }
128 
129         // un-named
130         if (CompareToBuilder.reflectionCompare(x, y, testTransients, null, excludeFields) == 0) {
131             assertEquals(reflectionCompareSignum(x, z, testTransients, excludeFields), -reflectionCompareSignum(y, z, testTransients, excludeFields));
132         }
133 
134         // strongly recommended but not strictly required
135         assertTrue(CompareToBuilder.reflectionCompare(x, y, testTransients) == 0 == EqualsBuilder.reflectionEquals(x, y, testTransients));
136     }
137 
138     private void assertXYZCompareOrder(final Object x, final Object y, final Object z, final boolean testTransients, final String[] excludeFields) {
139         assertEquals(0, CompareToBuilder.reflectionCompare(x, x, testTransients, null, excludeFields));
140         assertEquals(0, CompareToBuilder.reflectionCompare(y, y, testTransients, null, excludeFields));
141         assertEquals(0, CompareToBuilder.reflectionCompare(z, z, testTransients, null, excludeFields));
142 
143         assertTrue(0 > CompareToBuilder.reflectionCompare(x, y, testTransients, null, excludeFields));
144         assertTrue(0 > CompareToBuilder.reflectionCompare(x, z, testTransients, null, excludeFields));
145         assertTrue(0 > CompareToBuilder.reflectionCompare(y, z, testTransients, null, excludeFields));
146 
147         assertTrue(0 < CompareToBuilder.reflectionCompare(y, x, testTransients, null, excludeFields));
148         assertTrue(0 < CompareToBuilder.reflectionCompare(z, x, testTransients, null, excludeFields));
149         assertTrue(0 < CompareToBuilder.reflectionCompare(z, y, testTransients, null, excludeFields));
150     }
151 
152     /**
153      * Returns the signum of the result of comparing x and y with
154      * {@code CompareToBuilder.reflectionCompare}
155      *
156      * @param lhs The "left-hand-side" of the comparison.
157      * @param rhs The "right-hand-side" of the comparison.
158      * @param testTransients Whether to include transients in the comparison
159      * @param excludeFields fields to exclude
160      * @return int The signum
161      */
162     private int reflectionCompareSignum(final Object lhs, final Object rhs, final boolean testTransients, final String[] excludeFields) {
163         return BigInteger.valueOf(CompareToBuilder.reflectionCompare(lhs, rhs, testTransients)).signum();
164     }
165 
166     @Test
167     void testAppendSuper() {
168         final TestObject o1 = new TestObject(4);
169         final TestObject o2 = new TestObject(5);
170         assertEquals(0, new CompareToBuilder().appendSuper(0).append(o1, o1).toComparison());
171         assertTrue(new CompareToBuilder().appendSuper(0).append(o1, o2).toComparison() < 0);
172         assertTrue(new CompareToBuilder().appendSuper(0).append(o2, o1).toComparison() > 0);
173 
174         assertTrue(new CompareToBuilder().appendSuper(-1).append(o1, o1).toComparison() < 0);
175         assertTrue(new CompareToBuilder().appendSuper(-1).append(o1, o2).toComparison() < 0);
176 
177         assertTrue(new CompareToBuilder().appendSuper(1).append(o1, o1).toComparison() > 0);
178         assertTrue(new CompareToBuilder().appendSuper(1).append(o1, o2).toComparison() > 0);
179     }
180 
181     @Test
182     void testBoolean() {
183         final boolean o1 = true;
184         final boolean o2 = false;
185         assertEquals(0, new CompareToBuilder().append(o1, o1).toComparison());
186         assertEquals(0, new CompareToBuilder().append(o2, o2).toComparison());
187         assertTrue(new CompareToBuilder().append(o1, o2).toComparison() > 0);
188         assertTrue(new CompareToBuilder().append(o2, o1).toComparison() < 0);
189     }
190 
191     @Test
192     void testBooleanArray() {
193         final boolean[] obj1 = new boolean[2];
194         obj1[0] = true;
195         obj1[1] = false;
196         final boolean[] obj2 = new boolean[2];
197         obj2[0] = true;
198         obj2[1] = false;
199         final boolean[] obj3 = new boolean[3];
200         obj3[0] = true;
201         obj3[1] = false;
202         obj3[2] = true;
203 
204         assertEquals(0, new CompareToBuilder().append(obj1, obj1).toComparison());
205         assertEquals(0, new CompareToBuilder().append(obj1, obj2).toComparison());
206         assertTrue(new CompareToBuilder().append(obj1, obj3).toComparison() < 0);
207         assertTrue(new CompareToBuilder().append(obj3, obj1).toComparison() > 0);
208 
209         obj1[1] = true;
210         assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() > 0);
211         assertTrue(new CompareToBuilder().append(obj2, obj1).toComparison() < 0);
212 
213         assertTrue(new CompareToBuilder().append(obj1, null).toComparison() > 0);
214         assertEquals(0, new CompareToBuilder().append((boolean[]) null, null).toComparison());
215         assertTrue(new CompareToBuilder().append(null, obj1).toComparison() < 0);
216     }
217 
218     @Test
219     void testBooleanArrayHiddenByObject() {
220         final boolean[] array1 = new boolean[2];
221         array1[0] = true;
222         array1[1] = false;
223         final boolean[] array2 = new boolean[2];
224         array2[0] = true;
225         array2[1] = false;
226         final boolean[] array3 = new boolean[3];
227         array3[0] = true;
228         array3[1] = false;
229         array3[2] = true;
230         final Object obj1 = array1;
231         final Object obj2 = array2;
232         final Object obj3 = array3;
233         assertEquals(0, new CompareToBuilder().append(obj1, obj1).toComparison());
234         assertEquals(0, new CompareToBuilder().append(obj1, obj2).toComparison());
235         assertTrue(new CompareToBuilder().append(obj1, obj3).toComparison() < 0);
236         assertTrue(new CompareToBuilder().append(obj3, obj1).toComparison() > 0);
237 
238         array1[1] = true;
239         assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() > 0);
240         assertTrue(new CompareToBuilder().append(obj2, obj1).toComparison() < 0);
241     }
242 
243     @Test
244     void testByte() {
245         final byte o1 = 1;
246         final byte o2 = 2;
247         assertEquals(0, new CompareToBuilder().append(o1, o1).toComparison());
248         assertTrue(new CompareToBuilder().append(o1, o2).toComparison() < 0);
249         assertTrue(new CompareToBuilder().append(o2, o1).toComparison() > 0);
250         assertTrue(new CompareToBuilder().append(o1, Byte.MAX_VALUE).toComparison() < 0);
251         assertTrue(new CompareToBuilder().append(Byte.MAX_VALUE, o1).toComparison() > 0);
252         assertTrue(new CompareToBuilder().append(o1, Byte.MIN_VALUE).toComparison() > 0);
253         assertTrue(new CompareToBuilder().append(Byte.MIN_VALUE, o1).toComparison() < 0);
254     }
255 
256     @Test
257     void testByteArray() {
258         final byte[] obj1 = new byte[2];
259         obj1[0] = 5;
260         obj1[1] = 6;
261         final byte[] obj2 = new byte[2];
262         obj2[0] = 5;
263         obj2[1] = 6;
264         final byte[] obj3 = new byte[3];
265         obj3[0] = 5;
266         obj3[1] = 6;
267         obj3[2] = 7;
268 
269         assertEquals(0, new CompareToBuilder().append(obj1, obj1).toComparison());
270         assertEquals(0, new CompareToBuilder().append(obj1, obj2).toComparison());
271         assertTrue(new CompareToBuilder().append(obj1, obj3).toComparison() < 0);
272         assertTrue(new CompareToBuilder().append(obj3, obj1).toComparison() > 0);
273 
274         obj1[1] = 7;
275         assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() > 0);
276         assertTrue(new CompareToBuilder().append(obj2, obj1).toComparison() < 0);
277 
278         assertTrue(new CompareToBuilder().append(obj1, null).toComparison() > 0);
279         assertEquals(0, new CompareToBuilder().append((byte[]) null, null).toComparison());
280         assertTrue(new CompareToBuilder().append(null, obj1).toComparison() < 0);
281     }
282 
283     @Test
284     void testByteArrayHiddenByObject() {
285         final byte[] array1 = new byte[2];
286         array1[0] = 5;
287         array1[1] = 6;
288         final byte[] array2 = new byte[2];
289         array2[0] = 5;
290         array2[1] = 6;
291         final byte[] array3 = new byte[3];
292         array3[0] = 5;
293         array3[1] = 6;
294         array3[2] = 7;
295         final Object obj1 = array1;
296         final Object obj2 = array2;
297         final Object obj3 = array3;
298         assertEquals(0, new CompareToBuilder().append(obj1, obj1).toComparison());
299         assertEquals(0, new CompareToBuilder().append(obj1, obj2).toComparison());
300         assertTrue(new CompareToBuilder().append(obj1, obj3).toComparison() < 0);
301         assertTrue(new CompareToBuilder().append(obj3, obj1).toComparison() > 0);
302 
303         array1[1] = 7;
304         assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() > 0);
305         assertTrue(new CompareToBuilder().append(obj2, obj1).toComparison() < 0);
306     }
307 
308     @Test
309     void testChar() {
310         final char o1 = 1;
311         final char o2 = 2;
312         assertEquals(0, new CompareToBuilder().append(o1, o1).toComparison());
313         assertTrue(new CompareToBuilder().append(o1, o2).toComparison() < 0);
314         assertTrue(new CompareToBuilder().append(o2, o1).toComparison() > 0);
315         assertTrue(new CompareToBuilder().append(o1, Character.MAX_VALUE).toComparison() < 0);
316         assertTrue(new CompareToBuilder().append(Character.MAX_VALUE, o1).toComparison() > 0);
317         assertTrue(new CompareToBuilder().append(o1, Character.MIN_VALUE).toComparison() > 0);
318         assertTrue(new CompareToBuilder().append(Character.MIN_VALUE, o1).toComparison() < 0);
319     }
320 
321     @Test
322     void testCharArray() {
323         final char[] obj1 = new char[2];
324         obj1[0] = 5;
325         obj1[1] = 6;
326         final char[] obj2 = new char[2];
327         obj2[0] = 5;
328         obj2[1] = 6;
329         final char[] obj3 = new char[3];
330         obj3[0] = 5;
331         obj3[1] = 6;
332         obj3[2] = 7;
333 
334         assertEquals(0, new CompareToBuilder().append(obj1, obj1).toComparison());
335         assertEquals(0, new CompareToBuilder().append(obj1, obj2).toComparison());
336         assertTrue(new CompareToBuilder().append(obj1, obj3).toComparison() < 0);
337         assertTrue(new CompareToBuilder().append(obj3, obj1).toComparison() > 0);
338 
339         obj1[1] = 7;
340         assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() > 0);
341         assertTrue(new CompareToBuilder().append(obj2, obj1).toComparison() < 0);
342 
343         assertTrue(new CompareToBuilder().append(obj1, null).toComparison() > 0);
344         assertEquals(0, new CompareToBuilder().append((char[]) null, null).toComparison());
345         assertTrue(new CompareToBuilder().append(null, obj1).toComparison() < 0);
346     }
347 
348     @Test
349     void testCharArrayHiddenByObject() {
350         final char[] array1 = new char[2];
351         array1[0] = 5;
352         array1[1] = 6;
353         final char[] array2 = new char[2];
354         array2[0] = 5;
355         array2[1] = 6;
356         final char[] array3 = new char[3];
357         array3[0] = 5;
358         array3[1] = 6;
359         array3[2] = 7;
360         final Object obj1 = array1;
361         final Object obj2 = array2;
362         final Object obj3 = array3;
363         assertEquals(0, new CompareToBuilder().append(obj1, obj1).toComparison());
364         assertEquals(0, new CompareToBuilder().append(obj1, obj2).toComparison());
365         assertTrue(new CompareToBuilder().append(obj1, obj3).toComparison() < 0);
366         assertTrue(new CompareToBuilder().append(obj3, obj1).toComparison() > 0);
367 
368         array1[1] = 7;
369         assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() > 0);
370         assertTrue(new CompareToBuilder().append(obj2, obj1).toComparison() < 0);
371     }
372 
373     @Test
374     void testDouble() {
375         final double o1 = 1;
376         final double o2 = 2;
377         assertEquals(0, new CompareToBuilder().append(o1, o1).toComparison());
378         assertTrue(new CompareToBuilder().append(o1, o2).toComparison() < 0);
379         assertTrue(new CompareToBuilder().append(o2, o1).toComparison() > 0);
380         assertTrue(new CompareToBuilder().append(o1, Double.MAX_VALUE).toComparison() < 0);
381         assertTrue(new CompareToBuilder().append(Double.MAX_VALUE, o1).toComparison() > 0);
382         assertTrue(new CompareToBuilder().append(o1, Double.MIN_VALUE).toComparison() > 0);
383         assertTrue(new CompareToBuilder().append(Double.MIN_VALUE, o1).toComparison() < 0);
384         assertEquals(0, new CompareToBuilder().append(Double.NaN, Double.NaN).toComparison());
385         assertTrue(new CompareToBuilder().append(Double.NaN, Double.MAX_VALUE).toComparison() > 0);
386         assertTrue(new CompareToBuilder().append(Double.POSITIVE_INFINITY, Double.MAX_VALUE).toComparison() > 0);
387         assertTrue(new CompareToBuilder().append(Double.NEGATIVE_INFINITY, Double.MIN_VALUE).toComparison() < 0);
388         assertTrue(new CompareToBuilder().append(o1, Double.NaN).toComparison() < 0);
389         assertTrue(new CompareToBuilder().append(Double.NaN, o1).toComparison() > 0);
390         assertTrue(new CompareToBuilder().append(-0.0, 0.0).toComparison() < 0);
391         assertTrue(new CompareToBuilder().append(0.0, -0.0).toComparison() > 0);
392     }
393 
394     @Test
395     void testDoubleArray() {
396         final double[] obj1 = new double[2];
397         obj1[0] = 5;
398         obj1[1] = 6;
399         final double[] obj2 = new double[2];
400         obj2[0] = 5;
401         obj2[1] = 6;
402         final double[] obj3 = new double[3];
403         obj3[0] = 5;
404         obj3[1] = 6;
405         obj3[2] = 7;
406 
407         assertEquals(0, new CompareToBuilder().append(obj1, obj1).toComparison());
408         assertEquals(0, new CompareToBuilder().append(obj1, obj2).toComparison());
409         assertTrue(new CompareToBuilder().append(obj1, obj3).toComparison() < 0);
410         assertTrue(new CompareToBuilder().append(obj3, obj1).toComparison() > 0);
411 
412         obj1[1] = 7;
413         assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() > 0);
414         assertTrue(new CompareToBuilder().append(obj2, obj1).toComparison() < 0);
415 
416         assertTrue(new CompareToBuilder().append(obj1, null).toComparison() > 0);
417         assertEquals(0, new CompareToBuilder().append((double[]) null, null).toComparison());
418         assertTrue(new CompareToBuilder().append(null, obj1).toComparison() < 0);
419     }
420 
421     @Test
422     void testDoubleArrayHiddenByObject() {
423         final double[] array1 = new double[2];
424         array1[0] = 5;
425         array1[1] = 6;
426         final double[] array2 = new double[2];
427         array2[0] = 5;
428         array2[1] = 6;
429         final double[] array3 = new double[3];
430         array3[0] = 5;
431         array3[1] = 6;
432         array3[2] = 7;
433         final Object obj1 = array1;
434         final Object obj2 = array2;
435         final Object obj3 = array3;
436         assertEquals(0, new CompareToBuilder().append(obj1, obj1).toComparison());
437         assertEquals(0, new CompareToBuilder().append(obj1, obj2).toComparison());
438         assertTrue(new CompareToBuilder().append(obj1, obj3).toComparison() < 0);
439         assertTrue(new CompareToBuilder().append(obj3, obj1).toComparison() > 0);
440 
441         array1[1] = 7;
442         assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() > 0);
443         assertTrue(new CompareToBuilder().append(obj2, obj1).toComparison() < 0);
444     }
445 
446     @Test
447     void testFloat() {
448         final float o1 = 1;
449         final float o2 = 2;
450         assertEquals(0, new CompareToBuilder().append(o1, o1).toComparison());
451         assertTrue(new CompareToBuilder().append(o1, o2).toComparison() < 0);
452         assertTrue(new CompareToBuilder().append(o2, o1).toComparison() > 0);
453         assertTrue(new CompareToBuilder().append(o1, Float.MAX_VALUE).toComparison() < 0);
454         assertTrue(new CompareToBuilder().append(Float.MAX_VALUE, o1).toComparison() > 0);
455         assertTrue(new CompareToBuilder().append(o1, Float.MIN_VALUE).toComparison() > 0);
456         assertTrue(new CompareToBuilder().append(Float.MIN_VALUE, o1).toComparison() < 0);
457         assertEquals(0, new CompareToBuilder().append(Float.NaN, Float.NaN).toComparison());
458         assertTrue(new CompareToBuilder().append(Float.NaN, Float.MAX_VALUE).toComparison() > 0);
459         assertTrue(new CompareToBuilder().append(Float.POSITIVE_INFINITY, Float.MAX_VALUE).toComparison() > 0);
460         assertTrue(new CompareToBuilder().append(Float.NEGATIVE_INFINITY, Float.MIN_VALUE).toComparison() < 0);
461         assertTrue(new CompareToBuilder().append(o1, Float.NaN).toComparison() < 0);
462         assertTrue(new CompareToBuilder().append(Float.NaN, o1).toComparison() > 0);
463         assertTrue(new CompareToBuilder().append(-0.0, 0.0).toComparison() < 0);
464         assertTrue(new CompareToBuilder().append(0.0, -0.0).toComparison() > 0);
465     }
466 
467     @Test
468     void testFloatArray() {
469         final float[] obj1 = new float[2];
470         obj1[0] = 5;
471         obj1[1] = 6;
472         final float[] obj2 = new float[2];
473         obj2[0] = 5;
474         obj2[1] = 6;
475         final float[] obj3 = new float[3];
476         obj3[0] = 5;
477         obj3[1] = 6;
478         obj3[2] = 7;
479 
480         assertEquals(0, new CompareToBuilder().append(obj1, obj1).toComparison());
481         assertEquals(0, new CompareToBuilder().append(obj1, obj2).toComparison());
482         assertTrue(new CompareToBuilder().append(obj1, obj3).toComparison() < 0);
483         assertTrue(new CompareToBuilder().append(obj3, obj1).toComparison() > 0);
484 
485         obj1[1] = 7;
486         assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() > 0);
487         assertTrue(new CompareToBuilder().append(obj2, obj1).toComparison() < 0);
488 
489         assertTrue(new CompareToBuilder().append(obj1, null).toComparison() > 0);
490         assertEquals(0, new CompareToBuilder().append((float[]) null, null).toComparison());
491         assertTrue(new CompareToBuilder().append(null, obj1).toComparison() < 0);
492     }
493 
494     @Test
495     void testFloatArrayHiddenByObject() {
496         final float[] array1 = new float[2];
497         array1[0] = 5;
498         array1[1] = 6;
499         final float[] array2 = new float[2];
500         array2[0] = 5;
501         array2[1] = 6;
502         final float[] array3 = new float[3];
503         array3[0] = 5;
504         array3[1] = 6;
505         array3[2] = 7;
506         final Object obj1 = array1;
507         final Object obj2 = array2;
508         final Object obj3 = array3;
509         assertEquals(0, new CompareToBuilder().append(obj1, obj1).toComparison());
510         assertEquals(0, new CompareToBuilder().append(obj1, obj2).toComparison());
511         assertTrue(new CompareToBuilder().append(obj1, obj3).toComparison() < 0);
512         assertTrue(new CompareToBuilder().append(obj3, obj1).toComparison() > 0);
513 
514         array1[1] = 7;
515         assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() > 0);
516         assertTrue(new CompareToBuilder().append(obj2, obj1).toComparison() < 0);
517     }
518 
519     @Test
520     void testInt() {
521         final int o1 = 1;
522         final int o2 = 2;
523         assertEquals(0, new CompareToBuilder().append(o1, o1).toComparison());
524         assertTrue(new CompareToBuilder().append(o1, o2).toComparison() < 0);
525         assertTrue(new CompareToBuilder().append(o2, o1).toComparison() > 0);
526         assertTrue(new CompareToBuilder().append(o1, Integer.MAX_VALUE).toComparison() < 0);
527         assertTrue(new CompareToBuilder().append(Integer.MAX_VALUE, o1).toComparison() > 0);
528         assertTrue(new CompareToBuilder().append(o1, Integer.MIN_VALUE).toComparison() > 0);
529         assertTrue(new CompareToBuilder().append(Integer.MIN_VALUE, o1).toComparison() < 0);
530     }
531 
532     @Test
533     void testIntArray() {
534         final int[] obj1 = new int[2];
535         obj1[0] = 5;
536         obj1[1] = 6;
537         final int[] obj2 = new int[2];
538         obj2[0] = 5;
539         obj2[1] = 6;
540         final int[] obj3 = new int[3];
541         obj3[0] = 5;
542         obj3[1] = 6;
543         obj3[2] = 7;
544 
545         assertEquals(0, new CompareToBuilder().append(obj1, obj1).toComparison());
546         assertEquals(0, new CompareToBuilder().append(obj1, obj2).toComparison());
547         assertTrue(new CompareToBuilder().append(obj1, obj3).toComparison() < 0);
548         assertTrue(new CompareToBuilder().append(obj3, obj1).toComparison() > 0);
549 
550         obj1[1] = 7;
551         assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() > 0);
552         assertTrue(new CompareToBuilder().append(obj2, obj1).toComparison() < 0);
553 
554         assertTrue(new CompareToBuilder().append(obj1, null).toComparison() > 0);
555         assertEquals(0, new CompareToBuilder().append((int[]) null, null).toComparison());
556         assertTrue(new CompareToBuilder().append(null, obj1).toComparison() < 0);
557     }
558 
559     @Test
560     void testIntArrayHiddenByObject() {
561         final int[] array1 = new int[2];
562         array1[0] = 5;
563         array1[1] = 6;
564         final int[] array2 = new int[2];
565         array2[0] = 5;
566         array2[1] = 6;
567         final int[] array3 = new int[3];
568         array3[0] = 5;
569         array3[1] = 6;
570         array3[2] = 7;
571         final Object obj1 = array1;
572         final Object obj2 = array2;
573         final Object obj3 = array3;
574         assertEquals(0, new CompareToBuilder().append(obj1, obj1).toComparison());
575         assertEquals(0, new CompareToBuilder().append(obj1, obj2).toComparison());
576         assertTrue(new CompareToBuilder().append(obj1, obj3).toComparison() < 0);
577         assertTrue(new CompareToBuilder().append(obj3, obj1).toComparison() > 0);
578 
579         array1[1] = 7;
580         assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() > 0);
581         assertTrue(new CompareToBuilder().append(obj2, obj1).toComparison() < 0);
582     }
583 
584     @Test
585     void testLong() {
586         final long o1 = 1L;
587         final long o2 = 2L;
588         assertEquals(0, new CompareToBuilder().append(o1, o1).toComparison());
589         assertTrue(new CompareToBuilder().append(o1, o2).toComparison() < 0);
590         assertTrue(new CompareToBuilder().append(o2, o1).toComparison() > 0);
591         assertTrue(new CompareToBuilder().append(o1, Long.MAX_VALUE).toComparison() < 0);
592         assertTrue(new CompareToBuilder().append(Long.MAX_VALUE, o1).toComparison() > 0);
593         assertTrue(new CompareToBuilder().append(o1, Long.MIN_VALUE).toComparison() > 0);
594         assertTrue(new CompareToBuilder().append(Long.MIN_VALUE, o1).toComparison() < 0);
595     }
596 
597     @Test
598     void testLongArray() {
599         final long[] obj1 = new long[2];
600         obj1[0] = 5L;
601         obj1[1] = 6L;
602         final long[] obj2 = new long[2];
603         obj2[0] = 5L;
604         obj2[1] = 6L;
605         final long[] obj3 = new long[3];
606         obj3[0] = 5L;
607         obj3[1] = 6L;
608         obj3[2] = 7L;
609 
610         assertEquals(0, new CompareToBuilder().append(obj1, obj1).toComparison());
611         assertEquals(0, new CompareToBuilder().append(obj1, obj2).toComparison());
612         assertTrue(new CompareToBuilder().append(obj1, obj3).toComparison() < 0);
613         assertTrue(new CompareToBuilder().append(obj3, obj1).toComparison() > 0);
614 
615         obj1[1] = 7;
616         assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() > 0);
617         assertTrue(new CompareToBuilder().append(obj2, obj1).toComparison() < 0);
618 
619         assertTrue(new CompareToBuilder().append(obj1, null).toComparison() > 0);
620         assertEquals(0, new CompareToBuilder().append((long[]) null, null).toComparison());
621         assertTrue(new CompareToBuilder().append(null, obj1).toComparison() < 0);
622     }
623 
624     @Test
625     void testLongArrayHiddenByObject() {
626         final long[] array1 = new long[2];
627         array1[0] = 5L;
628         array1[1] = 6L;
629         final long[] array2 = new long[2];
630         array2[0] = 5L;
631         array2[1] = 6L;
632         final long[] array3 = new long[3];
633         array3[0] = 5L;
634         array3[1] = 6L;
635         array3[2] = 7L;
636         final Object obj1 = array1;
637         final Object obj2 = array2;
638         final Object obj3 = array3;
639         assertEquals(0, new CompareToBuilder().append(obj1, obj1).toComparison());
640         assertEquals(0, new CompareToBuilder().append(obj1, obj2).toComparison());
641         assertTrue(new CompareToBuilder().append(obj1, obj3).toComparison() < 0);
642         assertTrue(new CompareToBuilder().append(obj3, obj1).toComparison() > 0);
643 
644         array1[1] = 7;
645         assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() > 0);
646         assertTrue(new CompareToBuilder().append(obj2, obj1).toComparison() < 0);
647     }
648 
649     @Test
650     void testMixedArray() {
651         final Object[] array1 = new Object[2];
652         final Object[] array2 = new Object[2];
653         final Object[] array3 = new Object[2];
654         for (int i = 0; i < array1.length; ++i) {
655             array1[i] = new long[2];
656             array2[i] = new long[2];
657             array3[i] = new long[3];
658             for (int j = 0; j < 2; ++j) {
659                 ((long[]) array1[i])[j] = (i + 1) * (j + 1);
660                 ((long[]) array2[i])[j] = (i + 1) * (j + 1);
661                 ((long[]) array3[i])[j] = (i + 1) * (j + 1);
662             }
663         }
664         ((long[]) array3[0])[2] = 1;
665         ((long[]) array3[1])[2] = 1;
666         assertEquals(0, new CompareToBuilder().append(array1, array1).toComparison());
667         assertEquals(0, new CompareToBuilder().append(array1, array2).toComparison());
668         assertTrue(new CompareToBuilder().append(array1, array3).toComparison() < 0);
669         assertTrue(new CompareToBuilder().append(array3, array1).toComparison() > 0);
670         ((long[]) array1[1])[1] = 200;
671         assertTrue(new CompareToBuilder().append(array1, array2).toComparison() > 0);
672         assertTrue(new CompareToBuilder().append(array2, array1).toComparison() < 0);
673     }
674 
675     @Test
676     void testMultiBooleanArray() {
677         final boolean[][] array1 = new boolean[2][2];
678         final boolean[][] array2 = new boolean[2][2];
679         final boolean[][] array3 = new boolean[2][3];
680         for (int i = 0; i < array1.length; ++i) {
681             for (int j = 0; j < array1[0].length; j++) {
682                 array1[i][j] = i == 1 ^ j == 1;
683                 array2[i][j] = i == 1 ^ j == 1;
684                 array3[i][j] = i == 1 ^ j == 1;
685             }
686         }
687         array3[1][2] = false;
688         array3[1][2] = false;
689 
690         assertEquals(0, new CompareToBuilder().append(array1, array1).toComparison());
691         assertEquals(0, new CompareToBuilder().append(array1, array2).toComparison());
692         assertTrue(new CompareToBuilder().append(array1, array3).toComparison() < 0);
693         assertTrue(new CompareToBuilder().append(array3, array1).toComparison() > 0);
694         array1[1][1] = true;
695         assertTrue(new CompareToBuilder().append(array1, array2).toComparison() > 0);
696         assertTrue(new CompareToBuilder().append(array2, array1).toComparison() < 0);
697     }
698 
699     @Test
700     void testMultiByteArray() {
701         final byte[][] array1 = new byte[2][2];
702         final byte[][] array2 = new byte[2][2];
703         final byte[][] array3 = new byte[2][3];
704         for (byte i = 0; i < array1.length; ++i) {
705             for (byte j = 0; j < array1[0].length; j++) {
706                 array1[i][j] = (byte) ((i + 1) * (j + 1));
707                 array2[i][j] = (byte) ((i + 1) * (j + 1));
708                 array3[i][j] = (byte) ((i + 1) * (j + 1));
709             }
710         }
711         array3[1][2] = 100;
712         array3[1][2] = 100;
713 
714         assertEquals(0, new CompareToBuilder().append(array1, array1).toComparison());
715         assertEquals(0, new CompareToBuilder().append(array1, array2).toComparison());
716         assertTrue(new CompareToBuilder().append(array1, array3).toComparison() < 0);
717         assertTrue(new CompareToBuilder().append(array3, array1).toComparison() > 0);
718         array1[1][1] = 127;
719         assertTrue(new CompareToBuilder().append(array1, array2).toComparison() > 0);
720         assertTrue(new CompareToBuilder().append(array2, array1).toComparison() < 0);
721     }
722 
723     @Test
724     void testMultiCharArray() {
725         final char[][] array1 = new char[2][2];
726         final char[][] array2 = new char[2][2];
727         final char[][] array3 = new char[2][3];
728         for (short i = 0; i < array1.length; ++i) {
729             for (short j = 0; j < array1[0].length; j++) {
730                 array1[i][j] = (char) ((i + 1) * (j + 1));
731                 array2[i][j] = (char) ((i + 1) * (j + 1));
732                 array3[i][j] = (char) ((i + 1) * (j + 1));
733             }
734         }
735         array3[1][2] = 100;
736         array3[1][2] = 100;
737 
738         assertEquals(0, new CompareToBuilder().append(array1, array1).toComparison());
739         assertEquals(0, new CompareToBuilder().append(array1, array2).toComparison());
740         assertTrue(new CompareToBuilder().append(array1, array3).toComparison() < 0);
741         assertTrue(new CompareToBuilder().append(array3, array1).toComparison() > 0);
742         array1[1][1] = 200;
743         assertTrue(new CompareToBuilder().append(array1, array2).toComparison() > 0);
744         assertTrue(new CompareToBuilder().append(array2, array1).toComparison() < 0);
745     }
746 
747     @Test
748     void testMultiDoubleArray() {
749         final double[][] array1 = new double[2][2];
750         final double[][] array2 = new double[2][2];
751         final double[][] array3 = new double[2][3];
752         for (int i = 0; i < array1.length; ++i) {
753             for (int j = 0; j < array1[0].length; j++) {
754                 array1[i][j] = (i + 1) * (j + 1);
755                 array2[i][j] = (i + 1) * (j + 1);
756                 array3[i][j] = (i + 1) * (j + 1);
757             }
758         }
759         array3[1][2] = 100;
760         array3[1][2] = 100;
761 
762         assertEquals(0, new CompareToBuilder().append(array1, array1).toComparison());
763         assertEquals(0, new CompareToBuilder().append(array1, array2).toComparison());
764         assertTrue(new CompareToBuilder().append(array1, array3).toComparison() < 0);
765         assertTrue(new CompareToBuilder().append(array3, array1).toComparison() > 0);
766         array1[1][1] = 127;
767         assertTrue(new CompareToBuilder().append(array1, array2).toComparison() > 0);
768         assertTrue(new CompareToBuilder().append(array2, array1).toComparison() < 0);
769     }
770 
771     @Test
772     void testMultiFloatArray() {
773         final float[][] array1 = new float[2][2];
774         final float[][] array2 = new float[2][2];
775         final float[][] array3 = new float[2][3];
776         for (int i = 0; i < array1.length; ++i) {
777             for (int j = 0; j < array1[0].length; j++) {
778                 array1[i][j] = (i + 1) * (j + 1);
779                 array2[i][j] = (i + 1) * (j + 1);
780                 array3[i][j] = (i + 1) * (j + 1);
781             }
782         }
783         array3[1][2] = 100;
784         array3[1][2] = 100;
785 
786         assertEquals(0, new CompareToBuilder().append(array1, array1).toComparison());
787         assertEquals(0, new CompareToBuilder().append(array1, array2).toComparison());
788         assertTrue(new CompareToBuilder().append(array1, array3).toComparison() < 0);
789         assertTrue(new CompareToBuilder().append(array3, array1).toComparison() > 0);
790         array1[1][1] = 127;
791         assertTrue(new CompareToBuilder().append(array1, array2).toComparison() > 0);
792         assertTrue(new CompareToBuilder().append(array2, array1).toComparison() < 0);
793     }
794 
795     @Test
796     void testMultiIntArray() {
797         final int[][] array1 = new int[2][2];
798         final int[][] array2 = new int[2][2];
799         final int[][] array3 = new int[2][3];
800         for (int i = 0; i < array1.length; ++i) {
801             for (int j = 0; j < array1[0].length; j++) {
802                 array1[i][j] = (i + 1) * (j + 1);
803                 array2[i][j] = (i + 1) * (j + 1);
804                 array3[i][j] = (i + 1) * (j + 1);
805             }
806         }
807         array3[1][2] = 100;
808         array3[1][2] = 100;
809 
810         assertEquals(0, new CompareToBuilder().append(array1, array1).toComparison());
811         assertEquals(0, new CompareToBuilder().append(array1, array2).toComparison());
812         assertTrue(new CompareToBuilder().append(array1, array3).toComparison() < 0);
813         assertTrue(new CompareToBuilder().append(array3, array1).toComparison() > 0);
814         array1[1][1] = 200;
815         assertTrue(new CompareToBuilder().append(array1, array2).toComparison() > 0);
816         assertTrue(new CompareToBuilder().append(array2, array1).toComparison() < 0);
817     }
818 
819     @Test
820     void testMultiLongArray() {
821         final long[][] array1 = new long[2][2];
822         final long[][] array2 = new long[2][2];
823         final long[][] array3 = new long[2][3];
824         for (int i = 0; i < array1.length; ++i) {
825             for (int j = 0; j < array1[0].length; j++) {
826                 array1[i][j] = (i + 1) * (j + 1);
827                 array2[i][j] = (i + 1) * (j + 1);
828                 array3[i][j] = (i + 1) * (j + 1);
829             }
830         }
831         array3[1][2] = 100;
832         array3[1][2] = 100;
833 
834         assertEquals(0, new CompareToBuilder().append(array1, array1).toComparison());
835         assertEquals(0, new CompareToBuilder().append(array1, array2).toComparison());
836         assertTrue(new CompareToBuilder().append(array1, array3).toComparison() < 0);
837         assertTrue(new CompareToBuilder().append(array3, array1).toComparison() > 0);
838         array1[1][1] = 200;
839         assertTrue(new CompareToBuilder().append(array1, array2).toComparison() > 0);
840         assertTrue(new CompareToBuilder().append(array2, array1).toComparison() < 0);
841     }
842 
843     @Test
844     void testMultiShortArray() {
845         final short[][] array1 = new short[2][2];
846         final short[][] array2 = new short[2][2];
847         final short[][] array3 = new short[2][3];
848         for (short i = 0; i < array1.length; ++i) {
849             for (short j = 0; j < array1[0].length; j++) {
850                 array1[i][j] = (short) ((i + 1) * (j + 1));
851                 array2[i][j] = (short) ((i + 1) * (j + 1));
852                 array3[i][j] = (short) ((i + 1) * (j + 1));
853             }
854         }
855         array3[1][2] = 100;
856         array3[1][2] = 100;
857 
858         assertEquals(0, new CompareToBuilder().append(array1, array1).toComparison());
859         assertEquals(0, new CompareToBuilder().append(array1, array2).toComparison());
860         assertTrue(new CompareToBuilder().append(array1, array3).toComparison() < 0);
861         assertTrue(new CompareToBuilder().append(array3, array1).toComparison() > 0);
862         array1[1][1] = 200;
863         assertTrue(new CompareToBuilder().append(array1, array2).toComparison() > 0);
864         assertTrue(new CompareToBuilder().append(array2, array1).toComparison() < 0);
865     }
866 
867     @Test
868     void testObject() {
869         final TestObject o1 = new TestObject(4);
870         final TestObject o2 = new TestObject(4);
871         assertEquals(0, new CompareToBuilder().append(o1, o1).toComparison());
872         assertEquals(0, new CompareToBuilder().append(o1, o2).toComparison());
873         o2.setA(5);
874         assertTrue(new CompareToBuilder().append(o1, o2).toComparison() < 0);
875         assertTrue(new CompareToBuilder().append(o2, o1).toComparison() > 0);
876 
877         assertTrue(new CompareToBuilder().append(o1, null).toComparison() > 0);
878         assertEquals(0, new CompareToBuilder().append((Object) null, null).toComparison());
879         assertTrue(new CompareToBuilder().append(null, o1).toComparison() < 0);
880     }
881 
882     @Test
883     void testObjectArray() {
884         final TestObject[] obj1 = new TestObject[2];
885         obj1[0] = new TestObject(4);
886         obj1[1] = new TestObject(5);
887         final TestObject[] obj2 = new TestObject[2];
888         obj2[0] = new TestObject(4);
889         obj2[1] = new TestObject(5);
890         final TestObject[] obj3 = new TestObject[3];
891         obj3[0] = new TestObject(4);
892         obj3[1] = new TestObject(5);
893         obj3[2] = new TestObject(6);
894 
895         assertEquals(0, new CompareToBuilder().append(obj1, obj1).toComparison());
896         assertEquals(0, new CompareToBuilder().append(obj1, obj2).toComparison());
897         assertTrue(new CompareToBuilder().append(obj1, obj3).toComparison() < 0);
898         assertTrue(new CompareToBuilder().append(obj3, obj1).toComparison() > 0);
899 
900         obj1[1] = new TestObject(7);
901         assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() > 0);
902         assertTrue(new CompareToBuilder().append(obj2, obj1).toComparison() < 0);
903 
904         assertTrue(new CompareToBuilder().append(obj1, null).toComparison() > 0);
905         assertEquals(0, new CompareToBuilder().append((Object[]) null, null).toComparison());
906         assertTrue(new CompareToBuilder().append(null, obj1).toComparison() < 0);
907     }
908 
909     @Test
910     void testObjectArrayHiddenByObject() {
911         final TestObject[] array1 = new TestObject[2];
912         array1[0] = new TestObject(4);
913         array1[1] = new TestObject(5);
914         final TestObject[] array2 = new TestObject[2];
915         array2[0] = new TestObject(4);
916         array2[1] = new TestObject(5);
917         final TestObject[] array3 = new TestObject[3];
918         array3[0] = new TestObject(4);
919         array3[1] = new TestObject(5);
920         array3[2] = new TestObject(6);
921 
922         final Object obj1 = array1;
923         final Object obj2 = array2;
924         final Object obj3 = array3;
925 
926         assertEquals(0, new CompareToBuilder().append(obj1, obj1).toComparison());
927         assertEquals(0, new CompareToBuilder().append(obj1, obj2).toComparison());
928         assertTrue(new CompareToBuilder().append(obj1, obj3).toComparison() < 0);
929         assertTrue(new CompareToBuilder().append(obj3, obj1).toComparison() > 0);
930 
931         array1[1] = new TestObject(7);
932         assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() > 0);
933         assertTrue(new CompareToBuilder().append(obj2, obj1).toComparison() < 0);
934     }
935 
936     @Test
937     void testObjectBuild() {
938         final TestObject o1 = new TestObject(4);
939         final TestObject o2 = new TestObject(4);
940         assertEquals(Integer.valueOf(0), new CompareToBuilder().append(o1, o1).build());
941         assertEquals(Integer.valueOf(0), new CompareToBuilder().append(o1, o2).build());
942         o2.setA(5);
943         assertTrue(new CompareToBuilder().append(o1, o2).build().intValue() < 0);
944         assertTrue(new CompareToBuilder().append(o2, o1).build().intValue() > 0);
945 
946         assertTrue(new CompareToBuilder().append(o1, null).build().intValue() > 0);
947         assertEquals(Integer.valueOf(0), new CompareToBuilder().append((Object) null, null).build());
948         assertTrue(new CompareToBuilder().append(null, o1).build().intValue() < 0);
949     }
950 
951     @Test
952     void testObjectComparator() {
953         final String o1 = "Fred";
954         String o2 = "Fred";
955         assertEquals(0, new CompareToBuilder().append(o1, o1, String.CASE_INSENSITIVE_ORDER).toComparison());
956         assertEquals(0, new CompareToBuilder().append(o1, o2, String.CASE_INSENSITIVE_ORDER).toComparison());
957         o2 = "FRED";
958         assertEquals(0, new CompareToBuilder().append(o1, o2, String.CASE_INSENSITIVE_ORDER).toComparison());
959         assertEquals(0, new CompareToBuilder().append(o2, o1, String.CASE_INSENSITIVE_ORDER).toComparison());
960         o2 = "FREDA";
961         assertTrue(new CompareToBuilder().append(o1, o2, String.CASE_INSENSITIVE_ORDER).toComparison() < 0);
962         assertTrue(new CompareToBuilder().append(o2, o1, String.CASE_INSENSITIVE_ORDER).toComparison() > 0);
963 
964         assertTrue(new CompareToBuilder().append(o1, null, String.CASE_INSENSITIVE_ORDER).toComparison() > 0);
965         assertEquals(0, new CompareToBuilder().append(null, null, String.CASE_INSENSITIVE_ORDER).toComparison());
966         assertTrue(new CompareToBuilder().append(null, o1, String.CASE_INSENSITIVE_ORDER).toComparison() < 0);
967     }
968 
969     @Test
970     void testObjectComparatorNull() {
971         final String o1 = "Fred";
972         String o2 = "Fred";
973         assertEquals(0, new CompareToBuilder().append(o1, o1, null).toComparison());
974         assertEquals(0, new CompareToBuilder().append(o1, o2, null).toComparison());
975         o2 = "Zebra";
976         assertTrue(new CompareToBuilder().append(o1, o2, null).toComparison() < 0);
977         assertTrue(new CompareToBuilder().append(o2, o1, null).toComparison() > 0);
978 
979         assertTrue(new CompareToBuilder().append(o1, null, null).toComparison() > 0);
980         assertEquals(0, new CompareToBuilder().append(null, null, null).toComparison());
981         assertTrue(new CompareToBuilder().append(null, o1, null).toComparison() < 0);
982     }
983 
984     @Test
985     void testObjectEx2() {
986         final TestObject o1 = new TestObject(4);
987         final Object o2 = new Object();
988         assertThrows(ClassCastException.class, () -> new CompareToBuilder().append(o1, o2));
989     }
990 
991     @Test
992     void testRaggedArray() {
993         final long[][] array1 = new long[2][];
994         final long[][] array2 = new long[2][];
995         final long[][] array3 = new long[3][];
996         for (int i = 0; i < array1.length; ++i) {
997             array1[i] = new long[2];
998             array2[i] = new long[2];
999             array3[i] = new long[3];
1000             for (int j = 0; j < array1[i].length; ++j) {
1001                 array1[i][j] = (i + 1) * (j + 1);
1002                 array2[i][j] = (i + 1) * (j + 1);
1003                 array3[i][j] = (i + 1) * (j + 1);
1004             }
1005         }
1006         array3[1][2] = 100;
1007         array3[1][2] = 100;
1008 
1009         assertEquals(0, new CompareToBuilder().append(array1, array1).toComparison());
1010         assertEquals(0, new CompareToBuilder().append(array1, array2).toComparison());
1011         assertTrue(new CompareToBuilder().append(array1, array3).toComparison() < 0);
1012         assertTrue(new CompareToBuilder().append(array3, array1).toComparison() > 0);
1013         array1[1][1] = 200;
1014         assertTrue(new CompareToBuilder().append(array1, array2).toComparison() > 0);
1015         assertTrue(new CompareToBuilder().append(array2, array1).toComparison() < 0);
1016     }
1017 
1018     @Test
1019     void testReflectionCompare() {
1020         final TestObject o1 = new TestObject(4);
1021         final TestObject o2 = new TestObject(4);
1022         assertEquals(0, CompareToBuilder.reflectionCompare(o1, o1));
1023         assertEquals(0, CompareToBuilder.reflectionCompare(o1, o2));
1024         o2.setA(5);
1025         assertTrue(CompareToBuilder.reflectionCompare(o1, o2) < 0);
1026         assertTrue(CompareToBuilder.reflectionCompare(o2, o1) > 0);
1027     }
1028 
1029     @Test
1030     void testReflectionCompareEx1() {
1031         final TestObject o1 = new TestObject(4);
1032         assertNullPointerException(() -> CompareToBuilder.reflectionCompare(o1, null));
1033     }
1034 
1035     @Test
1036     void testReflectionCompareEx2() {
1037         final TestObject o1 = new TestObject(4);
1038         final Object o2 = new Object();
1039         assertThrows(ClassCastException.class, () -> CompareToBuilder.reflectionCompare(o1, o2));
1040     }
1041 
1042     @Test
1043     void testReflectionHierarchyCompare() {
1044         testReflectionHierarchyCompare(false, null);
1045     }
1046 
1047     private void testReflectionHierarchyCompare(final boolean testTransients, final String[] excludeFields) {
1048         final TestObject to1 = new TestObject(1);
1049         final TestObject to2 = new TestObject(2);
1050         final TestObject to3 = new TestObject(3);
1051         final TestSubObject tso1 = new TestSubObject(1, 1);
1052         final TestSubObject tso2 = new TestSubObject(2, 2);
1053         final TestSubObject tso3 = new TestSubObject(3, 3);
1054 
1055         assertReflectionCompareContract(to1, to1, to1, false, excludeFields);
1056         assertReflectionCompareContract(to1, to2, to3, false, excludeFields);
1057         assertReflectionCompareContract(tso1, tso1, tso1, false, excludeFields);
1058         assertReflectionCompareContract(tso1, tso2, tso3, false, excludeFields);
1059         assertReflectionCompareContract("1", "2", "3", false, excludeFields);
1060 
1061         assertTrue(0 != CompareToBuilder.reflectionCompare(tso1, new TestSubObject(1, 0), testTransients));
1062         assertTrue(0 != CompareToBuilder.reflectionCompare(tso1, new TestSubObject(0, 1), testTransients));
1063 
1064         // root class
1065         assertXYZCompareOrder(to1, to2, to3, true, null);
1066         // subclass
1067         assertXYZCompareOrder(tso1, tso2, tso3, true, null);
1068     }
1069 
1070     @Test
1071     void testReflectionHierarchyCompareExcludeFields() {
1072         final String[] excludeFields = { "b" };
1073         testReflectionHierarchyCompare(true, excludeFields);
1074 
1075         TestSubObject x;
1076         TestSubObject y;
1077         TestSubObject z;
1078 
1079         x = new TestSubObject(1, 1);
1080         y = new TestSubObject(2, 1);
1081         z = new TestSubObject(3, 1);
1082         assertXYZCompareOrder(x, y, z, true, excludeFields);
1083 
1084         x = new TestSubObject(1, 3);
1085         y = new TestSubObject(2, 2);
1086         z = new TestSubObject(3, 1);
1087         assertXYZCompareOrder(x, y, z, true, excludeFields);
1088     }
1089 
1090     @Test
1091     void testReflectionHierarchyCompareTransients() {
1092         testReflectionHierarchyCompare(true, null);
1093 
1094         TestTransientSubObject x;
1095         TestTransientSubObject y;
1096         TestTransientSubObject z;
1097 
1098         x = new TestTransientSubObject(1, 1);
1099         y = new TestTransientSubObject(2, 2);
1100         z = new TestTransientSubObject(3, 3);
1101         assertXYZCompareOrder(x, y, z, true, null);
1102 
1103         x = new TestTransientSubObject(1, 1);
1104         y = new TestTransientSubObject(1, 2);
1105         z = new TestTransientSubObject(1, 3);
1106         assertXYZCompareOrder(x, y, z, true, null);
1107     }
1108 
1109     @Test
1110     void testShort() {
1111         final short o1 = 1;
1112         final short o2 = 2;
1113         assertEquals(0, new CompareToBuilder().append(o1, o1).toComparison());
1114         assertTrue(new CompareToBuilder().append(o1, o2).toComparison() < 0);
1115         assertTrue(new CompareToBuilder().append(o2, o1).toComparison() > 0);
1116         assertTrue(new CompareToBuilder().append(o1, Short.MAX_VALUE).toComparison() < 0);
1117         assertTrue(new CompareToBuilder().append(Short.MAX_VALUE, o1).toComparison() > 0);
1118         assertTrue(new CompareToBuilder().append(o1, Short.MIN_VALUE).toComparison() > 0);
1119         assertTrue(new CompareToBuilder().append(Short.MIN_VALUE, o1).toComparison() < 0);
1120     }
1121 
1122     @Test
1123     void testShortArray() {
1124         final short[] obj1 = new short[2];
1125         obj1[0] = 5;
1126         obj1[1] = 6;
1127         final short[] obj2 = new short[2];
1128         obj2[0] = 5;
1129         obj2[1] = 6;
1130         final short[] obj3 = new short[3];
1131         obj3[0] = 5;
1132         obj3[1] = 6;
1133         obj3[2] = 7;
1134 
1135         assertEquals(0, new CompareToBuilder().append(obj1, obj1).toComparison());
1136         assertEquals(0, new CompareToBuilder().append(obj1, obj2).toComparison());
1137         assertTrue(new CompareToBuilder().append(obj1, obj3).toComparison() < 0);
1138         assertTrue(new CompareToBuilder().append(obj3, obj1).toComparison() > 0);
1139 
1140         obj1[1] = 7;
1141         assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() > 0);
1142         assertTrue(new CompareToBuilder().append(obj2, obj1).toComparison() < 0);
1143 
1144         assertTrue(new CompareToBuilder().append(obj1, null).toComparison() > 0);
1145         assertEquals(0, new CompareToBuilder().append((short[]) null, null).toComparison());
1146         assertTrue(new CompareToBuilder().append(null, obj1).toComparison() < 0);
1147     }
1148 
1149     @Test
1150     void testShortArrayHiddenByObject() {
1151         final short[] array1 = new short[2];
1152         array1[0] = 5;
1153         array1[1] = 6;
1154         final short[] array2 = new short[2];
1155         array2[0] = 5;
1156         array2[1] = 6;
1157         final short[] array3 = new short[3];
1158         array3[0] = 5;
1159         array3[1] = 6;
1160         array3[2] = 7;
1161         final Object obj1 = array1;
1162         final Object obj2 = array2;
1163         final Object obj3 = array3;
1164         assertEquals(0, new CompareToBuilder().append(obj1, obj1).toComparison());
1165         assertEquals(0, new CompareToBuilder().append(obj1, obj2).toComparison());
1166         assertTrue(new CompareToBuilder().append(obj1, obj3).toComparison() < 0);
1167         assertTrue(new CompareToBuilder().append(obj3, obj1).toComparison() > 0);
1168 
1169         array1[1] = 7;
1170         assertTrue(new CompareToBuilder().append(obj1, obj2).toComparison() > 0);
1171         assertTrue(new CompareToBuilder().append(obj2, obj1).toComparison() < 0);
1172     }
1173 
1174  }