/* * Copyright 2011, 2012 Odysseus Software GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.synapse.commons.staxon.core.json.stream.impl; import java.io.IOException; import java.io.StringReader; import java.io.StringWriter; import java.math.BigDecimal; import java.math.BigInteger; import org.junit.Assert; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import org.apache.synapse.commons.staxon.core.json.stream.JsonStreamSource; import org.apache.synapse.commons.staxon.core.json.stream.JsonStreamToken; import org.apache.synapse.commons.staxon.core.json.stream.util.StreamSourceDelegate; public class JsonStreamSourceImplTest { @Rule public final ExpectedException expectedException = ExpectedException.none(); void readInvalid(String input, Class<? extends Exception> exceptionClass, String exceptiondMessage) throws IOException { expectedException.expect(exceptionClass); expectedException.expectMessage(exceptiondMessage); StreamSourceDelegate source = new StreamSourceDelegate(new JsonStreamSourceImpl(new Yylex(new StringReader(input)), true)); try { source.copy(new JsonStreamTargetImpl(new StringWriter(), true)); } catch (Exception ex) { //empty } finally { source.close(); } } @Test public void testStringValue() throws IOException { StringReader reader = new StringReader("\"bob\""); JsonStreamSourceImpl source = new JsonStreamSourceImpl(new Yylex(reader), true); Assert.assertEquals(JsonStreamToken.VALUE, source.peek()); Assert.assertEquals("bob", source.value().text); Assert.assertEquals(JsonStreamToken.NONE, source.peek()); source.close(); } @Test public void testObjectValue() throws IOException { StringReader reader = new StringReader("{\"alice\":\"bob\"}"); JsonStreamSourceImpl source = new JsonStreamSourceImpl(new Yylex(reader), true); Assert.assertEquals(JsonStreamToken.START_OBJECT, source.peek()); source.startObject(); Assert.assertEquals(JsonStreamToken.NAME, source.peek()); Assert.assertEquals("alice", source.name()); Assert.assertEquals(JsonStreamToken.VALUE, source.peek()); Assert.assertEquals("bob", source.value().text); Assert.assertEquals(JsonStreamToken.END_OBJECT, source.peek()); source.endObject(); Assert.assertEquals(JsonStreamToken.NONE, source.peek()); source.close(); } @Test public void testArrayValue() throws IOException { StringReader reader = new StringReader("[\"bob\"]"); JsonStreamSourceImpl source = new JsonStreamSourceImpl(new Yylex(reader), true); Assert.assertEquals(JsonStreamToken.START_ARRAY, source.peek()); source.startArray(); Assert.assertEquals(JsonStreamToken.VALUE, source.peek()); Assert.assertEquals("bob", source.value().text); Assert.assertEquals(JsonStreamToken.END_ARRAY, source.peek()); source.endArray(); Assert.assertEquals(JsonStreamToken.NONE, source.peek()); source.close(); } @Test public void testArray1() throws IOException { StringReader reader = new StringReader("{\"alice\":[\"bob\"]}"); JsonStreamSourceImpl source = new JsonStreamSourceImpl(new Yylex(reader), true); Assert.assertEquals(JsonStreamToken.START_OBJECT, source.peek()); source.startObject(); Assert.assertEquals(JsonStreamToken.NAME, source.peek()); Assert.assertEquals("alice", source.name()); Assert.assertEquals(JsonStreamToken.START_ARRAY, source.peek()); source.startArray(); Assert.assertEquals(JsonStreamToken.VALUE, source.peek()); Assert.assertEquals("bob", source.value().text); Assert.assertEquals(JsonStreamToken.END_ARRAY, source.peek()); source.endArray(); Assert.assertEquals(JsonStreamToken.END_OBJECT, source.peek()); source.endObject(); Assert.assertEquals(JsonStreamToken.NONE, source.peek()); source.close(); } @Test public void testArray2() throws IOException { StringReader reader = new StringReader("{\"alice\":{\"bob\":[\"edgar\",\"charlie\"]}}"); JsonStreamSourceImpl source = new JsonStreamSourceImpl(new Yylex(reader), true); Assert.assertEquals(JsonStreamToken.START_OBJECT, source.peek()); source.startObject(); Assert.assertEquals(JsonStreamToken.NAME, source.peek()); Assert.assertEquals("alice", source.name()); Assert.assertEquals(JsonStreamToken.START_OBJECT, source.peek()); source.startObject(); Assert.assertEquals(JsonStreamToken.NAME, source.peek()); Assert.assertEquals("bob", source.name()); Assert.assertEquals(JsonStreamToken.START_ARRAY, source.peek()); source.startArray(); Assert.assertEquals(JsonStreamToken.VALUE, source.peek()); Assert.assertEquals("edgar", source.value().text); Assert.assertEquals(JsonStreamToken.VALUE, source.peek()); Assert.assertEquals("charlie", source.value().text); Assert.assertEquals(JsonStreamToken.END_ARRAY, source.peek()); source.endArray(); Assert.assertEquals(JsonStreamToken.END_OBJECT, source.peek()); source.endObject(); Assert.assertEquals(JsonStreamToken.END_OBJECT, source.peek()); source.endObject(); Assert.assertEquals(JsonStreamToken.NONE, source.peek()); source.close(); } @Test public void testArray3() throws IOException { StringReader reader = new StringReader("{\"alice\":{\"edgar\":[\"bob\"],\"charlie\":[\"bob\"]}}"); JsonStreamSourceImpl source = new JsonStreamSourceImpl(new Yylex(reader), true); Assert.assertEquals(JsonStreamToken.START_OBJECT, source.peek()); source.startObject(); Assert.assertEquals(JsonStreamToken.NAME, source.peek()); Assert.assertEquals("alice", source.name()); Assert.assertEquals(JsonStreamToken.START_OBJECT, source.peek()); source.startObject(); Assert.assertEquals(JsonStreamToken.NAME, source.peek()); Assert.assertEquals("edgar", source.name()); Assert.assertEquals(JsonStreamToken.START_ARRAY, source.peek()); source.startArray(); Assert.assertEquals(JsonStreamToken.VALUE, source.peek()); Assert.assertEquals("bob", source.value().text); Assert.assertEquals(JsonStreamToken.END_ARRAY, source.peek()); source.endArray(); Assert.assertEquals(JsonStreamToken.NAME, source.peek()); Assert.assertEquals("charlie", source.name()); Assert.assertEquals(JsonStreamToken.START_ARRAY, source.peek()); source.startArray(); Assert.assertEquals(JsonStreamToken.VALUE, source.peek()); Assert.assertEquals("bob", source.value().text); Assert.assertEquals(JsonStreamToken.END_ARRAY, source.peek()); source.endArray(); Assert.assertEquals(JsonStreamToken.END_OBJECT, source.peek()); source.endObject(); Assert.assertEquals(JsonStreamToken.END_OBJECT, source.peek()); source.endObject(); Assert.assertEquals(JsonStreamToken.NONE, source.peek()); source.close(); } @Test public void testString() throws IOException { StringReader reader = new StringReader("[\"\",\"abc\",\"\\b\\f\\n\\r\\t\",\"\\\"\",\"\\\\\",\"\\u001F\"]"); JsonStreamSourceImpl source = new JsonStreamSourceImpl(new Yylex(reader), true); Assert.assertEquals(JsonStreamToken.START_ARRAY, source.peek()); source.startArray(); Assert.assertEquals(JsonStreamToken.VALUE, source.peek()); Assert.assertEquals("", source.value().text); Assert.assertEquals(JsonStreamToken.VALUE, source.peek()); Assert.assertEquals("abc", source.value().text); Assert.assertEquals(JsonStreamToken.VALUE, source.peek()); Assert.assertEquals("\b\f\n\r\t", source.value().text); Assert.assertEquals(JsonStreamToken.VALUE, source.peek()); Assert.assertEquals("\"", source.value().text); Assert.assertEquals(JsonStreamToken.VALUE, source.peek()); Assert.assertEquals("\\", source.value().text); Assert.assertEquals(JsonStreamToken.VALUE, source.peek()); Assert.assertEquals("\u001F", source.value().text); Assert.assertEquals(JsonStreamToken.END_ARRAY, source.peek()); source.endArray(); Assert.assertEquals(JsonStreamToken.NONE, source.peek()); source.close(); } @Test public void testLiteralValues() throws IOException { StringReader reader = new StringReader("[true,false,null]"); JsonStreamSourceImpl source = new JsonStreamSourceImpl(new Yylex(reader), true); JsonStreamSource.Value value = null; Assert.assertEquals(JsonStreamToken.START_ARRAY, source.peek()); source.startArray(); Assert.assertEquals(JsonStreamToken.VALUE, source.peek()); value = source.value(); Assert.assertEquals("true", value.text); Assert.assertEquals(Boolean.TRUE, value.data); Assert.assertEquals(JsonStreamToken.VALUE, source.peek()); value = source.value(); Assert.assertEquals("false", value.text); Assert.assertEquals(Boolean.FALSE, value.data); Assert.assertEquals(JsonStreamToken.VALUE, source.peek()); value = source.value(); Assert.assertNull(value.text); Assert.assertNull(value.data); Assert.assertEquals(JsonStreamToken.END_ARRAY, source.peek()); source.endArray(); Assert.assertEquals(JsonStreamToken.NONE, source.peek()); source.close(); } @Test public void testNumberValues() throws IOException { StringReader reader = new StringReader("[123,12e3,12E3,12.3,1.2e3,1.2E3]"); JsonStreamSourceImpl source = new JsonStreamSourceImpl(new Yylex(reader), true); JsonStreamSource.Value value = null; Assert.assertEquals(JsonStreamToken.START_ARRAY, source.peek()); source.startArray(); Assert.assertEquals(JsonStreamToken.VALUE, source.peek()); value = source.value(); Assert.assertEquals("123", value.text); Assert.assertEquals(new BigInteger("123"), value.data); Assert.assertEquals(JsonStreamToken.VALUE, source.peek()); value = source.value(); Assert.assertEquals("12e3", value.text); Assert.assertEquals(new BigDecimal("12e3"), value.data); Assert.assertEquals(JsonStreamToken.VALUE, source.peek()); value = source.value(); Assert.assertEquals("12E3", value.text); Assert.assertEquals(new BigDecimal("12E3"), value.data); Assert.assertEquals(JsonStreamToken.VALUE, source.peek()); value = source.value(); Assert.assertEquals("12.3", value.text); Assert.assertEquals(new BigDecimal("12.3"), value.data); Assert.assertEquals(JsonStreamToken.VALUE, source.peek()); value = source.value(); Assert.assertEquals("1.2e3", value.text); Assert.assertEquals(new BigDecimal("1.2e3"), value.data); Assert.assertEquals(JsonStreamToken.VALUE, source.peek()); value = source.value(); Assert.assertEquals("1.2E3", value.text); Assert.assertEquals(new BigDecimal("1.2E3"), value.data); Assert.assertEquals(JsonStreamToken.END_ARRAY, source.peek()); source.endArray(); Assert.assertEquals(JsonStreamToken.NONE, source.peek()); source.close(); } @Test public void testWhitespace() throws IOException { StringReader reader = new StringReader("{\r \"alice\" : \"bob\"\r\n}"); JsonStreamSourceImpl source = new JsonStreamSourceImpl(new Yylex(reader), true); Assert.assertEquals(JsonStreamToken.START_OBJECT, source.peek()); source.startObject(); Assert.assertEquals(JsonStreamToken.NAME, source.peek()); Assert.assertEquals("alice", source.name()); Assert.assertEquals(JsonStreamToken.VALUE, source.peek()); Assert.assertEquals("bob", source.value().text); Assert.assertEquals(JsonStreamToken.END_OBJECT, source.peek()); source.endObject(); Assert.assertEquals(JsonStreamToken.NONE, source.peek()); source.close(); } @Test public void testLocation() throws IOException { String input = "{\n\t\"alice\" : {\n\t\t\"bob\" : [ \"charlie\" ],\n\t\t\"edgar\" : \"david\"\n\t}\n}"; // System.out.println(input); JsonStreamSourceImpl source = new JsonStreamSourceImpl(new Yylex(new StringReader(input)), true); Assert.assertEquals(1, source.getLineNumber()); Assert.assertEquals(1, source.getColumnNumber()); Assert.assertEquals(0, source.getCharacterOffset()); source.startObject(); Assert.assertEquals(1, source.getLineNumber()); Assert.assertEquals(1, source.getColumnNumber()); Assert.assertEquals(0, source.getCharacterOffset()); source.name(); Assert.assertEquals(2, source.getLineNumber()); Assert.assertEquals(8, source.getColumnNumber()); Assert.assertEquals(9, source.getCharacterOffset()); source.startObject(); Assert.assertEquals(2, source.getLineNumber()); Assert.assertEquals(12, source.getColumnNumber()); Assert.assertEquals(13, source.getCharacterOffset()); source.name(); Assert.assertEquals(3, source.getLineNumber()); Assert.assertEquals(7, source.getColumnNumber()); Assert.assertEquals(21, source.getCharacterOffset()); source.startArray(); Assert.assertEquals(3, source.getLineNumber()); Assert.assertEquals(11, source.getColumnNumber()); Assert.assertEquals(25, source.getCharacterOffset()); source.value(); Assert.assertEquals(3, source.getLineNumber()); Assert.assertEquals(21, source.getColumnNumber()); Assert.assertEquals(35, source.getCharacterOffset()); source.endArray(); Assert.assertEquals(3, source.getLineNumber()); Assert.assertEquals(23, source.getColumnNumber()); Assert.assertEquals(37, source.getCharacterOffset()); source.name(); Assert.assertEquals(4, source.getLineNumber()); Assert.assertEquals(9, source.getColumnNumber()); Assert.assertEquals(48, source.getCharacterOffset()); source.value(); Assert.assertEquals(4, source.getLineNumber()); Assert.assertEquals(19, source.getColumnNumber()); Assert.assertEquals(58, source.getCharacterOffset()); source.endObject(); Assert.assertEquals(5, source.getLineNumber()); Assert.assertEquals(2, source.getColumnNumber()); Assert.assertEquals(61, source.getCharacterOffset()); source.endObject(); Assert.assertEquals(6, source.getLineNumber()); Assert.assertEquals(1, source.getColumnNumber()); Assert.assertEquals(63, source.getCharacterOffset()); source.close(); } @Test public void testInvalid_UnclosedArray() throws IOException { readInvalid("{\"alice\":[\"bob\"}}", IOException.class, "Unclosed array"); } @Test public void testInvalid_UnclosedArray2() throws IOException { readInvalid("[\"edgar\",\"david\"}", IOException.class, "Unclosed array"); } @Test public void testInvalid_NotInAnArray() throws IOException { readInvalid("{\"alice\":\"bob\"]", IOException.class, "Not in an array"); } @Test public void testInvalid_NotInAnArray2() throws IOException { readInvalid("{\"alice\":[\"bob\"]]", IOException.class, "Not in an array"); } @Test public void testInvalid_NotInAnObject() throws IOException { readInvalid("{\"alice\":\"bob\"}}", IOException.class, "Not in an object"); } @Test public void testInvalid_UnexpectedSymbol() throws IOException { readInvalid("{\"alice\":{\"bob\":\"charlie\"}:}", IOException.class, "Unexpected symbol: COLON"); } @Test public void testInvalid_UnexpectedSymbol2() throws IOException { readInvalid("\"alice\":\"bob\"", IOException.class, "Unexpected symbol: COLON"); } @Test public void testInvalid_PrematureEOF() throws IOException { readInvalid("[\"edgar\",\"david\"", IOException.class, "Premature EOF"); } }