From f1c9d0787b3aab056574cb1a9f528b6a5b85c67e Mon Sep 17 00:00:00 2001 From: Simulant Date: Sat, 23 Mar 2024 21:49:58 +0100 Subject: [PATCH] add test cases for extended syntax error exception messages --- src/main/java/org/json/JSONTokener.java | 6 ++- .../java/org/json/junit/JSONObjectTest.java | 54 +++++++++++++++++++ 2 files changed, 58 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/json/JSONTokener.java b/src/main/java/org/json/JSONTokener.java index 51110e1..b8808bb 100644 --- a/src/main/java/org/json/JSONTokener.java +++ b/src/main/java/org/json/JSONTokener.java @@ -320,10 +320,12 @@ public class JSONTokener { sb.append('\r'); break; case 'u': + String next = this.next(4); try { - sb.append((char)Integer.parseInt(this.next(4), 16)); + sb.append((char)Integer.parseInt(next, 16)); } catch (NumberFormatException e) { - throw this.syntaxError("Illegal escape. \\u must be followed by a 4 digit number.", e); + throw this.syntaxError("Illegal escape. " + + "\\u must be followed by a 4 digit hexadecimal number. \\" + next + " is not valid.", e); } break; case '"': diff --git a/src/test/java/org/json/junit/JSONObjectTest.java b/src/test/java/org/json/junit/JSONObjectTest.java index fac8c53..a8b25eb 100644 --- a/src/test/java/org/json/junit/JSONObjectTest.java +++ b/src/test/java/org/json/junit/JSONObjectTest.java @@ -2193,6 +2193,60 @@ public class JSONObjectTest { } } + @Test + public void jsonObjectParseControlCharacterEOFAssertExceptionMessage(){ + char c = '\0'; + final String source = "{\"key\":\"" + c + "\"}"; + try { + JSONObject jo = new JSONObject(source); + fail("JSONException should be thrown"); + } catch (JSONException ex) { + assertEquals("Unterminated string. " + "Character with int code 0" + + " is not allowed within a quoted string. at 8 [character 9 line 1]", ex.getMessage()); + } + } + + @Test + public void jsonObjectParseControlCharacterNewLineAssertExceptionMessage(){ + char[] chars = {'\n', '\r'}; + for( char c : chars) { + final String source = "{\"key\":\"" + c + "\"}"; + try { + JSONObject jo = new JSONObject(source); + fail("JSONException should be thrown"); + } catch (JSONException ex) { + assertEquals("Unterminated string. " + "Character with int code " + (int) c + + " is not allowed within a quoted string. at 9 [character 0 line 2]", ex.getMessage()); + } + } + } + + @Test + public void jsonObjectParseUTF8EncodingAssertExceptionMessage(){ + String c = "\\u123x"; + final String source = "{\"key\":\"" + c + "\"}"; + try { + JSONObject jo = new JSONObject(source); + fail("JSONException should be thrown"); + } catch (JSONException ex) { + assertEquals("Illegal escape. \\u must be followed by a 4 digit hexadecimal number. " + + "\\123x is not valid. at 14 [character 15 line 1]", ex.getMessage()); + } + } + + @Test + public void jsonObjectParseIllegalEscapeAssertExceptionMessage(){ + String c = "\\x"; + final String source = "{\"key\":\"" + c + "\"}"; + try { + JSONObject jo = new JSONObject(source); + fail("JSONException should be thrown"); + } catch (JSONException ex) { + assertEquals("Illegal escape. Escape sequence " + c + " is not valid." + + " at 10 [character 11 line 1]", ex.getMessage()); + } + } + /** * Explore how JSONObject handles parsing errors. */