From 579c1efcf6b0d876fbaeb153da746cadad1217be Mon Sep 17 00:00:00 2001 From: Roland Praml Date: Wed, 8 May 2019 17:00:08 +0200 Subject: [PATCH] Add tests and fixes in hashCode --- .../ebeaninternal/json/ModifyAwareList.java | 2 +- .../io/ebeaninternal/json/ModifyAwareMap.java | 3 +- .../io/ebeaninternal/json/ModifyAwareSet.java | 2 +- .../server/type/ModifyAwareListTest.java | 21 ++++- .../server/type/ModifyAwareMapTest.java | 88 +++++++++++++++++++ .../server/type/ModifyAwareSetTest.java | 23 +++++ 6 files changed, 132 insertions(+), 7 deletions(-) create mode 100644 src/test/java/io/ebeaninternal/server/type/ModifyAwareMapTest.java diff --git a/src/main/java/io/ebeaninternal/json/ModifyAwareList.java b/src/main/java/io/ebeaninternal/json/ModifyAwareList.java index 04e63fbf5..197f02466 100644 --- a/src/main/java/io/ebeaninternal/json/ModifyAwareList.java +++ b/src/main/java/io/ebeaninternal/json/ModifyAwareList.java @@ -47,7 +47,7 @@ public class ModifyAwareList implements List, ModifyAwareOwner { @Override public int hashCode() { - return Objects.hash(list); + return list.hashCode(); } @Override diff --git a/src/main/java/io/ebeaninternal/json/ModifyAwareMap.java b/src/main/java/io/ebeaninternal/json/ModifyAwareMap.java index b0cd03f06..74eb81c87 100644 --- a/src/main/java/io/ebeaninternal/json/ModifyAwareMap.java +++ b/src/main/java/io/ebeaninternal/json/ModifyAwareMap.java @@ -2,7 +2,6 @@ package io.ebeaninternal.json; import java.util.Collection; import java.util.LinkedHashSet; -import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Set; @@ -50,7 +49,7 @@ public class ModifyAwareMap implements Map, ModifyAwareOwner { @Override public int hashCode() { - return Objects.hash(map); + return map.hashCode(); } @Override diff --git a/src/main/java/io/ebeaninternal/json/ModifyAwareSet.java b/src/main/java/io/ebeaninternal/json/ModifyAwareSet.java index ba0777283..f80b16347 100644 --- a/src/main/java/io/ebeaninternal/json/ModifyAwareSet.java +++ b/src/main/java/io/ebeaninternal/json/ModifyAwareSet.java @@ -66,7 +66,7 @@ public class ModifyAwareSet implements Set, ModifyAwareOwner { @Override public int hashCode() { - return Objects.hash(set); + return set.hashCode(); } @Override diff --git a/src/test/java/io/ebeaninternal/server/type/ModifyAwareListTest.java b/src/test/java/io/ebeaninternal/server/type/ModifyAwareListTest.java index 33cc83199..a7ebbecda 100644 --- a/src/test/java/io/ebeaninternal/server/type/ModifyAwareListTest.java +++ b/src/test/java/io/ebeaninternal/server/type/ModifyAwareListTest.java @@ -16,9 +16,7 @@ import java.util.List; import java.util.ListIterator; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; +import static org.junit.Assert.*; public class ModifyAwareListTest { @@ -290,4 +288,21 @@ public class ModifyAwareListTest { assertThat(listA).isNotEqualTo(listB); assertThat(listA.hashCode()).isNotEqualTo(listB.hashCode()); } + + @Test + public void testEqualsAndHashCode() throws Exception { + ModifyAwareList listA = createEmptyList(); + ArrayList listB = new ArrayList<>(); + + assertThat(listA).isEqualTo(listB); + assertThat(listA.hashCode()).isEqualTo(listB.hashCode()); + + listA.add("foo"); + assertThat(listA).isNotEqualTo(listB); + assertThat(listA.hashCode()).isNotEqualTo(listB.hashCode()); + + listB.add("foo"); + assertThat(listA).isEqualTo(listB); + assertThat(listA.hashCode()).isEqualTo(listB.hashCode()); + } } diff --git a/src/test/java/io/ebeaninternal/server/type/ModifyAwareMapTest.java b/src/test/java/io/ebeaninternal/server/type/ModifyAwareMapTest.java new file mode 100644 index 000000000..5cc23d0dd --- /dev/null +++ b/src/test/java/io/ebeaninternal/server/type/ModifyAwareMapTest.java @@ -0,0 +1,88 @@ +package io.ebeaninternal.server.type; + +import io.ebeaninternal.json.ModifyAwareMap; +import org.junit.Test; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.util.HashMap; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.StrictAssertions.assertThat; + +public class ModifyAwareMapTest { + + private ModifyAwareMap createMap() { + HashMap set = new HashMap<>(); + set.put("A", 1); + set.put("B", 2); + set.put("C", 3); + set.put("D", 4); + set.put("E", 5); + return new ModifyAwareMap<>(set); + } + + private ModifyAwareMap createEmptyMap() { + HashMap set = new HashMap<>(); + return new ModifyAwareMap<>(set); + } + + @Test + public void serialise() throws IOException, ClassNotFoundException { + + ByteArrayOutputStream os = new ByteArrayOutputStream(); + ObjectOutputStream oos = new ObjectOutputStream(os); + + oos.writeObject(createMap()); + oos.flush(); + oos.close(); + + ByteArrayInputStream is = new ByteArrayInputStream(os.toByteArray()); + ObjectInputStream ois = new ObjectInputStream(is); + + @SuppressWarnings("unchecked") + ModifyAwareMap read = (ModifyAwareMap) ois.readObject(); + assertThat(read).containsKeys("A", "B", "C", "D", "E").containsValues(1, 2, 3, 4, 5); + } + + @Test + public void equalsWhenEqual() { + + ModifyAwareMap setA = createMap(); + ModifyAwareMap setB = createMap(); + + assertThat(setA).isEqualTo(setB); + assertThat(setA.hashCode()).isEqualTo(setB.hashCode()); + } + + @Test + public void equalsWhenNotEqual() { + + ModifyAwareMap setA = createMap(); + ModifyAwareMap setB = createMap(); + setB.put("F", 6); + + assertThat(setA).isNotEqualTo(setB); + assertThat(setA.hashCode()).isNotEqualTo(setB.hashCode()); + } + + @Test + public void testEqualsAndHashCode() throws Exception { + ModifyAwareMap setA = createEmptyMap(); + HashMap setB = new HashMap<>(); + + assertThat(setA).isEqualTo(setB); + assertThat(setA.hashCode()).isEqualTo(setB.hashCode()); + + setA.put("foo", 42); + assertThat(setA).isNotEqualTo(setB); + assertThat(setA.hashCode()).isNotEqualTo(setB.hashCode()); + + setB.put("foo", 42); + assertThat(setA).isEqualTo(setB); + assertThat(setA.hashCode()).isEqualTo(setB.hashCode()); + } +} diff --git a/src/test/java/io/ebeaninternal/server/type/ModifyAwareSetTest.java b/src/test/java/io/ebeaninternal/server/type/ModifyAwareSetTest.java index fc5775e68..8198505cb 100644 --- a/src/test/java/io/ebeaninternal/server/type/ModifyAwareSetTest.java +++ b/src/test/java/io/ebeaninternal/server/type/ModifyAwareSetTest.java @@ -12,6 +12,7 @@ import java.util.Arrays; import java.util.HashSet; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.StrictAssertions.assertThat; public class ModifyAwareSetTest { @@ -21,6 +22,11 @@ public class ModifyAwareSetTest { return new ModifyAwareSet<>(set); } + private ModifyAwareSet createEmptySet() { + HashSet set = new HashSet<>(); + return new ModifyAwareSet<>(set); + } + @Test public void serialise() throws IOException, ClassNotFoundException { @@ -59,4 +65,21 @@ public class ModifyAwareSetTest { assertThat(setA).isNotEqualTo(setB); assertThat(setA.hashCode()).isNotEqualTo(setB.hashCode()); } + + @Test + public void testEqualsAndHashCode() throws Exception { + ModifyAwareSet setA = createEmptySet(); + HashSet setB = new HashSet<>(); + + assertThat(setA).isEqualTo(setB); + assertThat(setA.hashCode()).isEqualTo(setB.hashCode()); + + setA.add("foo"); + assertThat(setA).isNotEqualTo(setB); + assertThat(setA.hashCode()).isNotEqualTo(setB.hashCode()); + + setB.add("foo"); + assertThat(setA).isEqualTo(setB); + assertThat(setA.hashCode()).isEqualTo(setB.hashCode()); + } }