| package main; |
| |
| import org.codehaus.jackson.*; |
| |
| /** |
| * Set of basic unit tests for verifying that the basic parser |
| * functionality works as expected. |
| */ |
| public class TestCharEscaping |
| extends BaseTest |
| { |
| public void testMissingEscaping() |
| throws Exception |
| { |
| // Invalid: control chars, including lf, must be escaped |
| final String DOC = "[" |
| +"\"Linefeed: \n.\"" |
| +"]"; |
| JsonParser jp = createParserUsingReader(DOC); |
| assertToken(JsonToken.START_ARRAY, jp.nextToken()); |
| try { |
| // This may or may not trigger exception |
| JsonToken t = jp.nextToken(); |
| assertToken(JsonToken.VALUE_STRING, t); |
| // and if not, should get it here: |
| jp.getText(); |
| fail("Expected an exception for un-escaped linefeed in string value"); |
| } catch (JsonParseException jex) { |
| verifyException(jex, "has to be escaped"); |
| } |
| } |
| |
| public void testSimpleEscaping() |
| throws Exception |
| { |
| String DOC = "[" |
| +"\"LF=\\n\"" |
| +"]"; |
| |
| JsonParser jp = createParserUsingReader(DOC); |
| assertToken(JsonToken.START_ARRAY, jp.nextToken()); |
| assertToken(JsonToken.VALUE_STRING, jp.nextToken()); |
| assertEquals("LF=\n", jp.getText()); |
| jp.close(); |
| |
| |
| /* Note: must split Strings, so that javac won't try to handle |
| * escape and inline null char |
| */ |
| DOC = "[\"NULL:\\u0000!\"]"; |
| |
| jp = createParserUsingReader(DOC); |
| assertToken(JsonToken.START_ARRAY, jp.nextToken()); |
| assertToken(JsonToken.VALUE_STRING, jp.nextToken()); |
| assertEquals("NULL:\0!", jp.getText()); |
| |
| // Then just a single char escaping |
| jp = createParserUsingReader("[\"\\u0123\"]"); |
| assertToken(JsonToken.START_ARRAY, jp.nextToken()); |
| assertToken(JsonToken.VALUE_STRING, jp.nextToken()); |
| assertEquals("\u0123", jp.getText()); |
| |
| // And then double sequence |
| jp = createParserUsingReader("[\"\\u0041\\u0043\"]"); |
| assertToken(JsonToken.START_ARRAY, jp.nextToken()); |
| assertToken(JsonToken.VALUE_STRING, jp.nextToken()); |
| assertEquals("AC", jp.getText()); |
| } |
| |
| public void testInvalid() |
| throws Exception |
| { |
| // 2-char sequences not allowed: |
| String DOC = "[\"\\u41=A\"]"; |
| JsonParser jp = createParserUsingReader(DOC); |
| assertToken(JsonToken.START_ARRAY, jp.nextToken()); |
| try { |
| jp.nextToken(); |
| jp.getText(); |
| fail("Expected an exception for unclosed ARRAY"); |
| } catch (JsonParseException jpe) { |
| verifyException(jpe, "for character escape"); |
| } |
| } |
| |
| /** |
| * Test to verify that decoder does not allow 8-digit escapes |
| * (non-BMP characters must be escaped using two 4-digit sequences) |
| */ |
| public void test8DigitSequence() |
| throws Exception |
| { |
| String DOC = "[\"\\u00411234\"]"; |
| JsonParser jp = createParserUsingReader(DOC); |
| assertToken(JsonToken.START_ARRAY, jp.nextToken()); |
| assertToken(JsonToken.VALUE_STRING, jp.nextToken()); |
| assertEquals("A1234", jp.getText()); |
| } |
| } |
| |