View Javadoc
1   package org.pojomatic.internal;
2   
3   import static org.testng.Assert.*;
4   
5   import org.testng.annotations.Test;
6   import org.pojomatic.annotations.Property;
7   import org.pojomatic.Pojomator;
8   import org.pojomatic.Pojomatic;
9   
10  public class EqualsInheritanceTest {
11    private static class Parent {
12      @Property int x = 3;
13  
14      @Override
15      public int hashCode() {
16        return Pojomatic.hashCode(this);
17      }
18  
19      @Override
20      public boolean equals(Object o) {
21        return Pojomatic.equals(this, o);
22      }
23    }
24  
25    private static Pojomator<Parent> PARENT_POJOMATOR = PojomatorFactory.makePojomator(Parent.class);
26    private static Parent PARENT = new Parent();
27  
28    @Test public void testChildWithNoNewProperties() {
29      class Child extends Parent {}
30      Child child = new Child();
31      Pojomator<Child> childPojomator = PojomatorFactory.makePojomator(Child.class);
32  
33      assertTrue(PARENT_POJOMATOR.doEquals(PARENT, child));
34      assertTrue(PARENT_POJOMATOR.doEquals(child, PARENT));
35      assertTrue(childPojomator.doEquals(child, PARENT));
36    }
37  
38    @Test public void testChildWithNewProperty() {
39      class Child extends Parent { @Property int y = 4; }
40      Child child = new Child();
41      Pojomator<Child> childPojomator = PojomatorFactory.makePojomator(Child.class);
42  
43      assertFalse(PARENT.equals(child));
44      assertFalse(child.equals(PARENT));
45      assertFalse(PARENT_POJOMATOR.doEquals(PARENT, child));
46      assertFalse(childPojomator.doEquals(child, PARENT));
47      // If we explicitly use a PARENT_POJOMATOR to compare child to parent, we'll miss the additional
48      //child property.
49      assertTrue(PARENT_POJOMATOR.doEquals(child, PARENT));
50    }
51  
52    @Test public void testTwoChildrenWithNoNewProperties() {
53      class Child1 extends Parent {}
54      class Child2 extends Parent {}
55      Child1 child1 = new Child1();
56      Child2 child2 = new Child2();
57      Pojomator<Child1> childPojomator = PojomatorFactory.makePojomator(Child1.class);
58  
59      assertTrue(PARENT_POJOMATOR.doEquals(child1, child2));
60      assertTrue(childPojomator.doEquals(child1, child2));
61    }
62  
63    @Test public void testTwoChildrenWithOneHavingNewProperties() {
64      class Child1 extends Parent { @Property int y = 4; }
65      class Child2 extends Parent {}
66      Child1 child1 = new Child1();
67      Child2 child2 = new Child2();
68      Pojomator<Child1> child1Pojomator = PojomatorFactory.makePojomator(Child1.class);
69      Pojomator<Child2> child2Pojomator = PojomatorFactory.makePojomator(Child2.class);
70  
71      assertFalse(child1Pojomator.doEquals(child1, child2));
72      assertFalse(child2Pojomator.doEquals(child2, child1));
73    }
74  }