// Copyright 2013 Michel Kraemer // // 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.undercouch.citeproc.helper.json; import static org.junit.Assert.assertEquals; import java.io.IOException; import java.io.StringReader; import org.junit.Test; import de.undercouch.citeproc.helper.json.JsonLexer.Type; /** * Tests the {@link JsonLexer} * @author Michel Kraemer */ public class JsonLexerTest { /** * Tests if a simple object consisting of several name-value pairs * can be read * @throws IOException if the test failed */ @Test public void simpleObject() throws IOException { String obj = "{\"name\":\"value\",\"int\":1302,\"float\":1.57," + "\"negint\":-5,\"negfloat\":-1.57,\"floatexp\":-1.5e7}"; JsonLexer p = new JsonLexer(new StringReader(obj)); Type t = p.readNextToken(); assertEquals(Type.START_OBJECT, t); t = p.readNextToken(); assertEquals(Type.STRING, t); String name = p.readString(); assertEquals("name", name); t = p.readNextToken(); assertEquals(Type.COLON, t); t = p.readNextToken(); assertEquals(Type.STRING, t); String value = p.readString(); assertEquals("value", value); t = p.readNextToken(); assertEquals(Type.COMMA, t); t = p.readNextToken(); assertEquals(Type.STRING, t); name = p.readString(); assertEquals("int", name); t = p.readNextToken(); assertEquals(Type.COLON, t); t = p.readNextToken(); assertEquals(Type.NUMBER, t); int i = p.readNumber().intValue(); assertEquals(1302, i); t = p.readNextToken(); assertEquals(Type.COMMA, t); t = p.readNextToken(); assertEquals(Type.STRING, t); name = p.readString(); assertEquals("float", name); t = p.readNextToken(); assertEquals(Type.COLON, t); t = p.readNextToken(); assertEquals(Type.NUMBER, t); float f = p.readNumber().floatValue(); assertEquals(1.57f, f, 0.0); t = p.readNextToken(); assertEquals(Type.COMMA, t); t = p.readNextToken(); assertEquals(Type.STRING, t); name = p.readString(); assertEquals("negint", name); t = p.readNextToken(); assertEquals(Type.COLON, t); t = p.readNextToken(); assertEquals(Type.NUMBER, t); i = p.readNumber().intValue(); assertEquals(-5, i); t = p.readNextToken(); assertEquals(Type.COMMA, t); t = p.readNextToken(); assertEquals(Type.STRING, t); name = p.readString(); assertEquals("negfloat", name); t = p.readNextToken(); assertEquals(Type.COLON, t); t = p.readNextToken(); assertEquals(Type.NUMBER, t); f = p.readNumber().floatValue(); assertEquals(-1.57f, f, 0.0); t = p.readNextToken(); assertEquals(Type.COMMA, t); t = p.readNextToken(); assertEquals(Type.STRING, t); name = p.readString(); assertEquals("floatexp", name); t = p.readNextToken(); assertEquals(Type.COLON, t); t = p.readNextToken(); assertEquals(Type.NUMBER, t); f = p.readNumber().floatValue(); assertEquals(-1.5e7, f, 0.0); t = p.readNextToken(); assertEquals(Type.END_OBJECT, t); } /** * Tests if a unicode string can be read * @throws IOException if the test failed */ @Test public void unicode() throws IOException { String obj = "{\"name\":\"Michel Kr\\u00E4mer\"}"; JsonLexer p = new JsonLexer(new StringReader(obj)); Type t = p.readNextToken(); assertEquals(Type.START_OBJECT, t); t = p.readNextToken(); assertEquals(Type.STRING, t); String name = p.readString(); assertEquals("name", name); t = p.readNextToken(); assertEquals(Type.COLON, t); t = p.readNextToken(); assertEquals(Type.STRING, t); String value = p.readString(); assertEquals("Michel Kr\u00E4mer", value); t = p.readNextToken(); assertEquals(Type.END_OBJECT, t); } /** * Tests if embedded objects and embedded arrays can be read * @throws IOException if the test failed */ @Test public void embedded() throws IOException { String obj = "{\"authors\":[\"Ted\", \"Mark\"],\"date\": {\"year\":2013,\"month\":9}}"; JsonLexer p = new JsonLexer(new StringReader(obj)); Type t = p.readNextToken(); assertEquals(Type.START_OBJECT, t); t = p.readNextToken(); assertEquals(Type.STRING, t); String name = p.readString(); assertEquals("authors", name); t = p.readNextToken(); assertEquals(Type.COLON, t); t = p.readNextToken(); assertEquals(Type.START_ARRAY, t); t = p.readNextToken(); assertEquals(Type.STRING, t); String value = p.readString(); assertEquals("Ted", value); t = p.readNextToken(); assertEquals(Type.COMMA, t); t = p.readNextToken(); assertEquals(Type.STRING, t); value = p.readString(); assertEquals("Mark", value); t = p.readNextToken(); assertEquals(Type.END_ARRAY, t); t = p.readNextToken(); assertEquals(Type.COMMA, t); t = p.readNextToken(); assertEquals(Type.STRING, t); value = p.readString(); assertEquals("date", value); t = p.readNextToken(); assertEquals(Type.COLON, t); t = p.readNextToken(); assertEquals(Type.START_OBJECT, t); t = p.readNextToken(); assertEquals(Type.STRING, t); value = p.readString(); assertEquals("year", value); t = p.readNextToken(); assertEquals(Type.COLON, t); t = p.readNextToken(); assertEquals(Type.NUMBER, t); int i = p.readNumber().intValue(); assertEquals(2013, i); t = p.readNextToken(); assertEquals(Type.COMMA, t); t = p.readNextToken(); assertEquals(Type.STRING, t); value = p.readString(); assertEquals("month", value); t = p.readNextToken(); assertEquals(Type.COLON, t); t = p.readNextToken(); assertEquals(Type.NUMBER, t); i = p.readNumber().intValue(); assertEquals(9, i); t = p.readNextToken(); assertEquals(Type.END_OBJECT, t); t = p.readNextToken(); assertEquals(Type.END_OBJECT, t); } /** * Tests if a string with a slash can be read * @throws IOException if the test failed */ @Test public void slash() throws IOException { String obj = "{\"name\":\"Michel\\/Kraemer\"}"; JsonLexer p = new JsonLexer(new StringReader(obj)); Type t = p.readNextToken(); assertEquals(Type.START_OBJECT, t); t = p.readNextToken(); assertEquals(Type.STRING, t); String name = p.readString(); assertEquals("name", name); t = p.readNextToken(); assertEquals(Type.COLON, t); t = p.readNextToken(); assertEquals(Type.STRING, t); String value = p.readString(); assertEquals("Michel/Kraemer", value); t = p.readNextToken(); assertEquals(Type.END_OBJECT, t); } }