176d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson/*
276d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson * Copyright (C) 2010 The Android Open Source Project
376d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson *
476d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson * Licensed under the Apache License, Version 2.0 (the "License");
576d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson * you may not use this file except in compliance with the License.
676d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson * You may obtain a copy of the License at
776d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson *
876d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson *      http://www.apache.org/licenses/LICENSE-2.0
976d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson *
1076d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson * Unless required by applicable law or agreed to in writing, software
1176d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson * distributed under the License is distributed on an "AS IS" BASIS,
1276d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1376d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson * See the License for the specific language governing permissions and
1476d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson * limitations under the License.
1576d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson */
1676d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson
1776d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilsonpackage android.util;
1876d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson
1976d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilsonimport java.io.IOException;
2076d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilsonimport java.io.StringReader;
21eb97c0ddc063176c26065fc6855188edf0c16e03Jesse Wilsonimport java.util.Arrays;
22eb97c0ddc063176c26065fc6855188edf0c16e03Jesse Wilsonimport junit.framework.TestCase;
2376d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson
2476d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilsonpublic final class JsonReaderTest extends TestCase {
2576d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson
269d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson    private static final int READER_BUFFER_SIZE = 1024;
279d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson
2876d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson    public void testReadArray() throws IOException {
2976d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        JsonReader reader = new JsonReader(new StringReader("[true, true]"));
3076d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        reader.beginArray();
3176d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        assertEquals(true, reader.nextBoolean());
3276d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        assertEquals(true, reader.nextBoolean());
3376d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        reader.endArray();
3476d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        assertEquals(JsonToken.END_DOCUMENT, reader.peek());
3576d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson    }
3676d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson
371ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson    public void testReadEmptyArray() throws IOException {
381ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        JsonReader reader = new JsonReader(new StringReader("[]"));
391ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        reader.beginArray();
401ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        assertFalse(reader.hasNext());
411ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        reader.endArray();
421ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        assertEquals(JsonToken.END_DOCUMENT, reader.peek());
431ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson    }
441ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson
4576d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson    public void testReadObject() throws IOException {
4676d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        JsonReader reader = new JsonReader(new StringReader(
4776d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson                "{\"a\": \"android\", \"b\": \"banana\"}"));
4876d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        reader.beginObject();
4976d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        assertEquals("a", reader.nextName());
5076d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        assertEquals("android", reader.nextString());
5176d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        assertEquals("b", reader.nextName());
5276d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        assertEquals("banana", reader.nextString());
5376d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        reader.endObject();
5476d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        assertEquals(JsonToken.END_DOCUMENT, reader.peek());
5576d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson    }
5676d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson
571ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson    public void testReadEmptyObject() throws IOException {
581ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        JsonReader reader = new JsonReader(new StringReader("{}"));
591ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        reader.beginObject();
601ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        assertFalse(reader.hasNext());
611ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        reader.endObject();
621ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        assertEquals(JsonToken.END_DOCUMENT, reader.peek());
631ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson    }
641ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson
6576d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson    public void testSkipObject() throws IOException {
6676d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        JsonReader reader = new JsonReader(new StringReader(
6776d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson                "{\"a\": { \"c\": [], \"d\": [true, true, {}] }, \"b\": \"banana\"}"));
6876d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        reader.beginObject();
6976d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        assertEquals("a", reader.nextName());
7076d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        reader.skipValue();
7176d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        assertEquals("b", reader.nextName());
7276d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        reader.skipValue();
7376d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        reader.endObject();
7476d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        assertEquals(JsonToken.END_DOCUMENT, reader.peek());
7576d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson    }
7676d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson
7776d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson    public void testHelloWorld() throws IOException {
7876d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        String json = "{\n" +
7976d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson                "   \"hello\": true,\n" +
8076d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson                "   \"foo\": [\"world\"]\n" +
8176d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson                "}";
8276d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        JsonReader reader = new JsonReader(new StringReader(json));
8376d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        reader.beginObject();
8476d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        assertEquals("hello", reader.nextName());
8576d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        assertEquals(true, reader.nextBoolean());
8676d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        assertEquals("foo", reader.nextName());
8776d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        reader.beginArray();
8876d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        assertEquals("world", reader.nextString());
8976d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        reader.endArray();
9076d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        reader.endObject();
9176d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        assertEquals(JsonToken.END_DOCUMENT, reader.peek());
9276d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson    }
9376d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson
9476d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson    public void testNulls() {
9576d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        try {
9676d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson            new JsonReader(null);
9776d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson            fail();
9876d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        } catch (NullPointerException expected) {
9976d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        }
10076d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson    }
10176d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson
10276d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson    public void testEmptyString() throws IOException {
10376d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        try {
10476d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson            new JsonReader(new StringReader("")).beginArray();
10576d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        } catch (IOException expected) {
10676d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        }
10776d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        try {
10876d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson            new JsonReader(new StringReader("")).beginObject();
10976d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        } catch (IOException expected) {
11076d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        }
11176d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson    }
11276d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson
11376d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson    public void testNoTopLevelObject() throws IOException {
11476d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        try {
11576d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson            new JsonReader(new StringReader("true")).nextBoolean();
11676d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        } catch (IOException expected) {
11776d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        }
11876d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson    }
11976d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson
12076d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson    public void testCharacterUnescaping() throws IOException {
12176d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        String json = "[\"a\","
12276d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson                + "\"a\\\"\","
12376d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson                + "\"\\\"\","
12476d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson                + "\":\","
12576d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson                + "\",\","
12676d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson                + "\"\\b\","
12776d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson                + "\"\\f\","
12876d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson                + "\"\\n\","
12976d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson                + "\"\\r\","
13076d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson                + "\"\\t\","
13176d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson                + "\" \","
13276d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson                + "\"\\\\\","
13376d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson                + "\"{\","
13476d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson                + "\"}\","
13576d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson                + "\"[\","
13676d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson                + "\"]\","
13776d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson                + "\"\\u0000\","
13876d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson                + "\"\\u0019\","
13976d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson                + "\"\\u20AC\""
14076d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson                + "]";
14176d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        JsonReader reader = new JsonReader(new StringReader(json));
14276d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        reader.beginArray();
14376d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        assertEquals("a", reader.nextString());
14476d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        assertEquals("a\"", reader.nextString());
14576d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        assertEquals("\"", reader.nextString());
14676d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        assertEquals(":", reader.nextString());
14776d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        assertEquals(",", reader.nextString());
14876d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        assertEquals("\b", reader.nextString());
14976d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        assertEquals("\f", reader.nextString());
15076d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        assertEquals("\n", reader.nextString());
15176d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        assertEquals("\r", reader.nextString());
15276d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        assertEquals("\t", reader.nextString());
15376d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        assertEquals(" ", reader.nextString());
15476d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        assertEquals("\\", reader.nextString());
15576d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        assertEquals("{", reader.nextString());
15676d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        assertEquals("}", reader.nextString());
15776d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        assertEquals("[", reader.nextString());
15876d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        assertEquals("]", reader.nextString());
15976d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        assertEquals("\0", reader.nextString());
16076d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        assertEquals("\u0019", reader.nextString());
16176d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        assertEquals("\u20AC", reader.nextString());
16276d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        reader.endArray();
16376d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        assertEquals(JsonToken.END_DOCUMENT, reader.peek());
16476d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson    }
16576d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson
16676d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson    public void testIntegersWithFractionalPartSpecified() throws IOException {
16776d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        JsonReader reader = new JsonReader(new StringReader("[1.0,1.0,1.0]"));
16876d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        reader.beginArray();
16976d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        assertEquals(1.0, reader.nextDouble());
17076d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        assertEquals(1, reader.nextInt());
17176d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        assertEquals(1L, reader.nextLong());
17276d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson    }
17376d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson
17476d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson    public void testDoubles() throws IOException {
17576d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        String json = "[-0.0,"
17676d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson                + "1.0,"
17776d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson                + "1.7976931348623157E308,"
17876d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson                + "4.9E-324,"
17976d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson                + "0.0,"
18076d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson                + "-0.5,"
18176d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson                + "2.2250738585072014E-308,"
18276d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson                + "3.141592653589793,"
1839d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson                + "2.718281828459045,"
1849d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson                + "\"1.0\","
1859d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson                + "\"011.0\","
1869d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson                + "\"NaN\","
1879d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson                + "\"Infinity\","
1889d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson                + "\"-Infinity\""
1899d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson                + "]";
19076d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        JsonReader reader = new JsonReader(new StringReader(json));
19176d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        reader.beginArray();
19276d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        assertEquals(-0.0, reader.nextDouble());
19376d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        assertEquals(1.0, reader.nextDouble());
19476d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        assertEquals(1.7976931348623157E308, reader.nextDouble());
19576d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        assertEquals(4.9E-324, reader.nextDouble());
19676d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        assertEquals(0.0, reader.nextDouble());
19776d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        assertEquals(-0.5, reader.nextDouble());
19876d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        assertEquals(2.2250738585072014E-308, reader.nextDouble());
19976d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        assertEquals(3.141592653589793, reader.nextDouble());
20076d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        assertEquals(2.718281828459045, reader.nextDouble());
2019d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        assertEquals(1,0, reader.nextDouble());
2029d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        assertEquals(11.0, reader.nextDouble());
2039d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        assertTrue(Double.isNaN(reader.nextDouble()));
2049d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        assertEquals(Double.POSITIVE_INFINITY, reader.nextDouble());
2059d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        assertEquals(Double.NEGATIVE_INFINITY, reader.nextDouble());
20676d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        reader.endArray();
20776d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        assertEquals(JsonToken.END_DOCUMENT, reader.peek());
20876d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson    }
20976d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson
2109d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson    public void testLenientDoubles() throws IOException {
2119d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        String json = "["
2129d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson                + "011.0,"
2139d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson                + "NaN,"
2149d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson                + "NAN,"
2159d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson                + "Infinity,"
2169d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson                + "INFINITY,"
2179d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson                + "-Infinity"
2189d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson                + "]";
21976d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        JsonReader reader = new JsonReader(new StringReader(json));
2209d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        reader.setLenient(true);
22176d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        reader.beginArray();
2229d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        assertEquals(11.0, reader.nextDouble());
2239d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        assertTrue(Double.isNaN(reader.nextDouble()));
2249d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        try {
2259d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson            reader.nextDouble();
2269d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson            fail();
2279d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        } catch (NumberFormatException expected) {
2289d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        }
2299d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        assertEquals("NAN", reader.nextString());
2309d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        assertEquals(Double.POSITIVE_INFINITY, reader.nextDouble());
23176d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        try {
23276d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson            reader.nextDouble();
23376d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson            fail();
23476d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        } catch (NumberFormatException expected) {
23576d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        }
2369d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        assertEquals("INFINITY", reader.nextString());
2379d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        assertEquals(Double.NEGATIVE_INFINITY, reader.nextDouble());
2389d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        reader.endArray();
2399d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        assertEquals(JsonToken.END_DOCUMENT, reader.peek());
2409d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson    }
2419d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson
2429d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson    public void testBufferBoundary() throws IOException {
2439d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        char[] pad = new char[READER_BUFFER_SIZE - 8];
2449d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        Arrays.fill(pad, '5');
2459d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        String json = "[\"" + new String(pad) + "\",33333]";
2469d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        JsonReader reader = new JsonReader(new StringReader(json));
2479d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        reader.beginArray();
2489d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        assertEquals(JsonToken.STRING, reader.peek());
2499d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        assertEquals(new String(pad), reader.nextString());
2509d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        assertEquals(JsonToken.NUMBER, reader.peek());
2519d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        assertEquals(33333, reader.nextInt());
2529d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson    }
2539d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson
2549d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson    public void testTruncatedBufferBoundary() throws IOException {
2559d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        char[] pad = new char[READER_BUFFER_SIZE - 8];
2569d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        Arrays.fill(pad, '5');
2579d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        String json = "[\"" + new String(pad) + "\",33333";
2589d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        JsonReader reader = new JsonReader(new StringReader(json));
2599d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        reader.setLenient(true);
2609d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        reader.beginArray();
2619d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        assertEquals(JsonToken.STRING, reader.peek());
2629d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        assertEquals(new String(pad), reader.nextString());
2639d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        assertEquals(JsonToken.NUMBER, reader.peek());
2649d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        assertEquals(33333, reader.nextInt());
2659d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        try {
2669d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson            reader.endArray();
2679d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson            fail();
2689d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        } catch (IOException e) {
2699d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        }
2709d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson    }
2719d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson
2729d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson    public void testLongestSupportedNumericLiterals() throws IOException {
2739d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        testLongNumericLiterals(READER_BUFFER_SIZE - 1, JsonToken.NUMBER);
2749d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson    }
2759d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson
2769d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson    public void testLongerNumericLiterals() throws IOException {
2779d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        testLongNumericLiterals(READER_BUFFER_SIZE, JsonToken.STRING);
2789d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson    }
2799d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson
2809d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson    private void testLongNumericLiterals(int length, JsonToken expectedToken) throws IOException {
2819d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        char[] longNumber = new char[length];
2829d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        Arrays.fill(longNumber, '9');
2839d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        longNumber[0] = '1';
2849d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        longNumber[1] = '.';
2859d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson
2869d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        String json = "[" + new String(longNumber) + "]";
2879d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        JsonReader reader = new JsonReader(new StringReader(json));
2889d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        reader.setLenient(true);
2899d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        reader.beginArray();
2909d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        assertEquals(expectedToken, reader.peek());
2919d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        assertEquals(2.0d, reader.nextDouble());
2929d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        reader.endArray();
29376d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson    }
29476d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson
29576d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson    public void testLongs() throws IOException {
29676d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        String json = "[0,0,0,"
29776d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson                + "1,1,1,"
29876d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson                + "-1,-1,-1,"
29976d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson                + "-9223372036854775808,"
3009d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson                + "9223372036854775807,"
3019d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson                + "5.0,"
3029d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson                + "1.0e2,"
3039d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson                + "\"011\","
3049d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson                + "\"5.0\","
3059d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson                + "\"1.0e2\""
3069d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson                + "]";
30776d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        JsonReader reader = new JsonReader(new StringReader(json));
30876d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        reader.beginArray();
30976d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        assertEquals(0L, reader.nextLong());
31076d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        assertEquals(0, reader.nextInt());
31176d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        assertEquals(0.0, reader.nextDouble());
31276d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        assertEquals(1L, reader.nextLong());
31376d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        assertEquals(1, reader.nextInt());
31476d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        assertEquals(1.0, reader.nextDouble());
31576d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        assertEquals(-1L, reader.nextLong());
31676d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        assertEquals(-1, reader.nextInt());
31776d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        assertEquals(-1.0, reader.nextDouble());
31876d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        try {
31976d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson            reader.nextInt();
32076d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson            fail();
32176d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        } catch (NumberFormatException expected) {
32276d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        }
32376d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        assertEquals(Long.MIN_VALUE, reader.nextLong());
32476d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        try {
32576d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson            reader.nextInt();
32676d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson            fail();
32776d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        } catch (NumberFormatException expected) {
32876d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        }
32976d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        assertEquals(Long.MAX_VALUE, reader.nextLong());
3309d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        assertEquals(5, reader.nextLong());
3319d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        assertEquals(100, reader.nextLong());
3329d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        assertEquals(11, reader.nextLong());
3339d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        assertEquals(5, reader.nextLong());
3349d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        assertEquals(100, reader.nextLong());
33576d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        reader.endArray();
33676d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        assertEquals(JsonToken.END_DOCUMENT, reader.peek());
33776d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson    }
33876d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson
33976d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson    /**
34076d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson     * This test fails because there's no double for 9223372036854775806, and
34176d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson     * our long parsing uses Double.parseDouble() for fractional values.
34276d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson     */
34376d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson    public void testHighPrecisionLong() throws IOException {
34476d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        String json = "[9223372036854775806.000]";
34576d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        JsonReader reader = new JsonReader(new StringReader(json));
34676d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        reader.beginArray();
34776d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        assertEquals(9223372036854775806L, reader.nextLong());
34876d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        reader.endArray();
34976d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson    }
35076d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson
3519d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson    public void testMatchingValidNumbers() throws IOException {
3529d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        String json = "[-1,99,-0,0,0e1,0e+1,0e-1,0E1,0E+1,0E-1,0.0,1.0,-1.0,1.0e0,1.0e+1,1.0e-1]";
3539d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        JsonReader reader = new JsonReader(new StringReader(json));
3549d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        reader.beginArray();
3559d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        for (int i = 0; i < 16; i++) {
3569d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson            assertEquals(JsonToken.NUMBER, reader.peek());
3579d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson            reader.nextDouble();
3589d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        }
3599d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        reader.endArray();
3609d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson    }
3619d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson
3629d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson    public void testRecognizingInvalidNumbers() throws IOException {
3639d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        String json = "[-00,00,001,+1,1f,0x,0xf,0x0,0f1,0ee1,1..0,1e0.1,1.-01,1.+1,1.0x,1.0+]";
3649d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        JsonReader reader = new JsonReader(new StringReader(json));
3659d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        reader.setLenient(true);
3669d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        reader.beginArray();
3679d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        for (int i = 0; i < 16; i++) {
3689d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson            assertEquals(JsonToken.STRING, reader.peek());
3699d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson            reader.nextString();
3709d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        }
3719d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        reader.endArray();
3729d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson    }
3739d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson
3749d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson    public void testNonFiniteDouble() throws IOException {
3759d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        String json = "[NaN]";
37676d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        JsonReader reader = new JsonReader(new StringReader(json));
37776d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        reader.beginArray();
37876d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        try {
3799d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson            reader.nextDouble();
38076d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson            fail();
3819d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        } catch (IOException expected) {
38276d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        }
3839d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson    }
3849d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson
3859d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson    public void testNumberWithHexPrefix() throws IOException {
3869d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        String json = "[0x11]";
3879d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        JsonReader reader = new JsonReader(new StringReader(json));
3889d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        reader.beginArray();
38976d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        try {
39076d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson            reader.nextLong();
39176d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson            fail();
3929d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        } catch (IOException expected) {
39376d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        }
3949d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson    }
3959d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson
3969d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson    public void testNumberWithOctalPrefix() throws IOException {
3979d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        String json = "[01]";
3989d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        JsonReader reader = new JsonReader(new StringReader(json));
3999d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        reader.beginArray();
40076d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        try {
4019d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson            reader.nextInt();
40276d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson            fail();
4039d9b4e70a1e7f9ffb6cedd8a86fdd926f2a28202Jesse Wilson        } catch (IOException expected) {
40476d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        }
40576d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson    }
40676d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson
40776d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson    public void testBooleans() throws IOException {
40876d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        JsonReader reader = new JsonReader(new StringReader("[true,false]"));
40976d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        reader.beginArray();
41076d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        assertEquals(true, reader.nextBoolean());
41176d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        assertEquals(false, reader.nextBoolean());
41276d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        reader.endArray();
41376d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        assertEquals(JsonToken.END_DOCUMENT, reader.peek());
41476d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson    }
41576d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson
41676d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson    public void testMixedCaseLiterals() throws IOException {
41776d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        JsonReader reader = new JsonReader(new StringReader("[True,TruE,False,FALSE,NULL,nulL]"));
41876d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        reader.beginArray();
41976d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        assertEquals(true, reader.nextBoolean());
42076d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        assertEquals(true, reader.nextBoolean());
42176d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        assertEquals(false, reader.nextBoolean());
42276d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        assertEquals(false, reader.nextBoolean());
42376d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        reader.nextNull();
42476d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        reader.nextNull();
42576d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        reader.endArray();
42676d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        assertEquals(JsonToken.END_DOCUMENT, reader.peek());
42776d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson    }
42876d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson
42976d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson    public void testMissingValue() throws IOException {
43076d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        JsonReader reader = new JsonReader(new StringReader("{\"a\":}"));
43176d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        reader.beginObject();
43276d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        assertEquals("a", reader.nextName());
43376d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        try {
43476d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson            reader.nextString();
43576d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson            fail();
43676d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        } catch (IOException expected) {
43776d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        }
43876d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson    }
43976d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson
44076d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson    public void testPrematureEndOfInput() throws IOException {
44176d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        JsonReader reader = new JsonReader(new StringReader("{\"a\":true,"));
44276d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        reader.beginObject();
44376d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        assertEquals("a", reader.nextName());
44476d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        assertEquals(true, reader.nextBoolean());
44576d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        try {
44676d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson            reader.nextName();
44776d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson            fail();
44876d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        } catch (IOException expected) {
44976d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        }
45076d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson    }
45176d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson
45276d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson    public void testPrematurelyClosed() throws IOException {
45376d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        try {
45476d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson            JsonReader reader = new JsonReader(new StringReader("{\"a\":[]}"));
45576d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson            reader.beginObject();
45676d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson            reader.close();
45776d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson            reader.nextName();
45876d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson            fail();
45976d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        } catch (IllegalStateException expected) {
46076d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        }
46176d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson
46276d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        try {
46376d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson            JsonReader reader = new JsonReader(new StringReader("{\"a\":[]}"));
46476d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson            reader.close();
46576d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson            reader.beginObject();
46676d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson            fail();
46776d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        } catch (IllegalStateException expected) {
46876d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        }
46976d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson
47076d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        try {
47176d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson            JsonReader reader = new JsonReader(new StringReader("{\"a\":true}"));
47276d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson            reader.beginObject();
47376d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson            reader.nextName();
47476d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson            reader.peek();
47576d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson            reader.close();
47676d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson            reader.nextBoolean();
47776d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson            fail();
47876d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        } catch (IllegalStateException expected) {
47976d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        }
48076d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson    }
48176d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson
48276d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson    public void testNextFailuresDoNotAdvance() throws IOException {
48376d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        JsonReader reader = new JsonReader(new StringReader("{\"a\":true}"));
48476d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        reader.beginObject();
48576d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        try {
48676d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson            reader.nextString();
48776d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson            fail();
48876d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        } catch (IllegalStateException expected) {
48976d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        }
49076d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        assertEquals("a", reader.nextName());
49176d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        try {
49276d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson            reader.nextName();
49376d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson            fail();
49476d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        } catch (IllegalStateException expected) {
49576d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        }
49676d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        try {
49776d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson            reader.beginArray();
49876d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson            fail();
49976d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        } catch (IllegalStateException expected) {
50076d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        }
50176d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        try {
50276d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson            reader.endArray();
50376d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson            fail();
50476d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        } catch (IllegalStateException expected) {
50576d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        }
50676d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        try {
50776d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson            reader.beginObject();
50876d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson            fail();
50976d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        } catch (IllegalStateException expected) {
51076d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        }
51176d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        try {
51276d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson            reader.endObject();
51376d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson            fail();
51476d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        } catch (IllegalStateException expected) {
51576d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        }
51676d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        assertEquals(true, reader.nextBoolean());
51776d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        try {
51876d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson            reader.nextString();
51976d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson            fail();
52076d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        } catch (IllegalStateException expected) {
52176d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        }
52276d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        try {
52376d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson            reader.nextName();
52476d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson            fail();
52576d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        } catch (IllegalStateException expected) {
52676d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        }
52776d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        try {
52876d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson            reader.beginArray();
52976d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson            fail();
53076d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        } catch (IllegalStateException expected) {
53176d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        }
53276d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        try {
53376d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson            reader.endArray();
53476d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson            fail();
53576d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        } catch (IllegalStateException expected) {
53676d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        }
53776d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        reader.endObject();
53876d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        assertEquals(JsonToken.END_DOCUMENT, reader.peek());
53976d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        reader.close();
54076d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson    }
54176d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson
54276d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson    public void testStringNullIsNotNull() throws IOException {
54376d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        JsonReader reader = new JsonReader(new StringReader("[\"null\"]"));
54476d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        reader.beginArray();
54576d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        try {
54676d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson            reader.nextNull();
54776d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson            fail();
54876d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        } catch (IllegalStateException expected) {
54976d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        }
55076d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson    }
55176d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson
55276d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson    public void testNullLiteralIsNotAString() throws IOException {
55376d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson       JsonReader reader = new JsonReader(new StringReader("[null]"));
55476d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        reader.beginArray();
55576d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        try {
55676d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson            reader.nextString();
55776d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson            fail();
55876d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        } catch (IllegalStateException expected) {
55976d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson        }
56076d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson    }
5611ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson
5621ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson    public void testStrictNameValueSeparator() throws IOException {
5631ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        JsonReader reader = new JsonReader(new StringReader("{\"a\"=true}"));
5641ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        reader.beginObject();
5651ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        assertEquals("a", reader.nextName());
5661ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        try {
5671ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson            reader.nextBoolean();
5681ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson            fail();
5691ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        } catch (IOException expected) {
5701ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        }
5711ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson
5721ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        reader = new JsonReader(new StringReader("{\"a\"=>true}"));
5731ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        reader.beginObject();
5741ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        assertEquals("a", reader.nextName());
5751ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        try {
5761ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson            reader.nextBoolean();
5771ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson            fail();
5781ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        } catch (IOException expected) {
5791ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        }
5801ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson    }
5811ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson
5821ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson    public void testLenientNameValueSeparator() throws IOException {
5831ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        JsonReader reader = new JsonReader(new StringReader("{\"a\"=true}"));
5841ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        reader.setLenient(true);
5851ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        reader.beginObject();
5861ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        assertEquals("a", reader.nextName());
5871ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        assertEquals(true, reader.nextBoolean());
5881ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson
5891ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        reader = new JsonReader(new StringReader("{\"a\"=>true}"));
5901ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        reader.setLenient(true);
5911ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        reader.beginObject();
5921ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        assertEquals("a", reader.nextName());
5931ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        assertEquals(true, reader.nextBoolean());
5941ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson    }
5951ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson
5961ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson    public void testStrictComments() throws IOException {
5971ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        JsonReader reader = new JsonReader(new StringReader("[// comment \n true]"));
5981ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        reader.beginArray();
5991ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        try {
6001ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson            reader.nextBoolean();
6011ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson            fail();
6021ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        } catch (IOException expected) {
6031ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        }
6041ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson
6051ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        reader = new JsonReader(new StringReader("[# comment \n true]"));
6061ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        reader.beginArray();
6071ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        try {
6081ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson            reader.nextBoolean();
6091ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson            fail();
6101ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        } catch (IOException expected) {
6111ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        }
6121ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson
6131ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        reader = new JsonReader(new StringReader("[/* comment */ true]"));
6141ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        reader.beginArray();
6151ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        try {
6161ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson            reader.nextBoolean();
6171ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson            fail();
6181ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        } catch (IOException expected) {
6191ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        }
6201ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson    }
6211ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson
6221ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson    public void testLenientComments() throws IOException {
6231ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        JsonReader reader = new JsonReader(new StringReader("[// comment \n true]"));
6241ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        reader.setLenient(true);
6251ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        reader.beginArray();
6261ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        assertEquals(true, reader.nextBoolean());
6271ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson
6281ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        reader = new JsonReader(new StringReader("[# comment \n true]"));
6291ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        reader.setLenient(true);
6301ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        reader.beginArray();
6311ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        assertEquals(true, reader.nextBoolean());
6321ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson
6331ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        reader = new JsonReader(new StringReader("[/* comment */ true]"));
6341ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        reader.setLenient(true);
6351ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        reader.beginArray();
6361ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        assertEquals(true, reader.nextBoolean());
6371ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson    }
6381ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson
6391ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson    public void testStrictUnquotedNames() throws IOException {
6401ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        JsonReader reader = new JsonReader(new StringReader("{a:true}"));
6411ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        reader.beginObject();
6421ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        try {
6431ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson            reader.nextName();
6441ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson            fail();
6451ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        } catch (IOException expected) {
6461ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        }
6471ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson    }
6481ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson
6491ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson    public void testLenientUnquotedNames() throws IOException {
6501ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        JsonReader reader = new JsonReader(new StringReader("{a:true}"));
6511ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        reader.setLenient(true);
6521ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        reader.beginObject();
6531ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        assertEquals("a", reader.nextName());
6541ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson    }
6551ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson
6561ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson    public void testStrictSingleQuotedNames() throws IOException {
6571ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        JsonReader reader = new JsonReader(new StringReader("{'a':true}"));
6581ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        reader.beginObject();
6591ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        try {
6601ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson            reader.nextName();
6611ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson            fail();
6621ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        } catch (IOException expected) {
6631ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        }
6641ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson    }
6651ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson
6661ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson    public void testLenientSingleQuotedNames() throws IOException {
6671ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        JsonReader reader = new JsonReader(new StringReader("{'a':true}"));
6681ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        reader.setLenient(true);
6691ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        reader.beginObject();
6701ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        assertEquals("a", reader.nextName());
6711ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson    }
6721ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson
6731ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson    public void testStrictUnquotedStrings() throws IOException {
6741ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        JsonReader reader = new JsonReader(new StringReader("[a]"));
6751ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        reader.beginArray();
6761ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        try {
6771ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson            reader.nextString();
6781ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson            fail();
679eb97c0ddc063176c26065fc6855188edf0c16e03Jesse Wilson        } catch (MalformedJsonException expected) {
6801ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        }
6811ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson    }
6821ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson
6831ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson    public void testLenientUnquotedStrings() throws IOException {
6841ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        JsonReader reader = new JsonReader(new StringReader("[a]"));
6851ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        reader.setLenient(true);
6861ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        reader.beginArray();
6871ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        assertEquals("a", reader.nextString());
6881ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson    }
6891ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson
6901ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson    public void testStrictSingleQuotedStrings() throws IOException {
6911ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        JsonReader reader = new JsonReader(new StringReader("['a']"));
6921ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        reader.beginArray();
6931ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        try {
6941ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson            reader.nextString();
6951ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson            fail();
6961ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        } catch (IOException expected) {
6971ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        }
6981ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson    }
6991ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson
7001ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson    public void testLenientSingleQuotedStrings() throws IOException {
7011ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        JsonReader reader = new JsonReader(new StringReader("['a']"));
7021ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        reader.setLenient(true);
7031ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        reader.beginArray();
7041ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        assertEquals("a", reader.nextString());
7051ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson    }
7061ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson
7071ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson    public void testStrictSemicolonDelimitedArray() throws IOException {
7081ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        JsonReader reader = new JsonReader(new StringReader("[true;true]"));
7091ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        reader.beginArray();
7101ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        try {
7111ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson            reader.nextBoolean();
7121ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson            reader.nextBoolean();
7131ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson            fail();
7141ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        } catch (IOException expected) {
7151ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        }
7161ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson    }
7171ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson
7181ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson    public void testLenientSemicolonDelimitedArray() throws IOException {
7191ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        JsonReader reader = new JsonReader(new StringReader("[true;true]"));
7201ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        reader.setLenient(true);
7211ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        reader.beginArray();
7221ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        assertEquals(true, reader.nextBoolean());
7231ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        assertEquals(true, reader.nextBoolean());
7241ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson    }
7251ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson
7261ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson    public void testStrictSemicolonDelimitedNameValuePair() throws IOException {
7271ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        JsonReader reader = new JsonReader(new StringReader("{\"a\":true;\"b\":true}"));
7281ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        reader.beginObject();
7291ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        assertEquals("a", reader.nextName());
7301ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        try {
7311ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson            reader.nextBoolean();
7321ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson            reader.nextName();
7331ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson            fail();
7341ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        } catch (IOException expected) {
7351ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        }
7361ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson    }
7371ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson
7381ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson    public void testLenientSemicolonDelimitedNameValuePair() throws IOException {
7391ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        JsonReader reader = new JsonReader(new StringReader("{\"a\":true;\"b\":true}"));
7401ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        reader.setLenient(true);
7411ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        reader.beginObject();
7421ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        assertEquals("a", reader.nextName());
7431ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        assertEquals(true, reader.nextBoolean());
7441ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        assertEquals("b", reader.nextName());
7451ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson    }
7461ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson
7471ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson    public void testStrictUnnecessaryArraySeparators() throws IOException {
7481ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        JsonReader reader = new JsonReader(new StringReader("[true,,true]"));
7491ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        reader.beginArray();
7501ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        assertEquals(true, reader.nextBoolean());
7511ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        try {
7521ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson            reader.nextNull();
7531ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson            fail();
7541ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        } catch (IOException expected) {
7551ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        }
7561ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson
7571ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        reader = new JsonReader(new StringReader("[,true]"));
7581ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        reader.beginArray();
7591ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        try {
7601ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson            reader.nextNull();
7611ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson            fail();
7621ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        } catch (IOException expected) {
7631ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        }
7641ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson
7651ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        reader = new JsonReader(new StringReader("[true,]"));
7661ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        reader.beginArray();
7671ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        assertEquals(true, reader.nextBoolean());
7681ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        try {
7691ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson            reader.nextNull();
7701ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson            fail();
7711ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        } catch (IOException expected) {
7721ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        }
7731ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson
7741ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        reader = new JsonReader(new StringReader("[,]"));
7751ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        reader.beginArray();
7761ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        try {
7771ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson            reader.nextNull();
7781ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson            fail();
7791ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        } catch (IOException expected) {
7801ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        }
7811ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson    }
7821ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson
7831ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson    public void testLenientUnnecessaryArraySeparators() throws IOException {
7841ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        JsonReader reader = new JsonReader(new StringReader("[true,,true]"));
7851ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        reader.setLenient(true);
7861ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        reader.beginArray();
7871ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        assertEquals(true, reader.nextBoolean());
7881ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        reader.nextNull();
7891ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        assertEquals(true, reader.nextBoolean());
7901ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        reader.endArray();
7911ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson
7921ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        reader = new JsonReader(new StringReader("[,true]"));
7931ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        reader.setLenient(true);
7941ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        reader.beginArray();
7951ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        reader.nextNull();
7961ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        assertEquals(true, reader.nextBoolean());
7971ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        reader.endArray();
7981ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson
7991ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        reader = new JsonReader(new StringReader("[true,]"));
8001ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        reader.setLenient(true);
8011ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        reader.beginArray();
8021ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        assertEquals(true, reader.nextBoolean());
8031ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        reader.nextNull();
8041ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        reader.endArray();
8051ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson
8061ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        reader = new JsonReader(new StringReader("[,]"));
8071ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        reader.setLenient(true);
8081ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        reader.beginArray();
8091ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        reader.nextNull();
8101ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        reader.nextNull();
8111ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson        reader.endArray();
8121ba417140554dbd57602a1f4b453fc42363cf394Jesse Wilson    }
813eb97c0ddc063176c26065fc6855188edf0c16e03Jesse Wilson
814eb97c0ddc063176c26065fc6855188edf0c16e03Jesse Wilson    public void testStrictMultipleTopLevelValues() throws IOException {
815eb97c0ddc063176c26065fc6855188edf0c16e03Jesse Wilson        JsonReader reader = new JsonReader(new StringReader("[] []"));
816eb97c0ddc063176c26065fc6855188edf0c16e03Jesse Wilson        reader.beginArray();
817eb97c0ddc063176c26065fc6855188edf0c16e03Jesse Wilson        reader.endArray();
818eb97c0ddc063176c26065fc6855188edf0c16e03Jesse Wilson        try {
819eb97c0ddc063176c26065fc6855188edf0c16e03Jesse Wilson            reader.peek();
820eb97c0ddc063176c26065fc6855188edf0c16e03Jesse Wilson            fail();
821eb97c0ddc063176c26065fc6855188edf0c16e03Jesse Wilson        } catch (IOException expected) {
822eb97c0ddc063176c26065fc6855188edf0c16e03Jesse Wilson        }
823eb97c0ddc063176c26065fc6855188edf0c16e03Jesse Wilson    }
824eb97c0ddc063176c26065fc6855188edf0c16e03Jesse Wilson
825eb97c0ddc063176c26065fc6855188edf0c16e03Jesse Wilson    public void testLenientMultipleTopLevelValues() throws IOException {
826eb97c0ddc063176c26065fc6855188edf0c16e03Jesse Wilson        JsonReader reader = new JsonReader(new StringReader("[] true {}"));
827eb97c0ddc063176c26065fc6855188edf0c16e03Jesse Wilson        reader.setLenient(true);
828eb97c0ddc063176c26065fc6855188edf0c16e03Jesse Wilson        reader.beginArray();
829eb97c0ddc063176c26065fc6855188edf0c16e03Jesse Wilson        reader.endArray();
830eb97c0ddc063176c26065fc6855188edf0c16e03Jesse Wilson        assertEquals(true, reader.nextBoolean());
831eb97c0ddc063176c26065fc6855188edf0c16e03Jesse Wilson        reader.beginObject();
832eb97c0ddc063176c26065fc6855188edf0c16e03Jesse Wilson        reader.endObject();
833eb97c0ddc063176c26065fc6855188edf0c16e03Jesse Wilson        assertEquals(JsonToken.END_DOCUMENT, reader.peek());
834eb97c0ddc063176c26065fc6855188edf0c16e03Jesse Wilson    }
835eb97c0ddc063176c26065fc6855188edf0c16e03Jesse Wilson
836eb97c0ddc063176c26065fc6855188edf0c16e03Jesse Wilson    public void testStrictTopLevelValueType() {
837eb97c0ddc063176c26065fc6855188edf0c16e03Jesse Wilson        JsonReader reader = new JsonReader(new StringReader("true"));
838eb97c0ddc063176c26065fc6855188edf0c16e03Jesse Wilson        try {
839eb97c0ddc063176c26065fc6855188edf0c16e03Jesse Wilson            reader.nextBoolean();
840eb97c0ddc063176c26065fc6855188edf0c16e03Jesse Wilson            fail();
841eb97c0ddc063176c26065fc6855188edf0c16e03Jesse Wilson        } catch (IOException expected) {
842eb97c0ddc063176c26065fc6855188edf0c16e03Jesse Wilson        }
843eb97c0ddc063176c26065fc6855188edf0c16e03Jesse Wilson    }
844eb97c0ddc063176c26065fc6855188edf0c16e03Jesse Wilson
845eb97c0ddc063176c26065fc6855188edf0c16e03Jesse Wilson    public void testLenientTopLevelValueType() throws IOException {
846eb97c0ddc063176c26065fc6855188edf0c16e03Jesse Wilson        JsonReader reader = new JsonReader(new StringReader("true"));
847eb97c0ddc063176c26065fc6855188edf0c16e03Jesse Wilson        reader.setLenient(true);
848eb97c0ddc063176c26065fc6855188edf0c16e03Jesse Wilson        assertEquals(true, reader.nextBoolean());
849eb97c0ddc063176c26065fc6855188edf0c16e03Jesse Wilson    }
850eb97c0ddc063176c26065fc6855188edf0c16e03Jesse Wilson
851eb97c0ddc063176c26065fc6855188edf0c16e03Jesse Wilson    public void testStrictNonExecutePrefix() {
852eb97c0ddc063176c26065fc6855188edf0c16e03Jesse Wilson        JsonReader reader = new JsonReader(new StringReader(")]}'\n []"));
853eb97c0ddc063176c26065fc6855188edf0c16e03Jesse Wilson        try {
854eb97c0ddc063176c26065fc6855188edf0c16e03Jesse Wilson            reader.beginArray();
855eb97c0ddc063176c26065fc6855188edf0c16e03Jesse Wilson            fail();
856eb97c0ddc063176c26065fc6855188edf0c16e03Jesse Wilson        } catch (IOException expected) {
857eb97c0ddc063176c26065fc6855188edf0c16e03Jesse Wilson        }
858eb97c0ddc063176c26065fc6855188edf0c16e03Jesse Wilson    }
859febae4ed18953098fec2126c7f883213e14469c9Jesse Wilson
8607a2c813d304b910b00046115efb0f462e6431a64Jesse Wilson    public void testBomIgnoredAsFirstCharacterOfDocument() throws IOException {
8617a2c813d304b910b00046115efb0f462e6431a64Jesse Wilson        JsonReader reader = new JsonReader(new StringReader("\ufeff[]"));
8627a2c813d304b910b00046115efb0f462e6431a64Jesse Wilson        reader.beginArray();
8637a2c813d304b910b00046115efb0f462e6431a64Jesse Wilson        reader.endArray();
8647a2c813d304b910b00046115efb0f462e6431a64Jesse Wilson    }
8657a2c813d304b910b00046115efb0f462e6431a64Jesse Wilson
8667a2c813d304b910b00046115efb0f462e6431a64Jesse Wilson    public void testBomForbiddenAsOtherCharacterInDocument() throws IOException {
8677a2c813d304b910b00046115efb0f462e6431a64Jesse Wilson        JsonReader reader = new JsonReader(new StringReader("[\ufeff]"));
8687a2c813d304b910b00046115efb0f462e6431a64Jesse Wilson        reader.beginArray();
8697a2c813d304b910b00046115efb0f462e6431a64Jesse Wilson        try {
8707a2c813d304b910b00046115efb0f462e6431a64Jesse Wilson            reader.endArray();
8717a2c813d304b910b00046115efb0f462e6431a64Jesse Wilson            fail();
8727a2c813d304b910b00046115efb0f462e6431a64Jesse Wilson        } catch (IOException expected) {
8737a2c813d304b910b00046115efb0f462e6431a64Jesse Wilson        }
8747a2c813d304b910b00046115efb0f462e6431a64Jesse Wilson    }
8757a2c813d304b910b00046115efb0f462e6431a64Jesse Wilson
876febae4ed18953098fec2126c7f883213e14469c9Jesse Wilson    public void testFailWithPosition() throws IOException {
877378c368f20d9746f07c8047172f5931abf69af8eJesse Wilson        testFailWithPosition("Expected literal value at line 6 column 3",
878febae4ed18953098fec2126c7f883213e14469c9Jesse Wilson                "[\n\n\n\n\n0,}]");
879febae4ed18953098fec2126c7f883213e14469c9Jesse Wilson    }
880febae4ed18953098fec2126c7f883213e14469c9Jesse Wilson
8817a2c813d304b910b00046115efb0f462e6431a64Jesse Wilson    public void testFailWithPositionIsOffsetByBom() throws IOException {
8827a2c813d304b910b00046115efb0f462e6431a64Jesse Wilson        testFailWithPosition("Expected literal value at line 1 column 4",
8837a2c813d304b910b00046115efb0f462e6431a64Jesse Wilson                "\ufeff[0,}]");
8847a2c813d304b910b00046115efb0f462e6431a64Jesse Wilson    }
8857a2c813d304b910b00046115efb0f462e6431a64Jesse Wilson
886febae4ed18953098fec2126c7f883213e14469c9Jesse Wilson    public void testFailWithPositionGreaterThanBufferSize() throws IOException {
887febae4ed18953098fec2126c7f883213e14469c9Jesse Wilson        String spaces = repeat(' ', 8192);
888febae4ed18953098fec2126c7f883213e14469c9Jesse Wilson        testFailWithPosition("Expected literal value at line 6 column 3",
889febae4ed18953098fec2126c7f883213e14469c9Jesse Wilson                "[\n\n" + spaces + "\n\n\n0,}]");
890febae4ed18953098fec2126c7f883213e14469c9Jesse Wilson    }
891febae4ed18953098fec2126c7f883213e14469c9Jesse Wilson
892febae4ed18953098fec2126c7f883213e14469c9Jesse Wilson    private void testFailWithPosition(String message, String json) throws IOException {
893febae4ed18953098fec2126c7f883213e14469c9Jesse Wilson        JsonReader reader = new JsonReader(new StringReader(json));
894febae4ed18953098fec2126c7f883213e14469c9Jesse Wilson        reader.beginArray();
895febae4ed18953098fec2126c7f883213e14469c9Jesse Wilson        reader.nextInt();
896febae4ed18953098fec2126c7f883213e14469c9Jesse Wilson        try {
897febae4ed18953098fec2126c7f883213e14469c9Jesse Wilson            reader.peek();
898febae4ed18953098fec2126c7f883213e14469c9Jesse Wilson            fail();
899febae4ed18953098fec2126c7f883213e14469c9Jesse Wilson        } catch (IOException expected) {
900febae4ed18953098fec2126c7f883213e14469c9Jesse Wilson            assertEquals(message, expected.getMessage());
901febae4ed18953098fec2126c7f883213e14469c9Jesse Wilson        }
902febae4ed18953098fec2126c7f883213e14469c9Jesse Wilson    }
903febae4ed18953098fec2126c7f883213e14469c9Jesse Wilson
904febae4ed18953098fec2126c7f883213e14469c9Jesse Wilson    private String repeat(char c, int count) {
905febae4ed18953098fec2126c7f883213e14469c9Jesse Wilson        char[] array = new char[count];
906febae4ed18953098fec2126c7f883213e14469c9Jesse Wilson        Arrays.fill(array, c);
907febae4ed18953098fec2126c7f883213e14469c9Jesse Wilson        return new String(array);
908febae4ed18953098fec2126c7f883213e14469c9Jesse Wilson    }
90976d7e20a75d24afb2f5011a7646dbde8aaa52087Jesse Wilson}
910