Home | History | Annotate | Download | only in apachecommons
      1 /*
      2  * Copyright (c) 2007 Mockito contributors
      3  * This program is made available under the terms of the MIT License.
      4  */
      5 
      6 //Class comes from Apache Commons Lang, added some tiny changes
      7 package org.mockito.internal.matchers.apachecommons;
      8 
      9 import org.junit.Test;
     10 import org.mockitoutil.TestBase;
     11 
     12 import java.math.BigDecimal;
     13 import java.util.Arrays;
     14 
     15 import static org.junit.Assert.*;
     16 
     17 /**
     18  * @author <a href="mailto:sdowney (at) panix.com">Steve Downey</a>
     19  * @author <a href="mailto:scolebourne (at) joda.org">Stephen Colebourne</a>
     20  * @author <a href="mailto:ggregory (at) seagullsw.com">Gary Gregory</a>
     21  * @author Maarten Coene
     22  * @version $Id: EqualsBuilderTest.java 611543 2008-01-13 07:00:22Z bayard $
     23  */
     24 public class EqualsBuilderTest extends TestBase {
     25 
     26     @Test
     27     public void testname() throws Exception {
     28 
     29     }
     30 
     31     static class TestObject {
     32         private int a;
     33         public TestObject() {
     34         }
     35         public TestObject(int a) {
     36             this.a = a;
     37         }
     38         public boolean equals(Object o) {
     39             if (o == null) { return false; }
     40             if (o == this) { return true; }
     41             if (o.getClass() != getClass()) {
     42                 return false;
     43             }
     44 
     45             TestObject rhs = (TestObject) o;
     46             return (a == rhs.a);
     47         }
     48         public int hashCode() {
     49             return super.hashCode();
     50         }
     51 
     52         public void setA(int a) {
     53             this.a = a;
     54         }
     55 
     56         public int getA() {
     57             return a;
     58         }
     59     }
     60 
     61     static class TestSubObject extends TestObject {
     62         private int b;
     63         public TestSubObject() {
     64             super(0);
     65         }
     66         public TestSubObject(int a, int b) {
     67             super(a);
     68             this.b = b;
     69         }
     70         public boolean equals(Object o) {
     71             if (o == null) { return false; }
     72             if (o == this) { return true; }
     73             if (o.getClass() != getClass()) {
     74                 return false;
     75             }
     76 
     77             TestSubObject rhs = (TestSubObject) o;
     78             return super.equals(o) && (b == rhs.b);
     79         }
     80         public int hashCode() {
     81             return 1;
     82         }
     83 
     84         public void setB(int b) {
     85             this.b = b;
     86         }
     87 
     88         public int getB() {
     89             return b;
     90         }
     91     }
     92 
     93     static class TestEmptySubObject extends TestObject {
     94         public TestEmptySubObject(int a) {
     95             super(a);
     96         }
     97     }
     98 
     99     @SuppressWarnings("unused")
    100     static class TestTSubObject extends TestObject {
    101         private transient int t;
    102         public TestTSubObject(int a, int t) {
    103             super(a);
    104             this.t = t;
    105         }
    106     }
    107 
    108     @SuppressWarnings("unused")
    109     static class TestTTSubObject extends TestTSubObject {
    110         private transient int tt;
    111         public TestTTSubObject(int a, int t, int tt) {
    112             super(a, t);
    113             this.tt = tt;
    114         }
    115     }
    116 
    117     @SuppressWarnings("unused")
    118     static class TestTTLeafObject extends TestTTSubObject {
    119         private int leafValue;
    120         public TestTTLeafObject(int a, int t, int tt, int leafValue) {
    121             super(a, t, tt);
    122             this.leafValue = leafValue;
    123         }
    124     }
    125 
    126     static class TestTSubObject2 extends TestObject {
    127         private transient int t;
    128         public TestTSubObject2(int a, int t) {
    129             super(a);
    130         }
    131         public int getT() {
    132             return t;
    133         }
    134         public void setT(int t) {
    135             this.t = t;
    136         }
    137     }
    138 
    139     @Test public void testReflectionEquals() {
    140         TestObject o1 = new TestObject(4);
    141         TestObject o2 = new TestObject(5);
    142         assertTrue(EqualsBuilder.reflectionEquals(o1, o1));
    143         assertTrue(!EqualsBuilder.reflectionEquals(o1, o2));
    144         o2.setA(4);
    145         assertTrue(EqualsBuilder.reflectionEquals(o1, o2));
    146 
    147         assertTrue(!EqualsBuilder.reflectionEquals(o1, this));
    148 
    149         assertTrue(!EqualsBuilder.reflectionEquals(o1, null));
    150         assertTrue(!EqualsBuilder.reflectionEquals(null, o2));
    151         assertTrue(EqualsBuilder.reflectionEquals((Object) null, (Object) null));
    152     }
    153 
    154     @Test public void testReflectionHierarchyEquals() {
    155         testReflectionHierarchyEquals(false);
    156         testReflectionHierarchyEquals(true);
    157         // Transients
    158         assertTrue(EqualsBuilder.reflectionEquals(new TestTTLeafObject(1, 2, 3, 4), new TestTTLeafObject(1, 2, 3, 4), true));
    159         assertTrue(EqualsBuilder.reflectionEquals(new TestTTLeafObject(1, 2, 3, 4), new TestTTLeafObject(1, 2, 3, 4), false));
    160         assertTrue(!EqualsBuilder.reflectionEquals(new TestTTLeafObject(1, 0, 0, 4), new TestTTLeafObject(1, 2, 3, 4), true));
    161         assertTrue(!EqualsBuilder.reflectionEquals(new TestTTLeafObject(1, 2, 3, 4), new TestTTLeafObject(1, 2, 3, 0), true));
    162         assertTrue(!EqualsBuilder.reflectionEquals(new TestTTLeafObject(0, 2, 3, 4), new TestTTLeafObject(1, 2, 3, 4), true));
    163     }
    164 
    165   private void testReflectionHierarchyEquals(boolean testTransients) {
    166         TestObject to1 = new TestObject(4);
    167         TestObject to1Bis = new TestObject(4);
    168         TestObject to1Ter = new TestObject(4);
    169         TestObject to2 = new TestObject(5);
    170         TestEmptySubObject teso = new TestEmptySubObject(4);
    171         TestTSubObject ttso = new TestTSubObject(4, 1);
    172         TestTTSubObject tttso = new TestTTSubObject(4, 1, 2);
    173         TestTTLeafObject ttlo = new TestTTLeafObject(4, 1, 2, 3);
    174         TestSubObject tso1 = new TestSubObject(1, 4);
    175         TestSubObject tso1bis = new TestSubObject(1, 4);
    176         TestSubObject tso1ter = new TestSubObject(1, 4);
    177         TestSubObject tso2 = new TestSubObject(2, 5);
    178 
    179         testReflectionEqualsEquivalenceRelationship(to1, to1Bis, to1Ter, to2, new TestObject(), testTransients);
    180         testReflectionEqualsEquivalenceRelationship(tso1, tso1bis, tso1ter, tso2, new TestSubObject(), testTransients);
    181 
    182         // More sanity checks:
    183 
    184         // same values
    185         assertTrue(EqualsBuilder.reflectionEquals(ttlo, ttlo, testTransients));
    186         assertTrue(EqualsBuilder.reflectionEquals(new TestSubObject(1, 10), new TestSubObject(1, 10), testTransients));
    187         // same super values, diff sub values
    188         assertTrue(!EqualsBuilder.reflectionEquals(new TestSubObject(1, 10), new TestSubObject(1, 11), testTransients));
    189         assertTrue(!EqualsBuilder.reflectionEquals(new TestSubObject(1, 11), new TestSubObject(1, 10), testTransients));
    190         // diff super values, same sub values
    191         assertTrue(!EqualsBuilder.reflectionEquals(new TestSubObject(0, 10), new TestSubObject(1, 10), testTransients));
    192         assertTrue(!EqualsBuilder.reflectionEquals(new TestSubObject(1, 10), new TestSubObject(0, 10), testTransients));
    193 
    194         // mix super and sub types: equals
    195         assertTrue(EqualsBuilder.reflectionEquals(to1, teso, testTransients));
    196         assertTrue(EqualsBuilder.reflectionEquals(teso, to1, testTransients));
    197 
    198         assertTrue(EqualsBuilder.reflectionEquals(to1, ttso, false)); // Force testTransients = false for this assert
    199         assertTrue(EqualsBuilder.reflectionEquals(ttso, to1, false)); // Force testTransients = false for this assert
    200 
    201         assertTrue(EqualsBuilder.reflectionEquals(to1, tttso, false)); // Force testTransients = false for this assert
    202         assertTrue(EqualsBuilder.reflectionEquals(tttso, to1, false)); // Force testTransients = false for this assert
    203 
    204         assertTrue(EqualsBuilder.reflectionEquals(ttso, tttso, false)); // Force testTransients = false for this assert
    205         assertTrue(EqualsBuilder.reflectionEquals(tttso, ttso, false)); // Force testTransients = false for this assert
    206 
    207         // mix super and sub types: NOT equals
    208         assertTrue(!EqualsBuilder.reflectionEquals(new TestObject(0), new TestEmptySubObject(1), testTransients));
    209         assertTrue(!EqualsBuilder.reflectionEquals(new TestEmptySubObject(1), new TestObject(0), testTransients));
    210 
    211         assertTrue(!EqualsBuilder.reflectionEquals(new TestObject(0), new TestTSubObject(1, 1), testTransients));
    212         assertTrue(!EqualsBuilder.reflectionEquals(new TestTSubObject(1, 1), new TestObject(0), testTransients));
    213 
    214         assertTrue(!EqualsBuilder.reflectionEquals(new TestObject(1), new TestSubObject(0, 10), testTransients));
    215         assertTrue(!EqualsBuilder.reflectionEquals(new TestSubObject(0, 10), new TestObject(1), testTransients));
    216 
    217         assertTrue(!EqualsBuilder.reflectionEquals(to1, ttlo));
    218         assertTrue(!EqualsBuilder.reflectionEquals(tso1, this));
    219     }
    220 
    221     /**
    222      * Equivalence relationship tests inspired by "Effective Java":
    223      * <ul>
    224      * <li>reflection</li>
    225      * <li>symmetry</li>
    226      * <li>transitive</li>
    227      * <li>consistency</li>
    228      * <li>non-null reference</li>
    229      * </ul>
    230      * @param to a TestObject
    231      * @param toBis a TestObject, equal to to and toTer
    232      * @param toTer Left hand side, equal to to and toBis
    233      * @param to2 a different TestObject
    234      * @param oToChange a TestObject that will be changed
    235      */
    236     private void testReflectionEqualsEquivalenceRelationship(
    237         TestObject to,
    238         TestObject toBis,
    239         TestObject toTer,
    240         TestObject to2,
    241         TestObject oToChange,
    242         boolean testTransients) {
    243 
    244         // reflection test
    245         assertTrue(EqualsBuilder.reflectionEquals(to, to, testTransients));
    246         assertTrue(EqualsBuilder.reflectionEquals(to2, to2, testTransients));
    247 
    248         // symmetry test
    249         assertTrue(EqualsBuilder.reflectionEquals(to, toBis, testTransients) && EqualsBuilder.reflectionEquals(toBis, to, testTransients));
    250 
    251         // transitive test
    252         assertTrue(
    253             EqualsBuilder.reflectionEquals(to, toBis, testTransients)
    254                 && EqualsBuilder.reflectionEquals(toBis, toTer, testTransients)
    255                 && EqualsBuilder.reflectionEquals(to, toTer, testTransients));
    256 
    257         // consistency test
    258         oToChange.setA(to.getA());
    259         if (oToChange instanceof TestSubObject) {
    260             ((TestSubObject) oToChange).setB(((TestSubObject) to).getB());
    261         }
    262         assertTrue(EqualsBuilder.reflectionEquals(oToChange, to, testTransients));
    263         assertTrue(EqualsBuilder.reflectionEquals(oToChange, to, testTransients));
    264         oToChange.setA(to.getA() + 1);
    265         if (oToChange instanceof TestSubObject) {
    266             ((TestSubObject) oToChange).setB(((TestSubObject) to).getB() + 1);
    267         }
    268         assertTrue(!EqualsBuilder.reflectionEquals(oToChange, to, testTransients));
    269         assertTrue(!EqualsBuilder.reflectionEquals(oToChange, to, testTransients));
    270 
    271         // non-null reference test
    272         assertTrue(!EqualsBuilder.reflectionEquals(to, null, testTransients));
    273         assertTrue(!EqualsBuilder.reflectionEquals(to2, null, testTransients));
    274         assertTrue(!EqualsBuilder.reflectionEquals(null, to, testTransients));
    275         assertTrue(!EqualsBuilder.reflectionEquals(null, to2, testTransients));
    276         assertTrue(EqualsBuilder.reflectionEquals((Object) null, (Object) null, testTransients));
    277     }
    278 
    279     @Test public void testSuper() {
    280         TestObject o1 = new TestObject(4);
    281         TestObject o2 = new TestObject(5);
    282         assertEquals(true, new EqualsBuilder().appendSuper(true).append(o1, o1).isEquals());
    283         assertEquals(false, new EqualsBuilder().appendSuper(false).append(o1, o1).isEquals());
    284         assertEquals(false, new EqualsBuilder().appendSuper(true).append(o1, o2).isEquals());
    285         assertEquals(false, new EqualsBuilder().appendSuper(false).append(o1, o2).isEquals());
    286     }
    287 
    288     @Test public void testObject() {
    289         TestObject o1 = new TestObject(4);
    290         TestObject o2 = new TestObject(5);
    291         assertTrue(new EqualsBuilder().append(o1, o1).isEquals());
    292         assertTrue(!new EqualsBuilder().append(o1, o2).isEquals());
    293         o2.setA(4);
    294         assertTrue(new EqualsBuilder().append(o1, o2).isEquals());
    295 
    296         assertTrue(!new EqualsBuilder().append(o1, this).isEquals());
    297 
    298         assertTrue(!new EqualsBuilder().append(o1, null).isEquals());
    299         assertTrue(!new EqualsBuilder().append(null, o2).isEquals());
    300         assertTrue(new EqualsBuilder().append((Object) null, (Object) null).isEquals());
    301     }
    302 
    303     @Test public void testLong() {
    304         long o1 = 1L;
    305         long o2 = 2L;
    306         assertTrue(new EqualsBuilder().append(o1, o1).isEquals());
    307         assertTrue(!new EqualsBuilder().append(o1, o2).isEquals());
    308     }
    309 
    310     @Test public void testInt() {
    311         int o1 = 1;
    312         int o2 = 2;
    313         assertTrue(new EqualsBuilder().append(o1, o1).isEquals());
    314         assertTrue(!new EqualsBuilder().append(o1, o2).isEquals());
    315     }
    316 
    317     @Test public void testShort() {
    318         short o1 = 1;
    319         short o2 = 2;
    320         assertTrue(new EqualsBuilder().append(o1, o1).isEquals());
    321         assertTrue(!new EqualsBuilder().append(o1, o2).isEquals());
    322     }
    323 
    324     @Test public void testChar() {
    325         char o1 = 1;
    326         char o2 = 2;
    327         assertTrue(new EqualsBuilder().append(o1, o1).isEquals());
    328         assertTrue(!new EqualsBuilder().append(o1, o2).isEquals());
    329     }
    330 
    331     @Test public void testByte() {
    332         byte o1 = 1;
    333         byte o2 = 2;
    334         assertTrue(new EqualsBuilder().append(o1, o1).isEquals());
    335         assertTrue(!new EqualsBuilder().append(o1, o2).isEquals());
    336     }
    337 
    338     @Test public void testDouble() {
    339         double o1 = 1;
    340         double o2 = 2;
    341         assertTrue(new EqualsBuilder().append(o1, o1).isEquals());
    342         assertTrue(!new EqualsBuilder().append(o1, o2).isEquals());
    343         assertTrue(!new EqualsBuilder().append(o1, Double.NaN).isEquals());
    344         assertTrue(new EqualsBuilder().append(Double.NaN, Double.NaN).isEquals());
    345         assertTrue(new EqualsBuilder().append(Double.POSITIVE_INFINITY, Double.POSITIVE_INFINITY).isEquals());
    346     }
    347 
    348     @Test public void testFloat() {
    349         float o1 = 1;
    350         float o2 = 2;
    351         assertTrue(new EqualsBuilder().append(o1, o1).isEquals());
    352         assertTrue(!new EqualsBuilder().append(o1, o2).isEquals());
    353         assertTrue(!new EqualsBuilder().append(o1, Float.NaN).isEquals());
    354         assertTrue(new EqualsBuilder().append(Float.NaN, Float.NaN).isEquals());
    355         assertTrue(new EqualsBuilder().append(Float.POSITIVE_INFINITY, Float.POSITIVE_INFINITY).isEquals());
    356     }
    357 
    358     // https://issues.apache.org/jira/browse/LANG-393
    359     @Test public void testBigDecimal() {
    360         BigDecimal o1 = new BigDecimal("2.0");
    361         BigDecimal o2 = new BigDecimal("2.00");
    362         assertTrue(new EqualsBuilder().append(o1, o1).isEquals());
    363         assertTrue(new EqualsBuilder().append(o1, o2).isEquals());
    364     }
    365 
    366     @Test public void testAccessors() {
    367         EqualsBuilder equalsBuilder = new EqualsBuilder();
    368         assertTrue(equalsBuilder.isEquals());
    369         equalsBuilder.setEquals(true);
    370         assertTrue(equalsBuilder.isEquals());
    371         equalsBuilder.setEquals(false);
    372         assertFalse(equalsBuilder.isEquals());
    373     }
    374 
    375     @Test public void testBoolean() {
    376         boolean o1 = true;
    377         boolean o2 = false;
    378         assertTrue(new EqualsBuilder().append(o1, o1).isEquals());
    379         assertTrue(!new EqualsBuilder().append(o1, o2).isEquals());
    380     }
    381 
    382     @Test public void testObjectArray() {
    383         TestObject[] obj1 = new TestObject[3];
    384         obj1[0] = new TestObject(4);
    385         obj1[1] = new TestObject(5);
    386         obj1[2] = null;
    387         TestObject[] obj2 = new TestObject[3];
    388         obj2[0] = new TestObject(4);
    389         obj2[1] = new TestObject(5);
    390         obj2[2] = null;
    391 
    392         assertTrue(new EqualsBuilder().append(obj1, obj1).isEquals());
    393         assertTrue(new EqualsBuilder().append(obj2, obj2).isEquals());
    394         assertTrue(new EqualsBuilder().append(obj1, obj2).isEquals());
    395         obj1[1].setA(6);
    396         assertTrue(!new EqualsBuilder().append(obj1, obj2).isEquals());
    397         obj1[1].setA(5);
    398         assertTrue(new EqualsBuilder().append(obj1, obj2).isEquals());
    399         obj1[2] = obj1[1];
    400         assertTrue(!new EqualsBuilder().append(obj1, obj2).isEquals());
    401         obj1[2] = null;
    402         assertTrue(new EqualsBuilder().append(obj1, obj2).isEquals());
    403 
    404         obj2 = null;
    405         assertTrue(!new EqualsBuilder().append(obj1, obj2).isEquals());
    406         obj1 = null;
    407         assertTrue(new EqualsBuilder().append(obj1, obj2).isEquals());
    408     }
    409 
    410     @Test public void testLongArray() {
    411         long[] obj1 = new long[2];
    412         obj1[0] = 5L;
    413         obj1[1] = 6L;
    414         long[] obj2 = new long[2];
    415         obj2[0] = 5L;
    416         obj2[1] = 6L;
    417         assertTrue(new EqualsBuilder().append(obj1, obj1).isEquals());
    418         assertTrue(new EqualsBuilder().append(obj1, obj2).isEquals());
    419         obj1[1] = 7;
    420         assertTrue(!new EqualsBuilder().append(obj1, obj2).isEquals());
    421 
    422         obj2 = null;
    423         assertTrue(!new EqualsBuilder().append(obj1, obj2).isEquals());
    424         obj1 = null;
    425         assertTrue(new EqualsBuilder().append(obj1, obj2).isEquals());
    426     }
    427 
    428     @Test public void testIntArray() {
    429         int[] obj1 = new int[2];
    430         obj1[0] = 5;
    431         obj1[1] = 6;
    432         int[] obj2 = new int[2];
    433         obj2[0] = 5;
    434         obj2[1] = 6;
    435         assertTrue(new EqualsBuilder().append(obj1, obj1).isEquals());
    436         assertTrue(new EqualsBuilder().append(obj1, obj2).isEquals());
    437         obj1[1] = 7;
    438         assertTrue(!new EqualsBuilder().append(obj1, obj2).isEquals());
    439 
    440         obj2 = null;
    441         assertTrue(!new EqualsBuilder().append(obj1, obj2).isEquals());
    442         obj1 = null;
    443         assertTrue(new EqualsBuilder().append(obj1, obj2).isEquals());
    444     }
    445 
    446     @Test public void testShortArray() {
    447         short[] obj1 = new short[2];
    448         obj1[0] = 5;
    449         obj1[1] = 6;
    450         short[] obj2 = new short[2];
    451         obj2[0] = 5;
    452         obj2[1] = 6;
    453         assertTrue(new EqualsBuilder().append(obj1, obj1).isEquals());
    454         assertTrue(new EqualsBuilder().append(obj1, obj2).isEquals());
    455         obj1[1] = 7;
    456         assertTrue(!new EqualsBuilder().append(obj1, obj2).isEquals());
    457 
    458         obj2 = null;
    459         assertTrue(!new EqualsBuilder().append(obj1, obj2).isEquals());
    460         obj1 = null;
    461         assertTrue(new EqualsBuilder().append(obj1, obj2).isEquals());
    462     }
    463 
    464     @Test public void testCharArray() {
    465         char[] obj1 = new char[2];
    466         obj1[0] = 5;
    467         obj1[1] = 6;
    468         char[] obj2 = new char[2];
    469         obj2[0] = 5;
    470         obj2[1] = 6;
    471         assertTrue(new EqualsBuilder().append(obj1, obj1).isEquals());
    472         assertTrue(new EqualsBuilder().append(obj1, obj2).isEquals());
    473         obj1[1] = 7;
    474         assertTrue(!new EqualsBuilder().append(obj1, obj2).isEquals());
    475 
    476         obj2 = null;
    477         assertTrue(!new EqualsBuilder().append(obj1, obj2).isEquals());
    478         obj1 = null;
    479         assertTrue(new EqualsBuilder().append(obj1, obj2).isEquals());
    480     }
    481 
    482     @Test public void testByteArray() {
    483         byte[] obj1 = new byte[2];
    484         obj1[0] = 5;
    485         obj1[1] = 6;
    486         byte[] obj2 = new byte[2];
    487         obj2[0] = 5;
    488         obj2[1] = 6;
    489         assertTrue(new EqualsBuilder().append(obj1, obj1).isEquals());
    490         assertTrue(new EqualsBuilder().append(obj1, obj2).isEquals());
    491         obj1[1] = 7;
    492         assertTrue(!new EqualsBuilder().append(obj1, obj2).isEquals());
    493 
    494         obj2 = null;
    495         assertTrue(!new EqualsBuilder().append(obj1, obj2).isEquals());
    496         obj1 = null;
    497         assertTrue(new EqualsBuilder().append(obj1, obj2).isEquals());
    498     }
    499 
    500     @Test public void testDoubleArray() {
    501         double[] obj1 = new double[2];
    502         obj1[0] = 5;
    503         obj1[1] = 6;
    504         double[] obj2 = new double[2];
    505         obj2[0] = 5;
    506         obj2[1] = 6;
    507         assertTrue(new EqualsBuilder().append(obj1, obj1).isEquals());
    508         assertTrue(new EqualsBuilder().append(obj1, obj2).isEquals());
    509         obj1[1] = 7;
    510         assertTrue(!new EqualsBuilder().append(obj1, obj2).isEquals());
    511 
    512         obj2 = null;
    513         assertTrue(!new EqualsBuilder().append(obj1, obj2).isEquals());
    514         obj1 = null;
    515         assertTrue(new EqualsBuilder().append(obj1, obj2).isEquals());
    516     }
    517 
    518     @Test public void testFloatArray() {
    519         float[] obj1 = new float[2];
    520         obj1[0] = 5;
    521         obj1[1] = 6;
    522         float[] obj2 = new float[2];
    523         obj2[0] = 5;
    524         obj2[1] = 6;
    525         assertTrue(new EqualsBuilder().append(obj1, obj1).isEquals());
    526         assertTrue(new EqualsBuilder().append(obj1, obj2).isEquals());
    527         obj1[1] = 7;
    528         assertTrue(!new EqualsBuilder().append(obj1, obj2).isEquals());
    529 
    530         obj2 = null;
    531         assertTrue(!new EqualsBuilder().append(obj1, obj2).isEquals());
    532         obj1 = null;
    533         assertTrue(new EqualsBuilder().append(obj1, obj2).isEquals());
    534     }
    535 
    536     @Test public void testBooleanArray() {
    537         boolean[] obj1 = new boolean[2];
    538         obj1[0] = true;
    539         obj1[1] = false;
    540         boolean[] obj2 = new boolean[2];
    541         obj2[0] = true;
    542         obj2[1] = false;
    543         assertTrue(new EqualsBuilder().append(obj1, obj1).isEquals());
    544         assertTrue(new EqualsBuilder().append(obj1, obj2).isEquals());
    545         obj1[1] = true;
    546         assertTrue(!new EqualsBuilder().append(obj1, obj2).isEquals());
    547 
    548         obj2 = null;
    549         assertTrue(!new EqualsBuilder().append(obj1, obj2).isEquals());
    550         obj1 = null;
    551         assertTrue(new EqualsBuilder().append(obj1, obj2).isEquals());
    552     }
    553 
    554     @Test public void testMultiLongArray() {
    555         long[][] array1 = new long[2][2];
    556         long[][] array2 = new long[2][2];
    557         for (int i = 0; i < array1.length; ++i) {
    558             for (int j = 0; j < array1[0].length; j++) {
    559                 array1[i][j] = (i + 1) * (j + 1);
    560                 array2[i][j] = (i + 1) * (j + 1);
    561             }
    562         }
    563         assertTrue(new EqualsBuilder().append(array1, array1).isEquals());
    564         assertTrue(new EqualsBuilder().append(array1, array2).isEquals());
    565         array1[1][1] = 0;
    566         assertTrue(!new EqualsBuilder().append(array1, array2).isEquals());
    567     }
    568 
    569     @Test public void testMultiIntArray() {
    570         int[][] array1 = new int[2][2];
    571         int[][] array2 = new int[2][2];
    572         for (int i = 0; i < array1.length; ++i) {
    573             for (int j = 0; j < array1[0].length; j++) {
    574                 array1[i][j] = (i + 1) * (j + 1);
    575                 array2[i][j] = (i + 1) * (j + 1);
    576             }
    577         }
    578         assertTrue(new EqualsBuilder().append(array1, array1).isEquals());
    579         assertTrue(new EqualsBuilder().append(array1, array2).isEquals());
    580         array1[1][1] = 0;
    581         assertTrue(!new EqualsBuilder().append(array1, array2).isEquals());
    582     }
    583 
    584     @Test public void testMultiShortArray() {
    585         short[][] array1 = new short[2][2];
    586         short[][] array2 = new short[2][2];
    587         for (short i = 0; i < array1.length; ++i) {
    588             for (short j = 0; j < array1[0].length; j++) {
    589                 array1[i][j] = i;
    590                 array2[i][j] = i;
    591             }
    592         }
    593         assertTrue(new EqualsBuilder().append(array1, array1).isEquals());
    594         assertTrue(new EqualsBuilder().append(array1, array2).isEquals());
    595         array1[1][1] = 0;
    596         assertTrue(!new EqualsBuilder().append(array1, array2).isEquals());
    597     }
    598 
    599     @Test public void testMultiCharArray() {
    600         char[][] array1 = new char[2][2];
    601         char[][] array2 = new char[2][2];
    602         for (char i = 0; i < array1.length; ++i) {
    603             for (char j = 0; j < array1[0].length; j++) {
    604                 array1[i][j] = i;
    605                 array2[i][j] = i;
    606             }
    607         }
    608         assertTrue(new EqualsBuilder().append(array1, array1).isEquals());
    609         assertTrue(new EqualsBuilder().append(array1, array2).isEquals());
    610         array1[1][1] = 0;
    611         assertTrue(!new EqualsBuilder().append(array1, array2).isEquals());
    612     }
    613 
    614     @Test public void testMultiByteArray() {
    615         byte[][] array1 = new byte[2][2];
    616         byte[][] array2 = new byte[2][2];
    617         for (byte i = 0; i < array1.length; ++i) {
    618             for (byte j = 0; j < array1[0].length; j++) {
    619                 array1[i][j] = i;
    620                 array2[i][j] = i;
    621             }
    622         }
    623         assertTrue(new EqualsBuilder().append(array1, array1).isEquals());
    624         assertTrue(new EqualsBuilder().append(array1, array2).isEquals());
    625         array1[1][1] = 0;
    626         assertTrue(!new EqualsBuilder().append(array1, array2).isEquals());
    627     }
    628     @Test public void testMultiFloatArray() {
    629         float[][] array1 = new float[2][2];
    630         float[][] array2 = new float[2][2];
    631         for (int i = 0; i < array1.length; ++i) {
    632             for (int j = 0; j < array1[0].length; j++) {
    633                 array1[i][j] = (i + 1) * (j + 1);
    634                 array2[i][j] = (i + 1) * (j + 1);
    635             }
    636         }
    637         assertTrue(new EqualsBuilder().append(array1, array1).isEquals());
    638         assertTrue(new EqualsBuilder().append(array1, array2).isEquals());
    639         array1[1][1] = 0;
    640         assertTrue(!new EqualsBuilder().append(array1, array2).isEquals());
    641     }
    642 
    643     @Test public void testMultiDoubleArray() {
    644         double[][] array1 = new double[2][2];
    645         double[][] array2 = new double[2][2];
    646         for (int i = 0; i < array1.length; ++i) {
    647             for (int j = 0; j < array1[0].length; j++) {
    648                 array1[i][j] = (i + 1) * (j + 1);
    649                 array2[i][j] = (i + 1) * (j + 1);
    650             }
    651         }
    652         assertTrue(new EqualsBuilder().append(array1, array1).isEquals());
    653         assertTrue(new EqualsBuilder().append(array1, array2).isEquals());
    654         array1[1][1] = 0;
    655         assertTrue(!new EqualsBuilder().append(array1, array2).isEquals());
    656     }
    657 
    658     @Test public void testMultiBooleanArray() {
    659         boolean[][] array1 = new boolean[2][2];
    660         boolean[][] array2 = new boolean[2][2];
    661         for (int i = 0; i < array1.length; ++i) {
    662             for (int j = 0; j < array1[0].length; j++) {
    663                 array1[i][j] = (i == 1) || (j == 1);
    664                 array2[i][j] = (i == 1) || (j == 1);
    665             }
    666         }
    667         assertTrue(new EqualsBuilder().append(array1, array1).isEquals());
    668         assertTrue(new EqualsBuilder().append(array1, array2).isEquals());
    669         array1[1][1] = false;
    670         assertTrue(!new EqualsBuilder().append(array1, array2).isEquals());
    671 
    672         // compare 1 dim to 2.
    673         boolean[] array3 = new boolean[]{true, true};
    674         assertFalse(new EqualsBuilder().append(array1, array3).isEquals());
    675         assertFalse(new EqualsBuilder().append(array3, array1).isEquals());
    676         assertFalse(new EqualsBuilder().append(array2, array3).isEquals());
    677         assertFalse(new EqualsBuilder().append(array3, array2).isEquals());
    678     }
    679 
    680     @Test public void testRaggedArray() {
    681         long[][] array1 = new long[2][];
    682         long[][] array2 = new long[2][];
    683         for (int i = 0; i < array1.length; ++i) {
    684             array1[i] = new long[2];
    685             array2[i] = new long[2];
    686             for (int j = 0; j < array1[i].length; ++j) {
    687                 array1[i][j] = (i + 1) * (j + 1);
    688                 array2[i][j] = (i + 1) * (j + 1);
    689             }
    690         }
    691         assertTrue(new EqualsBuilder().append(array1, array1).isEquals());
    692         assertTrue(new EqualsBuilder().append(array1, array2).isEquals());
    693         array1[1][1] = 0;
    694         assertTrue(!new EqualsBuilder().append(array1, array2).isEquals());
    695     }
    696 
    697     @Test public void testMixedArray() {
    698         Object[] array1 = new Object[2];
    699         Object[] array2 = new Object[2];
    700         for (int i = 0; i < array1.length; ++i) {
    701             array1[i] = new long[2];
    702             array2[i] = new long[2];
    703             for (int j = 0; j < 2; ++j) {
    704                 ((long[]) array1[i])[j] = (i + 1) * (j + 1);
    705                 ((long[]) array2[i])[j] = (i + 1) * (j + 1);
    706             }
    707         }
    708         assertTrue(new EqualsBuilder().append(array1, array1).isEquals());
    709         assertTrue(new EqualsBuilder().append(array1, array2).isEquals());
    710         ((long[]) array1[1])[1] = 0;
    711         assertTrue(!new EqualsBuilder().append(array1, array2).isEquals());
    712     }
    713 
    714     @Test public void testObjectArrayHiddenByObject() {
    715         TestObject[] array1 = new TestObject[2];
    716         array1[0] = new TestObject(4);
    717         array1[1] = new TestObject(5);
    718         TestObject[] array2 = new TestObject[2];
    719         array2[0] = new TestObject(4);
    720         array2[1] = new TestObject(5);
    721         Object obj1 = array1;
    722         Object obj2 = array2;
    723         assertTrue(new EqualsBuilder().append(obj1, obj1).isEquals());
    724         assertTrue(new EqualsBuilder().append(obj1, array1).isEquals());
    725         assertTrue(new EqualsBuilder().append(obj1, obj2).isEquals());
    726         assertTrue(new EqualsBuilder().append(obj1, array2).isEquals());
    727         array1[1].setA(6);
    728         assertTrue(!new EqualsBuilder().append(obj1, obj2).isEquals());
    729     }
    730 
    731     @Test public void testLongArrayHiddenByObject() {
    732         long[] array1 = new long[2];
    733         array1[0] = 5L;
    734         array1[1] = 6L;
    735         long[] array2 = new long[2];
    736         array2[0] = 5L;
    737         array2[1] = 6L;
    738         Object obj1 = array1;
    739         Object obj2 = array2;
    740         assertTrue(new EqualsBuilder().append(obj1, obj1).isEquals());
    741         assertTrue(new EqualsBuilder().append(obj1, array1).isEquals());
    742         assertTrue(new EqualsBuilder().append(obj1, obj2).isEquals());
    743         assertTrue(new EqualsBuilder().append(obj1, array2).isEquals());
    744         array1[1] = 7;
    745         assertTrue(!new EqualsBuilder().append(obj1, obj2).isEquals());
    746     }
    747 
    748     @Test public void testIntArrayHiddenByObject() {
    749         int[] array1 = new int[2];
    750         array1[0] = 5;
    751         array1[1] = 6;
    752         int[] array2 = new int[2];
    753         array2[0] = 5;
    754         array2[1] = 6;
    755         Object obj1 = array1;
    756         Object obj2 = array2;
    757         assertTrue(new EqualsBuilder().append(obj1, obj1).isEquals());
    758         assertTrue(new EqualsBuilder().append(obj1, array1).isEquals());
    759         assertTrue(new EqualsBuilder().append(obj1, obj2).isEquals());
    760         assertTrue(new EqualsBuilder().append(obj1, array2).isEquals());
    761         array1[1] = 7;
    762         assertTrue(!new EqualsBuilder().append(obj1, obj2).isEquals());
    763     }
    764 
    765     @Test public void testShortArrayHiddenByObject() {
    766         short[] array1 = new short[2];
    767         array1[0] = 5;
    768         array1[1] = 6;
    769         short[] array2 = new short[2];
    770         array2[0] = 5;
    771         array2[1] = 6;
    772         Object obj1 = array1;
    773         Object obj2 = array2;
    774         assertTrue(new EqualsBuilder().append(obj1, obj1).isEquals());
    775         assertTrue(new EqualsBuilder().append(obj1, array1).isEquals());
    776         assertTrue(new EqualsBuilder().append(obj1, obj2).isEquals());
    777         assertTrue(new EqualsBuilder().append(obj1, array2).isEquals());
    778         array1[1] = 7;
    779         assertTrue(!new EqualsBuilder().append(obj1, obj2).isEquals());
    780     }
    781 
    782     @Test public void testCharArrayHiddenByObject() {
    783         char[] array1 = new char[2];
    784         array1[0] = 5;
    785         array1[1] = 6;
    786         char[] array2 = new char[2];
    787         array2[0] = 5;
    788         array2[1] = 6;
    789         Object obj1 = array1;
    790         Object obj2 = array2;
    791         assertTrue(new EqualsBuilder().append(obj1, obj1).isEquals());
    792         assertTrue(new EqualsBuilder().append(obj1, array1).isEquals());
    793         assertTrue(new EqualsBuilder().append(obj1, obj2).isEquals());
    794         assertTrue(new EqualsBuilder().append(obj1, array2).isEquals());
    795         array1[1] = 7;
    796         assertTrue(!new EqualsBuilder().append(obj1, obj2).isEquals());
    797     }
    798 
    799     @Test public void testByteArrayHiddenByObject() {
    800         byte[] array1 = new byte[2];
    801         array1[0] = 5;
    802         array1[1] = 6;
    803         byte[] array2 = new byte[2];
    804         array2[0] = 5;
    805         array2[1] = 6;
    806         Object obj1 = array1;
    807         Object obj2 = array2;
    808         assertTrue(new EqualsBuilder().append(obj1, obj1).isEquals());
    809         assertTrue(new EqualsBuilder().append(obj1, array1).isEquals());
    810         assertTrue(new EqualsBuilder().append(obj1, obj2).isEquals());
    811         assertTrue(new EqualsBuilder().append(obj1, array2).isEquals());
    812         array1[1] = 7;
    813         assertTrue(!new EqualsBuilder().append(obj1, obj2).isEquals());
    814     }
    815 
    816     @Test public void testDoubleArrayHiddenByObject() {
    817         double[] array1 = new double[2];
    818         array1[0] = 5;
    819         array1[1] = 6;
    820         double[] array2 = new double[2];
    821         array2[0] = 5;
    822         array2[1] = 6;
    823         Object obj1 = array1;
    824         Object obj2 = array2;
    825         assertTrue(new EqualsBuilder().append(obj1, obj1).isEquals());
    826         assertTrue(new EqualsBuilder().append(obj1, array1).isEquals());
    827         assertTrue(new EqualsBuilder().append(obj1, obj2).isEquals());
    828         assertTrue(new EqualsBuilder().append(obj1, array2).isEquals());
    829         array1[1] = 7;
    830         assertTrue(!new EqualsBuilder().append(obj1, obj2).isEquals());
    831     }
    832 
    833     @Test public void testFloatArrayHiddenByObject() {
    834         float[] array1 = new float[2];
    835         array1[0] = 5;
    836         array1[1] = 6;
    837         float[] array2 = new float[2];
    838         array2[0] = 5;
    839         array2[1] = 6;
    840         Object obj1 = array1;
    841         Object obj2 = array2;
    842         assertTrue(new EqualsBuilder().append(obj1, obj1).isEquals());
    843         assertTrue(new EqualsBuilder().append(obj1, array1).isEquals());
    844         assertTrue(new EqualsBuilder().append(obj1, obj2).isEquals());
    845         assertTrue(new EqualsBuilder().append(obj1, array2).isEquals());
    846         array1[1] = 7;
    847         assertTrue(!new EqualsBuilder().append(obj1, obj2).isEquals());
    848     }
    849 
    850     @Test public void testBooleanArrayHiddenByObject() {
    851         boolean[] array1 = new boolean[2];
    852         array1[0] = true;
    853         array1[1] = false;
    854         boolean[] array2 = new boolean[2];
    855         array2[0] = true;
    856         array2[1] = false;
    857         Object obj1 = array1;
    858         Object obj2 = array2;
    859         assertTrue(new EqualsBuilder().append(obj1, obj1).isEquals());
    860         assertTrue(new EqualsBuilder().append(obj1, array1).isEquals());
    861         assertTrue(new EqualsBuilder().append(obj1, obj2).isEquals());
    862         assertTrue(new EqualsBuilder().append(obj1, array2).isEquals());
    863         array1[1] = true;
    864         assertTrue(!new EqualsBuilder().append(obj1, obj2).isEquals());
    865     }
    866 
    867     public static class TestACanEqualB {
    868         private int a;
    869 
    870         public TestACanEqualB(int a) {
    871             this.a = a;
    872         }
    873 
    874         public boolean equals(Object o) {
    875             if (o == this) {
    876                 return true;
    877             }
    878             if (o instanceof TestACanEqualB) {
    879                 return this.a == ((TestACanEqualB) o).getA();
    880             }
    881             if (o instanceof TestBCanEqualA) {
    882                 return this.a == ((TestBCanEqualA) o).getB();
    883             }
    884             return false;
    885         }
    886         public int hashCode() {
    887             return 1;
    888         }
    889 
    890         public int getA() {
    891             return this.a;
    892         }
    893     }
    894 
    895     public static class TestBCanEqualA {
    896         private int b;
    897 
    898         public TestBCanEqualA(int b) {
    899             this.b = b;
    900         }
    901 
    902         public boolean equals(Object o) {
    903             if (o == this) {
    904                 return true;
    905             }
    906             if (o instanceof TestACanEqualB) {
    907                 return this.b == ((TestACanEqualB) o).getA();
    908             }
    909             if (o instanceof TestBCanEqualA) {
    910                 return this.b == ((TestBCanEqualA) o).getB();
    911             }
    912             return false;
    913         }
    914         public int hashCode() {
    915             return 1;
    916         }
    917 
    918         public int getB() {
    919             return this.b;
    920         }
    921     }
    922 
    923     /**
    924      * Tests two instances of classes that can be equal and that are not "related". The two classes are not subclasses
    925      * of each other and do not share a parent aside from Object.
    926      * See http://issues.apache.org/bugzilla/show_bug.cgi?id=33069
    927      */
    928     @Test public void testUnrelatedClasses() {
    929         Object[] x = new Object[]{new TestACanEqualB(1)};
    930         Object[] y = new Object[]{new TestBCanEqualA(1)};
    931 
    932         // sanity checks:
    933         assertTrue(Arrays.equals(x, x));
    934         assertTrue(Arrays.equals(y, y));
    935         assertTrue(Arrays.equals(x, y));
    936         assertTrue(Arrays.equals(y, x));
    937         // real tests:
    938         assertTrue(x[0].equals(x[0]));
    939         assertTrue(y[0].equals(y[0]));
    940         assertTrue(x[0].equals(y[0]));
    941         assertTrue(y[0].equals(x[0]));
    942         assertTrue(new EqualsBuilder().append(x, x).isEquals());
    943         assertTrue(new EqualsBuilder().append(y, y).isEquals());
    944         assertTrue(new EqualsBuilder().append(x, y).isEquals());
    945         assertTrue(new EqualsBuilder().append(y, x).isEquals());
    946     }
    947 
    948     /**
    949      * Test from http://issues.apache.org/bugzilla/show_bug.cgi?id=33067
    950      */
    951     @Test public void testNpeForNullElement() {
    952         Object[] x1 = new Object[] { new Integer(1), null, new Integer(3) };
    953         Object[] x2 = new Object[] { new Integer(1), new Integer(2), new Integer(3) };
    954 
    955         // causes an NPE in 2.0 according to:
    956         // http://issues.apache.org/bugzilla/show_bug.cgi?id=33067
    957         new EqualsBuilder().append(x1, x2);
    958     }
    959 
    960     @Test public void testReflectionEqualsExcludeFields() throws Exception {
    961         TestObjectWithMultipleFields x1 = new TestObjectWithMultipleFields(1, 2, 3);
    962         TestObjectWithMultipleFields x2 = new TestObjectWithMultipleFields(1, 3, 4);
    963 
    964         // not equal when including all fields
    965         assertTrue(!EqualsBuilder.reflectionEquals(x1, x2));
    966 
    967         // doesn't barf on null, empty array, or non-existent field, but still tests as not equal
    968         assertTrue(!EqualsBuilder.reflectionEquals(x1, x2, (String[]) null));
    969         assertTrue(!EqualsBuilder.reflectionEquals(x1, x2, new String[] {}));
    970         assertTrue(!EqualsBuilder.reflectionEquals(x1, x2, new String[] {"xxx"}));
    971 
    972         // not equal if only one of the differing fields excluded
    973         assertTrue(!EqualsBuilder.reflectionEquals(x1, x2, new String[] {"two"}));
    974         assertTrue(!EqualsBuilder.reflectionEquals(x1, x2, new String[] {"three"}));
    975 
    976         // equal if both differing fields excluded
    977         assertTrue(EqualsBuilder.reflectionEquals(x1, x2, new String[] {"two", "three"}));
    978 
    979         // still equal as long as both differing fields are among excluded
    980         assertTrue(EqualsBuilder.reflectionEquals(x1, x2, new String[] {"one", "two", "three"}));
    981         assertTrue(EqualsBuilder.reflectionEquals(x1, x2, new String[] {"one", "two", "three", "xxx"}));
    982     }
    983 
    984     @SuppressWarnings("unused")
    985     static class TestObjectWithMultipleFields {
    986         private TestObject one;
    987         private TestObject two;
    988         private TestObject three;
    989 
    990         public TestObjectWithMultipleFields(int one, int two, int three) {
    991             this.one = new TestObject(one);
    992             this.two = new TestObject(two);
    993             this.three = new TestObject(three);
    994         }
    995     }
    996 }
    997