Package de.odysseus.staxon.json.stream.impl

Source Code of de.odysseus.staxon.json.stream.impl.JsonStreamSourceImplTest

/*
* 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 de.odysseus.staxon.json.stream.impl;

import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import java.math.BigDecimal;
import java.math.BigInteger;

import junit.framework.Assert;

import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;

import de.odysseus.staxon.json.stream.JsonStreamSource;
import de.odysseus.staxon.json.stream.JsonStreamToken;
import de.odysseus.staxon.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));
    } 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");
  }
}
TOP

Related Classes of de.odysseus.staxon.json.stream.impl.JsonStreamSourceImplTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.