From 3c7ef7d46ebc592a4e68285a207768347fdf5b9e Mon Sep 17 00:00:00 2001 From: Rob Bygrave Date: Sat, 6 Jan 2018 12:51:50 +1300 Subject: [PATCH] #1229 - Implement equals and hashCode on ModifyAwareMap, ModifyAwareList and ModifyAwareSet --- .../ebeaninternal/json/ModifyAwareList.java | 14 +++ .../io/ebeaninternal/json/ModifyAwareMap.java | 14 +++ .../io/ebeaninternal/json/ModifyAwareSet.java | 14 +++ .../json/ModifyAwareMapTest.java | 108 +++++++++++------- .../server/type/ModifyAwareListTest.java | 67 +++++++---- .../server/type/ModifyAwareSetTest.java | 21 ++++ 6 files changed, 172 insertions(+), 66 deletions(-) diff --git a/src/main/java/io/ebeaninternal/json/ModifyAwareList.java b/src/main/java/io/ebeaninternal/json/ModifyAwareList.java index 8119bf015..cf3e6b43b 100644 --- a/src/main/java/io/ebeaninternal/json/ModifyAwareList.java +++ b/src/main/java/io/ebeaninternal/json/ModifyAwareList.java @@ -5,6 +5,7 @@ import java.util.Iterator; import java.util.LinkedHashSet; import java.util.List; import java.util.ListIterator; +import java.util.Objects; /** * Modify aware wrapper of a list. @@ -32,6 +33,19 @@ public class ModifyAwareList implements List, ModifyAwareOwner { return list.toString(); } + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof ModifyAwareList)) return false; + ModifyAwareList that = (ModifyAwareList) o; + return Objects.equals(list, that.list); + } + + @Override + public int hashCode() { + return Objects.hash(list); + } + @Override public boolean isMarkedDirty() { return owner.isMarkedDirty(); diff --git a/src/main/java/io/ebeaninternal/json/ModifyAwareMap.java b/src/main/java/io/ebeaninternal/json/ModifyAwareMap.java index f1fc5ab88..88b488820 100644 --- a/src/main/java/io/ebeaninternal/json/ModifyAwareMap.java +++ b/src/main/java/io/ebeaninternal/json/ModifyAwareMap.java @@ -3,6 +3,7 @@ package io.ebeaninternal.json; import java.util.Collection; import java.util.LinkedHashSet; import java.util.Map; +import java.util.Objects; import java.util.Set; /** @@ -34,6 +35,19 @@ public class ModifyAwareMap implements Map, ModifyAwareOwner { return map.toString(); } + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof ModifyAwareMap)) return false; + ModifyAwareMap that = (ModifyAwareMap) o; + return Objects.equals(map, that.map); + } + + @Override + public int hashCode() { + return Objects.hash(map); + } + @Override public boolean isMarkedDirty() { return owner.isMarkedDirty(); diff --git a/src/main/java/io/ebeaninternal/json/ModifyAwareSet.java b/src/main/java/io/ebeaninternal/json/ModifyAwareSet.java index d7e31597a..03a2627de 100644 --- a/src/main/java/io/ebeaninternal/json/ModifyAwareSet.java +++ b/src/main/java/io/ebeaninternal/json/ModifyAwareSet.java @@ -2,6 +2,7 @@ package io.ebeaninternal.json; import java.util.Collection; import java.util.Iterator; +import java.util.Objects; import java.util.Set; /** @@ -51,6 +52,19 @@ public class ModifyAwareSet implements Set, ModifyAwareOwner { return set.toString(); } + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof ModifyAwareSet)) return false; + ModifyAwareSet that = (ModifyAwareSet) o; + return Objects.equals(set, that.set); + } + + @Override + public int hashCode() { + return Objects.hash(set); + } + @Override public boolean add(E o) { if (set.add(o)) { diff --git a/src/test/java/io/ebeaninternal/json/ModifyAwareMapTest.java b/src/test/java/io/ebeaninternal/json/ModifyAwareMapTest.java index 48611e1c7..589e4bf11 100644 --- a/src/test/java/io/ebeaninternal/json/ModifyAwareMapTest.java +++ b/src/test/java/io/ebeaninternal/json/ModifyAwareMapTest.java @@ -1,7 +1,6 @@ package io.ebeaninternal.json; -import org.assertj.core.api.Assertions; import org.junit.Assert; import org.junit.Test; @@ -16,6 +15,10 @@ import java.util.LinkedHashMap; import java.util.Map; import java.util.Set; +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; + public class ModifyAwareMapTest { private ModifyAwareMap createMap() { @@ -34,96 +37,96 @@ public class ModifyAwareMapTest { } @Test - public void testToString() throws Exception { + public void testToString() { ModifyAwareMap map = createMap(); - Assert.assertEquals(map.map.toString(), map.toString()); + assertEquals(map.map.toString(), map.toString()); } @Test - public void testIsMarkedDirty() throws Exception { + public void testIsMarkedDirty() { ModifyAwareMap map = createMap(); - Assert.assertFalse(map.isMarkedDirty()); + assertFalse(map.isMarkedDirty()); map.put("A", "change"); Assert.assertTrue(map.isMarkedDirty()); } @Test - public void testMarkAsModified() throws Exception { + public void testMarkAsModified() { ModifyAwareMap map = createMap(); - Assert.assertFalse(map.isMarkedDirty()); + assertFalse(map.isMarkedDirty()); map.markAsModified(); Assert.assertTrue(map.isMarkedDirty()); } @Test - public void testSize() throws Exception { + public void testSize() { ModifyAwareMap map = createMap(); - Assert.assertEquals(5, map.size()); + assertEquals(5, map.size()); } @Test - public void testIsEmpty() throws Exception { + public void testIsEmpty() { - Assert.assertFalse(createMap().isEmpty()); + assertFalse(createMap().isEmpty()); Assert.assertTrue(createEmptyMap().isEmpty()); } @Test - public void testContainsKey() throws Exception { + public void testContainsKey() { ModifyAwareMap map = createMap(); Assert.assertTrue(map.containsKey("A")); - Assert.assertFalse(map.containsKey("Z")); + assertFalse(map.containsKey("Z")); } @Test - public void testContainsValue() throws Exception { + public void testContainsValue() { ModifyAwareMap map = createMap(); Assert.assertTrue(map.containsValue("one")); - Assert.assertFalse(map.containsValue("junk")); + assertFalse(map.containsValue("junk")); } @Test - public void testGet() throws Exception { + public void testGet() { ModifyAwareMap map = createMap(); - Assert.assertEquals("two", map.get("B")); + assertEquals("two", map.get("B")); Assert.assertNull(map.get("Z")); - Assert.assertFalse(map.isMarkedDirty()); + assertFalse(map.isMarkedDirty()); } @Test - public void testPut() throws Exception { + public void testPut() { ModifyAwareMap map = createMap(); - Assert.assertFalse(map.isMarkedDirty()); + assertFalse(map.isMarkedDirty()); map.put("A", "mod"); Assert.assertTrue(map.isMarkedDirty()); } @Test - public void testRemove() throws Exception { + public void testRemove() { ModifyAwareMap map = createMap(); - Assert.assertFalse(map.isMarkedDirty()); + assertFalse(map.isMarkedDirty()); map.remove("A"); Assert.assertTrue(map.isMarkedDirty()); } @Test - public void testPutAllWithEmpty() throws Exception { + public void testPutAllWithEmpty() { ModifyAwareMap map = createMap(); - Assert.assertFalse(map.isMarkedDirty()); + assertFalse(map.isMarkedDirty()); Map other = new HashMap<>(); map.putAll(other); @@ -131,10 +134,10 @@ public class ModifyAwareMapTest { } @Test - public void testPutAll() throws Exception { + public void testPutAll() { ModifyAwareMap map = createMap(); - Assert.assertFalse(map.isMarkedDirty()); + assertFalse(map.isMarkedDirty()); Map other = new HashMap<>(); other.put("A", "one"); @@ -143,49 +146,49 @@ public class ModifyAwareMapTest { } @Test - public void testClear() throws Exception { + public void testClear() { ModifyAwareMap map = createMap(); - Assert.assertFalse(map.isMarkedDirty()); + assertFalse(map.isMarkedDirty()); map.clear(); Assert.assertTrue(map.isMarkedDirty()); } @Test - public void testKeySet() throws Exception { + public void testKeySet() { ModifyAwareMap map = createMap(); - Assert.assertFalse(map.isMarkedDirty()); + assertFalse(map.isMarkedDirty()); Set keys = map.keySet(); - Assert.assertEquals(map.size(), keys.size()); + assertEquals(map.size(), keys.size()); Assert.assertTrue(keys.contains("A")); - Assert.assertFalse(map.isMarkedDirty()); + assertFalse(map.isMarkedDirty()); } @Test - public void testValues() throws Exception { + public void testValues() { ModifyAwareMap map = createMap(); - Assert.assertFalse(map.isMarkedDirty()); + assertFalse(map.isMarkedDirty()); Collection values = map.values(); - Assert.assertEquals(map.size(), values.size()); + assertEquals(map.size(), values.size()); Assert.assertTrue(values.contains("one")); - Assert.assertFalse(map.isMarkedDirty()); + assertFalse(map.isMarkedDirty()); } @Test - public void testEntrySet() throws Exception { + public void testEntrySet() { ModifyAwareMap map = createMap(); Set> entries = map.entrySet(); - Assert.assertFalse(map.isMarkedDirty()); + assertFalse(map.isMarkedDirty()); - Assert.assertEquals(map.size(), entries.size()); - Assert.assertFalse(map.isMarkedDirty()); + assertEquals(map.size(), entries.size()); + assertFalse(map.isMarkedDirty()); } @Test @@ -203,7 +206,28 @@ public class ModifyAwareMapTest { ObjectInputStream ois = new ObjectInputStream(is); @SuppressWarnings("unchecked") - ModifyAwareMap read = (ModifyAwareMap)ois.readObject(); - Assertions.assertThat(read).hasSize(orig.size()); + ModifyAwareMap read = (ModifyAwareMap) ois.readObject(); + assertThat(read).hasSize(orig.size()); + } + + @Test + public void equalsWhenEqual() { + + ModifyAwareMap mapA = createMap(); + ModifyAwareMap mapB = createMap(); + + assertThat(mapA).isEqualTo(mapB); + assertThat(mapA.hashCode()).isEqualTo(mapB.hashCode()); + } + + @Test + public void equalsWhenNotEqual() { + + ModifyAwareMap mapA = createMap(); + ModifyAwareMap mapB = createMap(); + mapB.put("F", "Six"); + + assertThat(mapA).isNotEqualTo(mapB); + assertThat(mapA.hashCode()).isNotEqualTo(mapB.hashCode()); } } diff --git a/src/test/java/io/ebeaninternal/server/type/ModifyAwareListTest.java b/src/test/java/io/ebeaninternal/server/type/ModifyAwareListTest.java index 76a11b190..33cc83199 100644 --- a/src/test/java/io/ebeaninternal/server/type/ModifyAwareListTest.java +++ b/src/test/java/io/ebeaninternal/server/type/ModifyAwareListTest.java @@ -24,9 +24,7 @@ import static org.junit.Assert.assertTrue; public class ModifyAwareListTest { private ModifyAwareList createList() { - ArrayList list = new ArrayList<>(); - list.addAll(Arrays.asList("A", "B", "C", "D", "E")); - return new ModifyAwareList<>(list); + return new ModifyAwareList<>(new ArrayList<>(Arrays.asList("A", "B", "C", "D", "E"))); } private ModifyAwareList createEmptyList() { @@ -34,27 +32,27 @@ public class ModifyAwareListTest { } @Test - public void testSize() throws Exception { + public void testSize() { assertEquals(5, createList().size()); } @Test - public void testIsEmpty() throws Exception { + public void testIsEmpty() { assertFalse(createList().isEmpty()); assertTrue(createEmptyList().isEmpty()); } @Test - public void testContains() throws Exception { + public void testContains() { assertTrue(createList().contains("B")); assertFalse(createList().contains("Z")); } @Test - public void testIterator() throws Exception { + public void testIterator() { ModifyAwareList list = createList(); Iterator iterator = list.iterator(); @@ -67,7 +65,7 @@ public class ModifyAwareListTest { } @Test - public void testToArray() throws Exception { + public void testToArray() { Object[] objects = createList().toArray(); assertEquals(5, objects.length); @@ -76,7 +74,7 @@ public class ModifyAwareListTest { } @Test - public void testToArray1() throws Exception { + public void testToArray1() { String[] objects = createList().toArray(new String[5]); assertEquals(5, objects.length); @@ -85,7 +83,7 @@ public class ModifyAwareListTest { } @Test - public void testAdd() throws Exception { + public void testAdd() { ModifyAwareList list = createList(); assertFalse(list.isMarkedDirty()); @@ -95,7 +93,7 @@ public class ModifyAwareListTest { } @Test - public void testRemove() throws Exception { + public void testRemove() { ModifyAwareList list = createList(); assertFalse(list.isMarkedDirty()); @@ -105,7 +103,7 @@ public class ModifyAwareListTest { } @Test - public void testContainsAll() throws Exception { + public void testContainsAll() { ModifyAwareList list = createList(); @@ -114,7 +112,7 @@ public class ModifyAwareListTest { } @Test - public void testAddAll() throws Exception { + public void testAddAll() { ModifyAwareList list = createList(); assertFalse(list.isMarkedDirty()); @@ -125,7 +123,7 @@ public class ModifyAwareListTest { @Test - public void testRemoveAll() throws Exception { + public void testRemoveAll() { ModifyAwareList list = createList(); assertFalse(list.isMarkedDirty()); @@ -135,7 +133,7 @@ public class ModifyAwareListTest { } @Test - public void testRetainAll() throws Exception { + public void testRetainAll() { ModifyAwareList list = createList(); assertFalse(list.isMarkedDirty()); @@ -146,7 +144,7 @@ public class ModifyAwareListTest { } @Test - public void testClear() throws Exception { + public void testClear() { ModifyAwareList list = createList(); assertFalse(list.isMarkedDirty()); @@ -158,7 +156,7 @@ public class ModifyAwareListTest { } @Test - public void testGet() throws Exception { + public void testGet() { ModifyAwareList list = createList(); @@ -168,7 +166,7 @@ public class ModifyAwareListTest { } @Test - public void testSet() throws Exception { + public void testSet() { ModifyAwareList list = createList(); assertFalse(list.isMarkedDirty()); @@ -179,7 +177,7 @@ public class ModifyAwareListTest { } @Test - public void testIndexOf() throws Exception { + public void testIndexOf() { ModifyAwareList list = createList(); assertFalse(list.isMarkedDirty()); @@ -190,7 +188,7 @@ public class ModifyAwareListTest { } @Test - public void testLastIndexOf() throws Exception { + public void testLastIndexOf() { ModifyAwareList list = createList(); assertFalse(list.isMarkedDirty()); @@ -201,7 +199,7 @@ public class ModifyAwareListTest { } @Test - public void testListIterator() throws Exception { + public void testListIterator() { ModifyAwareList list = createList(); ListIterator iterator = list.listIterator(); @@ -214,7 +212,7 @@ public class ModifyAwareListTest { } @Test - public void testListIterator1() throws Exception { + public void testListIterator1() { ModifyAwareList list = createList(); ListIterator iterator = list.listIterator(2); @@ -228,7 +226,7 @@ public class ModifyAwareListTest { } @Test - public void testSubList() throws Exception { + public void testSubList() { ModifyAwareList list = createList(); List sub = list.subList(1, 3); @@ -242,7 +240,7 @@ public class ModifyAwareListTest { } @Test - public void testAsSet() throws Exception { + public void testAsSet() { ModifyAwareList list = createList(); ModifyAwareSet set = list.asSet(); @@ -271,4 +269,25 @@ public class ModifyAwareListTest { ModifyAwareList read = (ModifyAwareList)ois.readObject(); assertThat(read).contains("A", "B", "C", "D", "E"); } + + @Test + public void equalsWhenEqual() { + + ModifyAwareList listA = createList(); + ModifyAwareList listB = createList(); + + assertThat(listA).isEqualTo(listB); + assertThat(listA.hashCode()).isEqualTo(listB.hashCode()); + } + + @Test + public void equalsWhenNotEqual() { + + ModifyAwareList listA = createList(); + ModifyAwareList listB = createList(); + listB.add("F"); + + assertThat(listA).isNotEqualTo(listB); + assertThat(listA.hashCode()).isNotEqualTo(listB.hashCode()); + } } diff --git a/src/test/java/io/ebeaninternal/server/type/ModifyAwareSetTest.java b/src/test/java/io/ebeaninternal/server/type/ModifyAwareSetTest.java index f3f4023c7..fc5775e68 100644 --- a/src/test/java/io/ebeaninternal/server/type/ModifyAwareSetTest.java +++ b/src/test/java/io/ebeaninternal/server/type/ModifyAwareSetTest.java @@ -38,4 +38,25 @@ public class ModifyAwareSetTest { ModifyAwareSet read = (ModifyAwareSet)ois.readObject(); assertThat(read).contains("A", "B", "C", "D", "E"); } + + @Test + public void equalsWhenEqual() { + + ModifyAwareSet setA = createSet(); + ModifyAwareSet setB = createSet(); + + assertThat(setA).isEqualTo(setB); + assertThat(setA.hashCode()).isEqualTo(setB.hashCode()); + } + + @Test + public void equalsWhenNotEqual() { + + ModifyAwareSet setA = createSet(); + ModifyAwareSet setB = createSet(); + setB.add("F"); + + assertThat(setA).isNotEqualTo(setB); + assertThat(setA.hashCode()).isNotEqualTo(setB.hashCode()); + } }