Visitar URL original
20260719 prep for next release by stleary · Pull Request #1069 · stleary/JSON-java · GitHub
Skip to content
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
pre-release-20260719 oops forgot to update new unit tests for strict …
…mode
  • Loading branch information
Sean Leary Sean Leary
Sean Leary authored and Sean Leary committed Jul 19, 2026
commit da757c6656a84fe87cb4442f16153b3efe2ccaf3
87 changes: 57 additions & 30 deletions src/test/java/org/json/junit/JSONObjectTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -3885,6 +3885,7 @@ public void jsonObjectParseFromJson_9() {

@Test
public void testMaxNumberLength() {
JSONParserConfiguration jsonParserConfiguration = new JSONParserConfiguration();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 100; ++i) {
sb.append("9999999999");
Expand All @@ -3896,23 +3897,29 @@ public void testMaxNumberLength() {
// JSONArray with number just under the max length limit
checkJSONArrayMaxLen(sb.toString(), true, null);

// JSONObject with number just over the max length limit
checkJSONObjectMaxLen(sb + "9", false, null);
// numbers without quotes are not allowed in strict mode
if (!jsonParserConfiguration.isStrictMode()) {
// JSONObject with number just over the max length limit
checkJSONObjectMaxLen(sb + "9", false, null);

// JSONArray with number just over the max length limit
checkJSONArrayMaxLen(sb + "9", false, null);
// JSONArray with number just over the max length limit
checkJSONArrayMaxLen(sb + "9", false, null);
}

// JSONObject with number at config max length limit
checkJSONObjectMaxLen(sb.toString() + sb.toString(), true, new JSONParserConfiguration().withMaxNumberLength(2000));

// JSONArray with number at config max length limit
checkJSONArrayMaxLen((sb.toString() + sb), true, new JSONParserConfiguration().withMaxNumberLength(2000));

// JSONObject with number just over config max length limit
checkJSONObjectMaxLen(sb.toString() + sb.toString() + "9", false, new JSONParserConfiguration().withMaxNumberLength(2000));
// numbers without quotes are not allowed in strict mode
if (!jsonParserConfiguration.isStrictMode()) {
// JSONObject with number just over config max length limit
checkJSONObjectMaxLen(sb.toString() + sb.toString() + "9", false, new JSONParserConfiguration().withMaxNumberLength(2000));

// JSONArray with number just over config max length limit
checkJSONArrayMaxLen((sb.toString() + sb + "9"), false, new JSONParserConfiguration().withMaxNumberLength(2000));
// JSONArray with number just over config max length limit
checkJSONArrayMaxLen((sb.toString() + sb + "9"), false, new JSONParserConfiguration().withMaxNumberLength(2000));
}

// JSONObject with large number, no checks
checkJSONObjectMaxLen(sb.toString() + sb.toString() + "9", true,
Expand Down Expand Up @@ -3975,6 +3982,8 @@ private static void checkJSONArrayMaxLen(String s, boolean isValid, JSONParserCo
*/
@Test
public void testMaxNumberLengthNegativeInteger() {
JSONParserConfiguration jsonParserConfiguration = new JSONParserConfiguration();

// Build a negative number string of exactly 1000 chars: "-" + 999 digits
StringBuilder sb = new StringBuilder("-");
for (int i = 0; i < 999; ++i) {
Expand All @@ -3985,17 +3994,22 @@ public void testMaxNumberLengthNegativeInteger() {
// at max length: parsed as number
checkJSONObjectMaxLen(sb.toString(), true, null);

// over max length: returned as string
sb.append("1");
assertEquals(1001, sb.length());
checkJSONObjectMaxLen(sb.toString(), false, null);
// numbers without quotes are not allowed in strict mode
if (!jsonParserConfiguration.isStrictMode()) {
// over max length: returned as string
sb.append("1");
assertEquals(1001, sb.length());
checkJSONObjectMaxLen(sb.toString(), false, null);
}
}

/**
* Test max number length for decimal notation strings via stringToValue.
*/
@Test
public void testMaxNumberLengthDecimal() {
JSONParserConfiguration jsonParserConfiguration = new JSONParserConfiguration();

// Build a decimal number string of exactly 1000 chars: 499 digits + "." + 500
// digits
StringBuilder sb = new StringBuilder();
Expand All @@ -4011,17 +4025,22 @@ public void testMaxNumberLengthDecimal() {
// at max length: parsed as number (BigDecimal)
checkJSONObjectMaxLen(sb.toString(), true, null);

// over max length: returned as string
sb.append("3");
assertEquals(1001, sb.length());
checkJSONObjectMaxLen(sb.toString(), false, null);
// numbers without quotes are not allowed in strict mode
if (!jsonParserConfiguration.isStrictMode()) {
// over max length: returned as string
sb.append("3");
assertEquals(1001, sb.length());
checkJSONObjectMaxLen(sb.toString(), false, null);
}
}

/**
* Test max number length with scientific notation via stringToValue.
*/
@Test
public void testMaxNumberLengthScientificNotation() {
JSONParserConfiguration jsonParserConfiguration = new JSONParserConfiguration();

// Build a scientific notation string of exactly 1000 chars
StringBuilder sb = new StringBuilder("1.");
for (int i = 0; i < 994; ++i) {
Expand All @@ -4038,9 +4057,13 @@ public void testMaxNumberLengthScientificNotation() {
for (int i = 0; i < 995; ++i) {
sb.append("0");
}
sb.append("e100");
assertEquals(1001, sb.length());
checkJSONObjectMaxLen(sb.toString(), false, null);

// numbers without quotes are not allowed in strict mode
if (!jsonParserConfiguration.isStrictMode()) {
sb.append("e100");
assertEquals(1001, sb.length());
checkJSONObjectMaxLen(sb.toString(), false, null);
}
}

/**
Expand Down Expand Up @@ -4297,17 +4320,21 @@ public void testStringToValueViaJSONObject() {
*/
@Test
public void testStringToNumberInvalidFormats() {
// Leading zero followed by digit → treated as string (not octal)
JSONObject jo = new JSONObject("{\"a\": 01}");
// JSONTokener with strict mode would reject, but default mode stores as string
// since stringToNumber throws NumberFormatException for "01"
Object val = jo.get("a");
assertTrue("01 should be stored as string, got " + val.getClass(), val instanceof String);

// Negative with leading zero → "-01"
jo = new JSONObject("{\"a\": -01}");
val = jo.get("a");
assertTrue("-01 should be stored as string, got " + val.getClass(), val instanceof String);
// this test should only run in non-strict mode, otherwise it will throw an exception
JSONParserConfiguration jsonParserConfiguration = new JSONParserConfiguration();
if (!jsonParserConfiguration.isStrictMode()) {
// Leading zero followed by digit → treated as string (not octal)
JSONObject jo = new JSONObject("{\"a\": 01}");
// JSONTokener with strict mode would reject, but default mode stores as string
// since stringToNumber throws NumberFormatException for "01"
Object val = jo.get("a");
assertTrue("01 should be stored as string, got " + val.getClass(), val instanceof String);

// Negative with leading zero → "-01"
jo = new JSONObject("{\"a\": -01}");
val = jo.get("a");
assertTrue("-01 should be stored as string, got " + val.getClass(), val instanceof String);
}
}

}
Loading