diff --git a/google-http-client/src/main/java/com/google/api/client/util/GenericData.java b/google-http-client/src/main/java/com/google/api/client/util/GenericData.java index 6d1b5b14a..7596a7b61 100644 --- a/google-http-client/src/main/java/com/google/api/client/util/GenericData.java +++ b/google-http-client/src/main/java/com/google/api/client/util/GenericData.java @@ -20,6 +20,7 @@ import java.util.Iterator; import java.util.Locale; import java.util.Map; +import java.util.Objects; import java.util.Set; import java.util.concurrent.ConcurrentMap; @@ -196,6 +197,28 @@ public final void setUnknownKeys(Map unknownFields) { this.unknownFields = unknownFields; } + @Override + public boolean equals(Object o) { + if (o == this) { + return true; + } + if (o == null || !(o instanceof GenericData)) { + return false; + } + GenericData that = (GenericData) o; + return super.equals(that) && Objects.equals(this.classInfo, that.classInfo); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), classInfo); + } + + @Override + public String toString() { + return "GenericData{" + "classInfo=" + classInfo.names + ", " + super.toString() + "}"; + } + /** * Returns the class information. * diff --git a/google-http-client/src/test/java/com/google/api/client/json/GenericJsonTest.java b/google-http-client/src/test/java/com/google/api/client/json/GenericJsonTest.java index 662e6e129..5d56eae40 100644 --- a/google-http-client/src/test/java/com/google/api/client/json/GenericJsonTest.java +++ b/google-http-client/src/test/java/com/google/api/client/json/GenericJsonTest.java @@ -26,6 +26,6 @@ public class GenericJsonTest extends TestCase { public void testToString_noFactory() { GenericJson data = new GenericJson(); data.put("a", "b"); - assertEquals("{a=b}", data.toString()); + assertEquals("GenericData{classInfo=[], {a=b}}", data.toString()); } } diff --git a/google-http-client/src/test/java/com/google/api/client/util/GenericDataTest.java b/google-http-client/src/test/java/com/google/api/client/util/GenericDataTest.java index 4daf1bf3f..9dabe8298 100644 --- a/google-http-client/src/test/java/com/google/api/client/util/GenericDataTest.java +++ b/google-http-client/src/test/java/com/google/api/client/util/GenericDataTest.java @@ -48,13 +48,66 @@ public void setFieldB(List fieldB) { } } + private class GenericData1 extends GenericData { + public GenericData1() { + super(EnumSet.of(Flags.IGNORE_CASE)); + } + + @Key("FieldA") + public String fieldA; + } + + private class GenericData2 extends GenericData { + public GenericData2() { + super(EnumSet.of(Flags.IGNORE_CASE)); + } + + @Key("FieldA") + public String fieldA; + } + + public void testEquals_Symmetric() { + GenericData actual = new GenericData1(); + actual.set("fieldA", "bar"); + GenericData expected = new GenericData2(); + // Test that objects are equal. + expected.set("fieldA", "bar"); + assertNotSame(expected, actual); + assertTrue(expected.equals(expected) && actual.equals(actual)); + // Test that objects not are equal. + expected.set("fieldA", "far"); + assertFalse(expected.equals(actual) || actual.equals(expected)); + assertFalse(expected.hashCode() == actual.hashCode()); + } + + public void testEquals_SymmetricWithSameClass() { + GenericData actual = new MyData(); + actual.set("fieldA", "bar"); + GenericData expected = new MyData(); + // Test that objects are equal. + expected.set("fieldA", "bar"); + assertNotSame(expected, actual); + assertTrue(expected.equals(expected) && actual.equals(actual)); + assertTrue(expected.hashCode() == expected.hashCode()); + } + + public void testNotEquals_SymmetricWithSameClass() { + GenericData actual = new MyData(); + actual.set("fieldA", "bar"); + GenericData expected = new MyData(); + // Test that objects are not equal. + expected.set("fieldA", "far"); + assertNotSame(expected, actual); + assertFalse(expected.equals(actual) || actual.equals(expected)); + assertFalse(expected.hashCode() == actual.hashCode()); + } public void testClone_changingEntrySet() { GenericData data = new GenericData(); - assertEquals("{}", data.toString()); + assertEquals("GenericData{classInfo=[], {}}", data.toString()); GenericData clone = data.clone(); clone.set("foo", "bar"); - assertEquals("{foo=bar}", clone.toString()); + assertEquals("GenericData{classInfo=[], {foo=bar}}", clone.toString()); } public void testSetIgnoreCase_unknownKey() {