/* * Copyright (c) 2008-2014 MongoDB, Inc. * * 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.bson.json; import org.bson.BsonRegularExpression; import org.junit.Test; import static org.junit.Assert.assertEquals; public class JsonScannerTest { @Test public void testEndOfFile() { String json = "\t "; JsonBuffer buffer = new JsonBuffer(json); JsonScanner scanner = new JsonScanner(buffer); JsonToken token = scanner.nextToken(); assertEquals(JsonTokenType.END_OF_FILE, token.getType()); assertEquals("<eof>", token.getValue()); } @Test public void testBeginObject() { String json = "\t {x"; JsonBuffer buffer = new JsonBuffer(json); JsonScanner scanner = new JsonScanner(buffer); JsonToken token = scanner.nextToken(); assertEquals(JsonTokenType.BEGIN_OBJECT, token.getType()); assertEquals("{", token.getValue()); assertEquals('x', buffer.read()); } @Test public void testEndObject() { String json = "\t }x"; JsonBuffer buffer = new JsonBuffer(json); JsonScanner scanner = new JsonScanner(buffer); JsonToken token = scanner.nextToken(); assertEquals(JsonTokenType.END_OBJECT, token.getType()); assertEquals("}", token.getValue()); assertEquals('x', buffer.read()); } @Test public void testBeginArray() { String json = "\t [x"; JsonBuffer buffer = new JsonBuffer(json); JsonScanner scanner = new JsonScanner(buffer); JsonToken token = scanner.nextToken(); assertEquals(JsonTokenType.BEGIN_ARRAY, token.getType()); assertEquals("[", token.getValue()); assertEquals('x', buffer.read()); } @Test public void testEndArray() { String json = "\t ]x"; JsonBuffer buffer = new JsonBuffer(json); JsonScanner scanner = new JsonScanner(buffer); JsonToken token = scanner.nextToken(); assertEquals(JsonTokenType.END_ARRAY, token.getType()); assertEquals("]", token.getValue()); assertEquals('x', buffer.read()); } @Test public void testParentheses() { String json = "\t (jj)x"; JsonBuffer buffer = new JsonBuffer(json); JsonScanner scanner = new JsonScanner(buffer); JsonToken token = scanner.nextToken(); assertEquals(JsonTokenType.LEFT_PAREN, token.getType()); assertEquals("(", token.getValue()); token = scanner.nextToken(); token = scanner.nextToken(); assertEquals(JsonTokenType.RIGHT_PAREN, token.getType()); assertEquals('x', buffer.read()); } @Test public void testNameSeparator() { String json = "\t :x"; JsonBuffer buffer = new JsonBuffer(json); JsonScanner scanner = new JsonScanner(buffer); JsonToken token = scanner.nextToken(); assertEquals(JsonTokenType.COLON, token.getType()); assertEquals(":", token.getValue()); assertEquals('x', buffer.read()); } @Test public void testValueSeparator() { String json = "\t ,x"; JsonBuffer buffer = new JsonBuffer(json); JsonScanner scanner = new JsonScanner(buffer); JsonToken token = scanner.nextToken(); assertEquals(JsonTokenType.COMMA, token.getType()); assertEquals(",", token.getValue()); assertEquals('x', buffer.read()); } @Test public void testEmptyString() { String json = "\t \"\"x"; JsonBuffer buffer = new JsonBuffer(json); JsonScanner scanner = new JsonScanner(buffer); JsonToken token = scanner.nextToken(); assertEquals(JsonTokenType.STRING, token.getType()); assertEquals("", token.getValue()); assertEquals('x', buffer.read()); } @Test public void test1CharacterString() { String json = "\t \"1\"x"; JsonBuffer buffer = new JsonBuffer(json); JsonScanner scanner = new JsonScanner(buffer); JsonToken token = scanner.nextToken(); assertEquals(JsonTokenType.STRING, token.getType()); assertEquals("1", token.getValue()); assertEquals('x', buffer.read()); } @Test public void test2CharacterString() { String json = "\t \"12\"x"; JsonBuffer buffer = new JsonBuffer(json); JsonScanner scanner = new JsonScanner(buffer); JsonToken token = scanner.nextToken(); assertEquals(JsonTokenType.STRING, token.getType()); assertEquals("12", token.getValue()); assertEquals('x', buffer.read()); } @Test public void test3CharacterString() { String json = "\t \"123\"x"; JsonBuffer buffer = new JsonBuffer(json); JsonScanner scanner = new JsonScanner(buffer); JsonToken token = scanner.nextToken(); assertEquals(JsonTokenType.STRING, token.getType()); assertEquals("123", token.getValue()); assertEquals('x', buffer.read()); } @Test public void testEscapeSequences() { String json = "\t \"x\\\"\\\\\\/\\b\\f\\n\\r\\t\\u0030y\"x"; JsonBuffer buffer = new JsonBuffer(json); JsonScanner scanner = new JsonScanner(buffer); JsonToken token = scanner.nextToken(); assertEquals(JsonTokenType.STRING, token.getType()); assertEquals("x\"\\/\b\f\n\r\t0y", token.getValue()); assertEquals('x', buffer.read()); } @Test public void testTrue() { String json = "\t true,"; JsonBuffer buffer = new JsonBuffer(json); JsonScanner scanner = new JsonScanner(buffer); JsonToken token = scanner.nextToken(); assertEquals(JsonTokenType.UNQUOTED_STRING, token.getType()); assertEquals("true", token.getValue()); assertEquals(',', buffer.read()); } @Test public void testMinusInfinity() { String json = "\t -Infinity]"; JsonBuffer buffer = new JsonBuffer(json); JsonScanner scanner = new JsonScanner(buffer); JsonToken token = scanner.nextToken(); assertEquals(JsonTokenType.DOUBLE, token.getType()); assertEquals(Double.NEGATIVE_INFINITY, token.getValue()); assertEquals(']', buffer.read()); } @Test public void testFalse() { String json = "\t false,"; JsonBuffer buffer = new JsonBuffer(json); JsonScanner scanner = new JsonScanner(buffer); JsonToken token = scanner.nextToken(); assertEquals(JsonTokenType.UNQUOTED_STRING, token.getType()); assertEquals("false", token.getValue()); assertEquals(',', buffer.read()); } @Test public void testNull() { String json = "\t null,"; JsonBuffer buffer = new JsonBuffer(json); JsonScanner scanner = new JsonScanner(buffer); JsonToken token = scanner.nextToken(); assertEquals(JsonTokenType.UNQUOTED_STRING, token.getType()); assertEquals("null", token.getValue()); assertEquals(',', buffer.read()); } @Test public void testUndefined() { String json = "\t undefined,"; JsonBuffer buffer = new JsonBuffer(json); JsonScanner scanner = new JsonScanner(buffer); JsonToken token = scanner.nextToken(); assertEquals(JsonTokenType.UNQUOTED_STRING, token.getType()); assertEquals("undefined", token.getValue()); assertEquals(',', buffer.read()); } @Test public void testUnquotedStringWithSeparator() { String json = "\t name123:1"; JsonBuffer buffer = new JsonBuffer(json); JsonScanner scanner = new JsonScanner(buffer); JsonToken token = scanner.nextToken(); assertEquals(JsonTokenType.UNQUOTED_STRING, token.getType()); assertEquals("name123", token.getValue()); assertEquals(':', buffer.read()); } @Test public void testUnquotedString() { String json = "name123"; JsonBuffer buffer = new JsonBuffer(json); JsonScanner scanner = new JsonScanner(buffer); JsonToken token = scanner.nextToken(); assertEquals(JsonTokenType.UNQUOTED_STRING, token.getType()); assertEquals("name123", token.getValue()); assertEquals(-1, buffer.read()); } @Test public void testZero() { String json = "\t 0,"; JsonBuffer buffer = new JsonBuffer(json); JsonScanner scanner = new JsonScanner(buffer); JsonToken token = scanner.nextToken(); assertEquals(JsonTokenType.INT32, token.getType()); assertEquals(0, token.getValue()); assertEquals(',', buffer.read()); } @Test public void testMinusZero() { String json = "\t -0,"; JsonBuffer buffer = new JsonBuffer(json); JsonScanner scanner = new JsonScanner(buffer); JsonToken token = scanner.nextToken(); assertEquals(JsonTokenType.INT32, token.getType()); assertEquals(-0, token.getValue()); assertEquals(',', buffer.read()); } @Test public void testOne() { String json = "\t 1,"; JsonBuffer buffer = new JsonBuffer(json); JsonScanner scanner = new JsonScanner(buffer); JsonToken token = scanner.nextToken(); assertEquals(JsonTokenType.INT32, token.getType()); assertEquals(1, token.getValue()); assertEquals(',', buffer.read()); } @Test public void testMinusOne() { String json = "\t -1,"; JsonBuffer buffer = new JsonBuffer(json); JsonScanner scanner = new JsonScanner(buffer); JsonToken token = scanner.nextToken(); assertEquals(JsonTokenType.INT32, token.getType()); assertEquals(-1, token.getValue()); assertEquals(',', buffer.read()); } @Test public void testTwelve() { String json = "\t 12,"; JsonBuffer buffer = new JsonBuffer(json); JsonScanner scanner = new JsonScanner(buffer); JsonToken token = scanner.nextToken(); assertEquals(JsonTokenType.INT32, token.getType()); assertEquals(12, token.getValue()); assertEquals(',', buffer.read()); } @Test public void testMinusTwelve() { String json = "\t -12,"; JsonBuffer buffer = new JsonBuffer(json); JsonScanner scanner = new JsonScanner(buffer); JsonToken token = scanner.nextToken(); assertEquals(JsonTokenType.INT32, token.getType()); assertEquals(-12, token.getValue()); assertEquals(',', buffer.read()); } @Test public void testZeroPointZero() { String json = "\t 0.0,"; JsonBuffer buffer = new JsonBuffer(json); JsonScanner scanner = new JsonScanner(buffer); JsonToken token = scanner.nextToken(); assertEquals(JsonTokenType.DOUBLE, token.getType()); assertEquals(0.0, token.getValue()); assertEquals(',', buffer.read()); } @Test public void testMinusZeroPointZero() { String json = "\t -0.0,"; JsonBuffer buffer = new JsonBuffer(json); JsonScanner scanner = new JsonScanner(buffer); JsonToken token = scanner.nextToken(); assertEquals(JsonTokenType.DOUBLE, token.getType()); assertEquals(-0.0, token.getValue()); assertEquals(',', buffer.read()); } @Test public void testZeroExponentOne() { String json = "\t 0e1,"; JsonBuffer buffer = new JsonBuffer(json); JsonScanner scanner = new JsonScanner(buffer); JsonToken token = scanner.nextToken(); assertEquals(JsonTokenType.DOUBLE, token.getType()); assertEquals(0e1, token.getValue()); assertEquals(',', buffer.read()); } @Test public void testMinusZeroExponentOne() { String json = "\t -0e1,"; JsonBuffer buffer = new JsonBuffer(json); JsonScanner scanner = new JsonScanner(buffer); JsonToken token = scanner.nextToken(); assertEquals(JsonTokenType.DOUBLE, token.getType()); assertEquals(-0e1, token.getValue()); assertEquals(',', buffer.read()); } @Test public void testZeroExponentMinusOne() { String json = "\t 0e-1,"; JsonBuffer buffer = new JsonBuffer(json); JsonScanner scanner = new JsonScanner(buffer); JsonToken token = scanner.nextToken(); assertEquals(JsonTokenType.DOUBLE, token.getType()); assertEquals(0e-1, token.getValue()); assertEquals(',', buffer.read()); } @Test public void testMinusZeroExponentMinusOne() { String json = "\t -0e-1,"; JsonBuffer buffer = new JsonBuffer(json); JsonScanner scanner = new JsonScanner(buffer); JsonToken token = scanner.nextToken(); assertEquals(JsonTokenType.DOUBLE, token.getType()); assertEquals(-0e-1, token.getValue()); assertEquals(',', buffer.read()); } @Test public void testOnePointTwo() { String json = "\t 1.2,"; JsonBuffer buffer = new JsonBuffer(json); JsonScanner scanner = new JsonScanner(buffer); JsonToken token = scanner.nextToken(); assertEquals(JsonTokenType.DOUBLE, token.getType()); assertEquals(1.2, token.getValue()); assertEquals(',', buffer.read()); } @Test public void testMinusOnePointTwo() { String json = "\t -1.2,"; JsonBuffer buffer = new JsonBuffer(json); JsonScanner scanner = new JsonScanner(buffer); JsonToken token = scanner.nextToken(); assertEquals(JsonTokenType.DOUBLE, token.getType()); assertEquals(-1.2, token.getValue()); assertEquals(',', buffer.read()); } @Test public void testOneExponentTwelve() { String json = "\t 1e12,"; JsonBuffer buffer = new JsonBuffer(json); JsonScanner scanner = new JsonScanner(buffer); JsonToken token = scanner.nextToken(); assertEquals(JsonTokenType.DOUBLE, token.getType()); assertEquals(1e12, token.getValue()); assertEquals(',', buffer.read()); } @Test public void testMinusZeroExponentTwelve() { String json = "\t -1e12,"; JsonBuffer buffer = new JsonBuffer(json); JsonScanner scanner = new JsonScanner(buffer); JsonToken token = scanner.nextToken(); assertEquals(JsonTokenType.DOUBLE, token.getType()); assertEquals(-1e12, token.getValue()); assertEquals(',', buffer.read()); } @Test public void testOneExponentMinuesTwelve() { String json = "\t 1e-12,"; JsonBuffer buffer = new JsonBuffer(json); JsonScanner scanner = new JsonScanner(buffer); JsonToken token = scanner.nextToken(); assertEquals(JsonTokenType.DOUBLE, token.getType()); assertEquals(1e-12, token.getValue()); assertEquals(',', buffer.read()); } @Test public void testMinusZeroExponentMinusTwelve() { String json = "\t -1e-12,"; JsonBuffer buffer = new JsonBuffer(json); JsonScanner scanner = new JsonScanner(buffer); JsonToken token = scanner.nextToken(); assertEquals(JsonTokenType.DOUBLE, token.getType()); assertEquals(-1e-12, token.getValue()); assertEquals(',', buffer.read()); } @Test public void testRegularExpressionEmpty() { String json = "\t //,"; JsonBuffer buffer = new JsonBuffer(json); JsonScanner scanner = new JsonScanner(buffer); JsonToken token = scanner.nextToken(); assertEquals(JsonTokenType.REGULAR_EXPRESSION, token.getType()); BsonRegularExpression regularExpression = token.getValue(BsonRegularExpression.class); assertEquals("", regularExpression.getPattern()); assertEquals("", regularExpression.getOptions()); assertEquals(',', buffer.read()); } @Test public void testRegularExpressionPattern() { String json = "\t /pattern/,"; JsonBuffer buffer = new JsonBuffer(json); JsonScanner scanner = new JsonScanner(buffer); JsonToken token = scanner.nextToken(); assertEquals(JsonTokenType.REGULAR_EXPRESSION, token.getType()); assertEquals("pattern", token.getValue(BsonRegularExpression.class).getPattern()); assertEquals(',', buffer.read()); } @Test public void testRegularExpressionPatternAndOptions() { String json = "\t /pattern/im,"; JsonBuffer buffer = new JsonBuffer(json); JsonScanner scanner = new JsonScanner(buffer); JsonToken token = scanner.nextToken(); assertEquals(JsonTokenType.REGULAR_EXPRESSION, token.getType()); BsonRegularExpression regularExpression = token.getValue(BsonRegularExpression.class); assertEquals("pattern", regularExpression.getPattern()); assertEquals("im", regularExpression.getOptions()); assertEquals(',', buffer.read()); } @Test public void testRegularExpressionPatternAndEscapeSequence() { String json = "\t /patte\\.n/,"; JsonBuffer buffer = new JsonBuffer(json); JsonScanner scanner = new JsonScanner(buffer); JsonToken token = scanner.nextToken(); assertEquals(JsonTokenType.REGULAR_EXPRESSION, token.getType()); assertEquals("patte\\.n", token.getValue(BsonRegularExpression.class).getPattern()); assertEquals(',', buffer.read()); } @Test(expected = JsonParseException.class) public void testInvalidRegularExpression() { String json = "\t /pattern/nsk,"; JsonBuffer buffer = new JsonBuffer(json); JsonScanner scanner = new JsonScanner(buffer); scanner.nextToken(); } @Test(expected = JsonParseException.class) public void testInvalidRegularExpressionNoEnd() { String json = "/b"; JsonBuffer buffer = new JsonBuffer(json); JsonScanner scanner = new JsonScanner(buffer); scanner.nextToken(); } @Test(expected = JsonParseException.class) public void testInvalidInput() { String json = "\t &&"; JsonScanner scanner = new JsonScanner(json); scanner.nextToken(); } @Test(expected = JsonParseException.class) public void testInvalidNumber() { String json = "\t 123a]"; JsonScanner scanner = new JsonScanner(json); scanner.nextToken(); } @Test(expected = JsonParseException.class) public void testInvalidInfinity() { String json = "\t -Infinnity]"; JsonScanner scanner = new JsonScanner(json); scanner.nextToken(); } }