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