/*
* Copyright 1999-2101 Alibaba Group.
*
* 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 com.alibaba.json.bvt;
import java.math.BigDecimal;
import java.math.BigInteger;
import org.junit.Assert;
import junit.framework.TestCase;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.parser.JSONScanner;
import com.alibaba.fastjson.parser.JSONToken;
public class LexerTest extends TestCase {
public void test_float() throws Exception {
String text = "123456789.0123";
JSONScanner lexer = new JSONScanner(text);
lexer.nextToken();
BigDecimal decimalValue = lexer.decimalValue();
Assert.assertEquals(new BigDecimal("123456789.0123"), decimalValue);
}
public void test_string() throws Exception {
{
JSONScanner lexer = new JSONScanner("\"中国\"");
lexer.nextToken();
Assert.assertEquals("中国", lexer.stringVal());
}
{
JSONScanner lexer = new JSONScanner("\"中国\t\"");
lexer.nextToken();
Assert.assertEquals("中国\t", lexer.stringVal());
}
{
JSONScanner lexer = new JSONScanner("\"中国\tV5\"");
lexer.nextToken();
Assert.assertEquals("中国\tV5", lexer.stringVal());
}
StringBuilder buf = new StringBuilder();
buf.append('"');
buf.append("\\\\\\/\\b\\f\\n\\r\\t\\u" + Integer.toHexString('中'));
buf.append('"');
buf.append('\u2001');
String text = buf.toString();
JSONScanner lexer = new JSONScanner(text.toCharArray(), text.length() - 1);
lexer.nextToken();
Assert.assertEquals(0, lexer.pos());
String stringVal = lexer.stringVal();
Assert.assertEquals("\"\\\\/\\b\\f\\n\\r\\t中\"", JSON.toJSONString(stringVal));
}
public void test_string2() throws Exception {
StringBuilder buf = new StringBuilder();
buf.append('"');
for (int i = 0; i < 200; ++i) {
buf.append("\\\\\\/\\b\\f\\n\\r\\t\\u" + Integer.toHexString('中'));
}
buf.append('"');
String text = buf.toString();
JSONScanner lexer = new JSONScanner(text.toCharArray(), text.length());
lexer.nextToken();
Assert.assertEquals(0, lexer.pos());
lexer.stringVal();
}
public void test_string3() throws Exception {
StringBuilder buf = new StringBuilder();
buf.append('"');
for (int i = 0; i < 200; ++i) {
buf.append("abcdefghijklmn012345689ABCDEFG");
}
buf.append('"');
String text = buf.toString();
JSONScanner lexer = new JSONScanner(text.toCharArray(), text.length());
lexer.nextToken();
Assert.assertEquals(0, lexer.pos());
lexer.stringVal();
}
public void test_string4() throws Exception {
StringBuilder buf = new StringBuilder();
buf.append('"');
for (int i = 0; i < 200; ++i) {
buf.append("\\tabcdefghijklmn012345689ABCDEFG");
}
buf.append('"');
String text = buf.toString();
JSONScanner lexer = new JSONScanner(text.toCharArray(), text.length());
lexer.nextToken();
Assert.assertEquals(0, lexer.pos());
lexer.stringVal();
// Assert.assertEquals("\"\\\\\\/\\b\\f\\n\\r\\t中\"",
// JSON.toJSONString(stringVal));
}
public void test_empty() throws Exception {
JSONScanner lexer = new JSONScanner("".toCharArray(), 0);
lexer.nextToken();
Assert.assertEquals(JSONToken.EOF, lexer.token());
}
public void test_isWhitespace() throws Exception {
new JSONScanner("".toCharArray(), 0);
Assert.assertTrue(JSONScanner.isWhitespace(' '));
Assert.assertTrue(JSONScanner.isWhitespace('\b'));
Assert.assertTrue(JSONScanner.isWhitespace('\f'));
Assert.assertTrue(JSONScanner.isWhitespace('\n'));
Assert.assertTrue(JSONScanner.isWhitespace('\r'));
Assert.assertTrue(JSONScanner.isWhitespace('\t'));
Assert.assertFalse(JSONScanner.isWhitespace('k'));
}
public void test_error() throws Exception {
JSONScanner lexer = new JSONScanner("k");
lexer.nextToken();
Assert.assertEquals(JSONToken.ERROR, lexer.token());
}
public void test_error1() throws Exception {
Exception error = null;
try {
JSONScanner lexer = new JSONScanner("\"\\k\"");
lexer.nextToken();
} catch (Exception ex) {
error = ex;
}
Assert.assertNotNull(error);
}
public void f_test_ident() throws Exception {
{
JSONScanner lexer = new JSONScanner("ttue");
lexer.nextToken();
Assert.assertEquals(JSONToken.IDENTIFIER, lexer.token());
}
{
JSONScanner lexer = new JSONScanner("tree");
lexer.nextToken();
Assert.assertEquals(JSONToken.IDENTIFIER, lexer.token());
}
{
JSONScanner lexer = new JSONScanner("truu");
lexer.nextToken();
Assert.assertEquals(JSONToken.IDENTIFIER, lexer.token());
}
{
JSONScanner lexer = new JSONScanner("fflse");
lexer.nextToken();
Assert.assertEquals(JSONToken.IDENTIFIER, lexer.token());
}
{
JSONScanner lexer = new JSONScanner("nalse");
lexer.nextToken();
Assert.assertEquals(JSONToken.IDENTIFIER, lexer.token());
}
{
JSONScanner lexer = new JSONScanner("faase");
lexer.nextToken();
Assert.assertEquals(JSONToken.IDENTIFIER, lexer.token());
}
{
JSONScanner lexer = new JSONScanner("falle");
lexer.nextToken();
Assert.assertEquals(JSONToken.IDENTIFIER, lexer.token());
}
{
JSONScanner lexer = new JSONScanner("falss");
lexer.nextToken();
Assert.assertEquals(JSONToken.IDENTIFIER, lexer.token());
}
{
JSONScanner lexer = new JSONScanner("nnll");
lexer.nextToken();
Assert.assertEquals(JSONToken.IDENTIFIER, lexer.token());
}
{
JSONScanner lexer = new JSONScanner("nuul");
lexer.nextToken();
Assert.assertEquals(JSONToken.IDENTIFIER, lexer.token());
}
{
JSONScanner lexer = new JSONScanner("nulk");
lexer.nextToken();
Assert.assertEquals(JSONToken.IDENTIFIER, lexer.token());
}
{
StringBuilder buf = new StringBuilder();
buf.append('n');
for (char ch = 'A'; ch <= 'Z'; ++ch) {
buf.append(ch);
}
for (char ch = 'a'; ch <= 'z'; ++ch) {
buf.append(ch);
}
JSONScanner lexer = new JSONScanner(buf.toString());
lexer.nextToken();
Assert.assertEquals(JSONToken.IDENTIFIER, lexer.token());
}
}
public void test_number() throws Exception {
String text = "[0,1,-1,2E3,2E+3,2E-3,2e3,2e+3,2e-3]";
JSONArray array = JSON.parseArray(text);
Assert.assertEquals(0, array.get(0));
Assert.assertEquals(1, array.get(1));
Assert.assertEquals(-1, array.get(2));
Assert.assertEquals(new BigDecimal("2E3"), array.get(3));
Assert.assertEquals(new BigDecimal("2E3"), array.get(4));
Assert.assertEquals(new BigDecimal("2E-3"), array.get(5));
Assert.assertEquals(new BigDecimal("2E3"), array.get(6));
Assert.assertEquals(new BigDecimal("2E3"), array.get(7));
Assert.assertEquals(new BigDecimal("2E-3"), array.get(8));
for (long i = Long.MIN_VALUE; i <= Long.MIN_VALUE + 1000 * 10; ++i) {
Assert.assertEquals(i, JSON.parse(Long.toString(i)));
}
for (long i = Long.MAX_VALUE - 1000 * 10; i <= Long.MAX_VALUE && i > 0; ++i) {
Assert.assertEquals(i, JSON.parse(Long.toString(i)));
}
}
public void test_big_integer_1() throws Exception {
String text = Long.MAX_VALUE + "1234";
JSONScanner lexer = new JSONScanner(text);
lexer.nextToken();
Assert.assertEquals(new BigInteger(text), lexer.integerValue());
}
public void test_big_integer_2() throws Exception {
String text = Long.MIN_VALUE + "1234";
JSONScanner lexer = new JSONScanner(text);
lexer.nextToken();
Assert.assertEquals(new BigInteger(text), lexer.integerValue());
}
public void test_big_integer_3() throws Exception {
String text = "9223372036854775809";
JSONScanner lexer = new JSONScanner(text);
lexer.nextToken();
Assert.assertEquals(new BigInteger(text), lexer.integerValue());
}
public void test_error2() {
Exception error = null;
try {
JSONScanner lexer = new JSONScanner("--");
lexer.nextToken();
lexer.integerValue();
} catch (Exception ex) {
error = ex;
}
Assert.assertNotNull(error);
}
public void test_error3() {
Exception error = null;
try {
JSONScanner lexer = new JSONScanner("");
lexer.nextToken();
lexer.nextToken();
lexer.integerValue();
} catch (Exception ex) {
error = ex;
}
Assert.assertNotNull(error);
}
}