Skip to content

Commit

Permalink
Merge pull request #613 from stleary/fix-similar-check
Browse files Browse the repository at this point in the history
Fixes Issue #611 JsonObject.similar() returns after number entry check
  • Loading branch information
stleary committed Jul 26, 2021
2 parents bb048e3 + 8680b10 commit c0e467c
Show file tree
Hide file tree
Showing 4 changed files with 34 additions and 11 deletions.
4 changes: 3 additions & 1 deletion src/main/java/org/json/JSONArray.java
Expand Up @@ -1383,7 +1383,9 @@ public boolean similar(Object other) {
return false;
}
} else if (valueThis instanceof Number && valueOther instanceof Number) {
return JSONObject.isNumberSimilar((Number)valueThis, (Number)valueOther);
if (!JSONObject.isNumberSimilar((Number)valueThis, (Number)valueOther)) {
return false;
}
} else if (!valueThis.equals(valueOther)) {
return false;
}
Expand Down
4 changes: 3 additions & 1 deletion src/main/java/org/json/JSONObject.java
Expand Up @@ -2108,7 +2108,9 @@ public boolean similar(Object other) {
return false;
}
} else if (valueThis instanceof Number && valueOther instanceof Number) {
return isNumberSimilar((Number)valueThis, (Number)valueOther);
if (!isNumberSimilar((Number)valueThis, (Number)valueOther)) {
return false;
};
} else if (!valueThis.equals(valueOther)) {
return false;
}
Expand Down
17 changes: 14 additions & 3 deletions src/test/java/org/json/junit/JSONArrayTest.java
Expand Up @@ -87,6 +87,7 @@ public class JSONArrayTest {
@Test
public void verifySimilar() {
final String string1 = "HasSameRef";
final String string2 = "HasDifferentRef";
JSONArray obj1 = new JSONArray()
.put("abc")
.put(string1)
Expand All @@ -101,10 +102,20 @@ public void verifySimilar() {
.put("abc")
.put(new String(string1))
.put(2);

JSONArray obj4 = new JSONArray()
.put("abc")
.put(2.0)
.put(new String(string1));

JSONArray obj5 = new JSONArray()
.put("abc")
.put(2.0)
.put(new String(string2));

assertFalse("Should eval to false", obj1.similar(obj2));

assertTrue("Should eval to true", obj1.similar(obj3));
assertFalse("obj1-obj2 Should eval to false", obj1.similar(obj2));
assertTrue("obj1-obj3 Should eval to true", obj1.similar(obj3));
assertFalse("obj4-obj5 Should eval to false", obj4.similar(obj5));
}

/**
Expand Down
20 changes: 14 additions & 6 deletions src/test/java/org/json/junit/JSONObjectTest.java
Expand Up @@ -100,6 +100,7 @@ public class JSONObjectTest {
@Test
public void verifySimilar() {
final String string1 = "HasSameRef";
final String string2 = "HasDifferentRef";
JSONObject obj1 = new JSONObject()
.put("key1", "abc")
.put("key2", 2)
Expand All @@ -119,16 +120,23 @@ public void verifySimilar() {
.put("key1", "abc")
.put("key2", 2.0)
.put("key3", new String(string1));

assertFalse("Should eval to false", obj1.similar(obj2));

assertTrue("Should eval to true", obj1.similar(obj3));

assertTrue("Should eval to true", obj1.similar(obj4));
JSONObject obj5 = new JSONObject()
.put("key1", "abc")
.put("key2", 2.0)
.put("key3", new String(string2));

assertFalse("obj1-obj2 Should eval to false", obj1.similar(obj2));
assertTrue("obj1-obj3 Should eval to true", obj1.similar(obj3));
assertTrue("obj1-obj4 Should eval to true", obj1.similar(obj4));
assertFalse("obj1-obj5 Should eval to false", obj1.similar(obj5));
// verify that a double and big decimal are "similar"
assertTrue("should eval to true",new JSONObject().put("a",1.1d).similar(new JSONObject("{\"a\":1.1}")));

// Confirm #618 is fixed (compare should not exit early if similar numbers are found)
// Note that this test may not work if the JSONObject map entry order changes
JSONObject first = new JSONObject("{\"a\": 1, \"b\": 2, \"c\": 3}");
JSONObject second = new JSONObject("{\"a\": 1, \"b\": 2.0, \"c\": 4}");
assertFalse("first-second should eval to false", first.similar(second));
}

@Test
Expand Down

0 comments on commit c0e467c

Please sign in to comment.