Skip to content

Commit 8e5a7bb

Browse files
andrey-qlogicsduskis
authored andcommitted
Implement equals and Hashcode on GenericData (#589)
* 936: Added hashCode(), toString() and equals() methods relaing on classInfo and unknownFields. * 936: Changes after review. * 936: Modified unit test. * 936: Added more unit tests. * 936: GenericJsonTest fixed because toString was updated in GenericData. * 936: Changes after review. * Update GenericData.java
1 parent 8a444b0 commit 8e5a7bb

File tree

3 files changed

+79
-3
lines changed

3 files changed

+79
-3
lines changed

google-http-client/src/main/java/com/google/api/client/util/GenericData.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import java.util.Iterator;
2121
import java.util.Locale;
2222
import java.util.Map;
23+
import java.util.Objects;
2324
import java.util.Set;
2425
import java.util.concurrent.ConcurrentMap;
2526

@@ -196,6 +197,28 @@ public final void setUnknownKeys(Map<String, Object> unknownFields) {
196197
this.unknownFields = unknownFields;
197198
}
198199

200+
@Override
201+
public boolean equals(Object o) {
202+
if (o == this) {
203+
return true;
204+
}
205+
if (o == null || !(o instanceof GenericData)) {
206+
return false;
207+
}
208+
GenericData that = (GenericData) o;
209+
return super.equals(that) && Objects.equals(this.classInfo, that.classInfo);
210+
}
211+
212+
@Override
213+
public int hashCode() {
214+
return Objects.hash(super.hashCode(), classInfo);
215+
}
216+
217+
@Override
218+
public String toString() {
219+
return "GenericData{" + "classInfo=" + classInfo.names + ", " + super.toString() + "}";
220+
}
221+
199222
/**
200223
* Returns the class information.
201224
*

google-http-client/src/test/java/com/google/api/client/json/GenericJsonTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,6 @@ public class GenericJsonTest extends TestCase {
2626
public void testToString_noFactory() {
2727
GenericJson data = new GenericJson();
2828
data.put("a", "b");
29-
assertEquals("{a=b}", data.toString());
29+
assertEquals("GenericData{classInfo=[], {a=b}}", data.toString());
3030
}
3131
}

google-http-client/src/test/java/com/google/api/client/util/GenericDataTest.java

Lines changed: 55 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,13 +48,66 @@ public void setFieldB(List<String> fieldB) {
4848
}
4949
}
5050

51+
private class GenericData1 extends GenericData {
52+
public GenericData1() {
53+
super(EnumSet.of(Flags.IGNORE_CASE));
54+
}
55+
56+
@Key("FieldA")
57+
public String fieldA;
58+
}
59+
60+
private class GenericData2 extends GenericData {
61+
public GenericData2() {
62+
super(EnumSet.of(Flags.IGNORE_CASE));
63+
}
64+
65+
@Key("FieldA")
66+
public String fieldA;
67+
}
68+
69+
public void testEquals_Symmetric() {
70+
GenericData actual = new GenericData1();
71+
actual.set("fieldA", "bar");
72+
GenericData expected = new GenericData2();
73+
// Test that objects are equal.
74+
expected.set("fieldA", "bar");
75+
assertNotSame(expected, actual);
76+
assertTrue(expected.equals(expected) && actual.equals(actual));
77+
// Test that objects not are equal.
78+
expected.set("fieldA", "far");
79+
assertFalse(expected.equals(actual) || actual.equals(expected));
80+
assertFalse(expected.hashCode() == actual.hashCode());
81+
}
82+
83+
public void testEquals_SymmetricWithSameClass() {
84+
GenericData actual = new MyData();
85+
actual.set("fieldA", "bar");
86+
GenericData expected = new MyData();
87+
// Test that objects are equal.
88+
expected.set("fieldA", "bar");
89+
assertNotSame(expected, actual);
90+
assertTrue(expected.equals(expected) && actual.equals(actual));
91+
assertTrue(expected.hashCode() == expected.hashCode());
92+
}
93+
94+
public void testNotEquals_SymmetricWithSameClass() {
95+
GenericData actual = new MyData();
96+
actual.set("fieldA", "bar");
97+
GenericData expected = new MyData();
98+
// Test that objects are not equal.
99+
expected.set("fieldA", "far");
100+
assertNotSame(expected, actual);
101+
assertFalse(expected.equals(actual) || actual.equals(expected));
102+
assertFalse(expected.hashCode() == actual.hashCode());
103+
}
51104

52105
public void testClone_changingEntrySet() {
53106
GenericData data = new GenericData();
54-
assertEquals("{}", data.toString());
107+
assertEquals("GenericData{classInfo=[], {}}", data.toString());
55108
GenericData clone = data.clone();
56109
clone.set("foo", "bar");
57-
assertEquals("{foo=bar}", clone.toString());
110+
assertEquals("GenericData{classInfo=[], {foo=bar}}", clone.toString());
58111
}
59112

60113
public void testSetIgnoreCase_unknownKey() {

0 commit comments

Comments
 (0)