Skip to content

Commit

Permalink
Implement equals and Hashcode on GenericData (#589)
Browse files Browse the repository at this point in the history
* 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
  • Loading branch information
andrey-qlogic authored and sduskis committed Feb 13, 2019
1 parent 8a444b0 commit 8e5a7bb
Show file tree
Hide file tree
Showing 3 changed files with 79 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -196,6 +197,28 @@ public final void setUnknownKeys(Map<String, Object> 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.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -48,13 +48,66 @@ public void setFieldB(List<String> 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() {
Expand Down

0 comments on commit 8e5a7bb

Please sign in to comment.