151a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson/*
267f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson * Copyright (C) 2010 The Android Open Source Project
367f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson *
467f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson * Licensed under the Apache License, Version 2.0 (the "License");
567f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson * you may not use this file except in compliance with the License.
667f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson * You may obtain a copy of the License at
767f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson *
851a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson *      http://www.apache.org/licenses/LICENSE-2.0
967f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson *
1067f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson * Unless required by applicable law or agreed to in writing, software
1167f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson * distributed under the License is distributed on an "AS IS" BASIS,
1267f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1367f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson * See the License for the specific language governing permissions and
1467f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson * limitations under the License.
1567f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson */
1667f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson
1773c8bbb045404420ffe4440bb1c7c5578ca160a7Jesse Wilsonpackage org.json;
1867f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson
1951a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilsonimport junit.framework.AssertionFailedError;
207365de1056414750d0a7d1fdd26025fd247f0d04Jesse Wilsonimport junit.framework.TestCase;
2167f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson
2267f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson/**
2367f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson * This black box test was written without inspecting the non-free org.json sourcecode.
2467f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson */
2567f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilsonpublic class JSONTokenerTest extends TestCase {
2667f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson
2767f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson    public void testNulls() throws JSONException {
2851a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson        // JSONTokener accepts null, only to fail later on almost all APIs!
2967f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        new JSONTokener(null).back();
3067f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson
3167f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        try {
3267f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson            new JSONTokener(null).more();
3367f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson            fail();
3467f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        } catch (NullPointerException e) {
3567f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        }
3667f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson
3767f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        try {
3867f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson            new JSONTokener(null).next();
3967f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson            fail();
4067f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        } catch (NullPointerException e) {
4167f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        }
4267f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson
4367f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        try {
4467f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson            new JSONTokener(null).next(3);
4567f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson            fail();
4667f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        } catch (NullPointerException e) {
4767f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        }
4867f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson
4967f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        try {
5067f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson            new JSONTokener(null).next('A');
5167f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson            fail();
5267f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        } catch (NullPointerException e) {
5367f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        }
5467f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson
5567f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        try {
5667f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson            new JSONTokener(null).nextClean();
5767f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson            fail();
5867f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        } catch (NullPointerException e) {
5967f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        }
6067f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson
6167f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        try {
6267f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson            new JSONTokener(null).nextString('"');
6367f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson            fail();
6467f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        } catch (NullPointerException e) {
6567f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        }
6667f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson
6767f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        try {
6867f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson            new JSONTokener(null).nextTo('A');
6967f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson            fail();
7067f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        } catch (NullPointerException e) {
7167f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        }
7267f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson
7367f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        try {
7467f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson            new JSONTokener(null).nextTo("ABC");
7567f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson            fail();
7667f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        } catch (NullPointerException e) {
7767f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        }
7867f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson
7967f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        try {
8067f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson            new JSONTokener(null).nextValue();
8167f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson            fail();
8267f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        } catch (NullPointerException e) {
8367f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        }
8467f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson
8567f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        try {
8667f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson            new JSONTokener(null).skipPast("ABC");
8767f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson            fail();
8867f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        } catch (NullPointerException e) {
8967f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        }
9067f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson
9167f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        try {
9267f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson            new JSONTokener(null).skipTo('A');
9367f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson            fail();
9467f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        } catch (NullPointerException e) {
9567f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        }
9667f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson
9767f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals("foo! at character 0 of null",
9867f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson                new JSONTokener(null).syntaxError("foo!").getMessage());
9967f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson
10067f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals(" at character 0 of null", new JSONTokener(null).toString());
10167f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson    }
10267f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson
10367f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson    public void testEmptyString() throws JSONException {
10467f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        JSONTokener backTokener = new JSONTokener("");
10567f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        backTokener.back();
10667f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals(" at character 0 of ", backTokener.toString());
10767f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertFalse(new JSONTokener("").more());
10867f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals('\0', new JSONTokener("").next());
10967f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        try {
11067f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson            new JSONTokener("").next(3);
11167f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson            fail();
11267f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        } catch (JSONException expected) {
11367f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        }
11467f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        try {
11567f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson            new JSONTokener("").next('A');
11667f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson            fail();
11767f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        } catch (JSONException e) {
11867f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        }
11967f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals('\0', new JSONTokener("").nextClean());
12067f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        try {
12167f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson            new JSONTokener("").nextString('"');
12267f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson            fail();
12367f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        } catch (JSONException e) {
12467f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        }
12567f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals("", new JSONTokener("").nextTo('A'));
12667f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals("", new JSONTokener("").nextTo("ABC"));
12767f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        try {
12867f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson            new JSONTokener("").nextValue();
12967f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson            fail();
13067f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        } catch (JSONException e) {
13167f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        }
13267f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        new JSONTokener("").skipPast("ABC");
13367f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals('\0', new JSONTokener("").skipTo('A'));
13467f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals("foo! at character 0 of ",
13567f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson                new JSONTokener("").syntaxError("foo!").getMessage());
13667f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals(" at character 0 of ", new JSONTokener("").toString());
13767f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson    }
13867f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson
13967f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson    public void testCharacterNavigation() throws JSONException {
14067f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        JSONTokener abcdeTokener = new JSONTokener("ABCDE");
14167f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals('A', abcdeTokener.next());
14267f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals('B', abcdeTokener.next('B'));
14367f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals("CD", abcdeTokener.next(2));
14467f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        try {
14567f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson            abcdeTokener.next(2);
14667f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson            fail();
14767f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        } catch (JSONException e) {
14867f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        }
14967f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals('E', abcdeTokener.nextClean());
15067f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals('\0', abcdeTokener.next());
15167f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertFalse(abcdeTokener.more());
15267f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        abcdeTokener.back();
15367f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertTrue(abcdeTokener.more());
15467f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals('E', abcdeTokener.next());
15567f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson    }
15667f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson
15767f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson    public void testBackNextAndMore() throws JSONException {
15867f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        JSONTokener abcTokener = new JSONTokener("ABC");
15967f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertTrue(abcTokener.more());
16067f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        abcTokener.next();
16167f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        abcTokener.next();
16267f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertTrue(abcTokener.more());
16367f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        abcTokener.next();
16467f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertFalse(abcTokener.more());
16567f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        abcTokener.back();
16667f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertTrue(abcTokener.more());
16767f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        abcTokener.next();
16867f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertFalse(abcTokener.more());
16967f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        abcTokener.back();
17067f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        abcTokener.back();
17167f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        abcTokener.back();
17251a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson        abcTokener.back(); // you can back up before the beginning of a String!
17367f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals('A', abcTokener.next());
17467f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson    }
17567f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson
17667f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson    public void testNextMatching() throws JSONException {
17767f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        JSONTokener abcdTokener = new JSONTokener("ABCD");
17867f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals('A', abcdTokener.next('A'));
17967f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        try {
18067f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson            abcdTokener.next('C'); // although it failed, this op consumes a character of input
18167f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson            fail();
18267f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        } catch (JSONException e) {
18367f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        }
18467f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals('C', abcdTokener.next('C'));
18567f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals('D', abcdTokener.next('D'));
18667f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        try {
18767f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson            abcdTokener.next('E');
18867f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson            fail();
18967f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        } catch (JSONException e) {
19067f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        }
19167f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson    }
19267f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson
19367f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson    public void testNextN() throws JSONException {
19467f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        JSONTokener abcdeTokener = new JSONTokener("ABCDEF");
19567f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals("", abcdeTokener.next(0));
19667f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        try {
19767f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson            abcdeTokener.next(7);
19867f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson            fail();
19967f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        } catch (JSONException e) {
20067f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        }
20167f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals("ABC", abcdeTokener.next(3));
20267f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        try {
20367f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson            abcdeTokener.next(4);
20467f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson            fail();
20567f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        } catch (JSONException e) {
20667f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        }
20751a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson    }
20851a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson
20951a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson    public void testNextNWithAllRemaining() throws JSONException {
21051a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson        JSONTokener tokener = new JSONTokener("ABCDEF");
21151a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson        tokener.next(3);
21267f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        try {
21351a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson            tokener.next(3);
21467f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        } catch (JSONException e) {
21551a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson            AssertionFailedError error = new AssertionFailedError("off-by-one error?");
21651a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson            error.initCause(e);
21751a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson            throw error;
21867f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        }
21951a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson    }
22051a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson
22151a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson    public void testNext0() throws JSONException {
22251a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson        JSONTokener tokener = new JSONTokener("ABCDEF");
22351a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson        tokener.next(5);
22451a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson        tokener.next();
22567f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        try {
22651a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson            tokener.next(0);
22767f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        } catch (JSONException e) {
22851a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson            Error error = new AssertionFailedError("Returning an empty string should be valid");
22951a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson            error.initCause(e);
23051a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson            throw error;
23167f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        }
23267f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson    }
23367f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson
23467f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson    public void testNextCleanComments() throws JSONException {
23567f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        JSONTokener tokener = new JSONTokener(
23667f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson                "  A  /*XX*/B/*XX//XX\n//XX\nXX*/C//X//X//X\nD/*X*///X\n");
23767f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals('A', tokener.nextClean());
23867f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals('B', tokener.nextClean());
23967f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals('C', tokener.nextClean());
24067f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals('D', tokener.nextClean());
24167f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals('\0', tokener.nextClean());
24267f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson    }
24367f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson
24451a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson    public void testNextCleanNestedCStyleComments() throws JSONException {
24551a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson        JSONTokener tokener = new JSONTokener("A /* B /* C */ D */ E");
24651a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson        assertEquals('A', tokener.nextClean());
24751a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson        assertEquals('D', tokener.nextClean());
24851a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson        assertEquals('*', tokener.nextClean());
24951a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson        assertEquals('/', tokener.nextClean());
25051a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson        assertEquals('E', tokener.nextClean());
25119554ec99d57e820a4c9da3bcde93d77b537d515Jesse Wilson    }
25219554ec99d57e820a4c9da3bcde93d77b537d515Jesse Wilson
25319554ec99d57e820a4c9da3bcde93d77b537d515Jesse Wilson    /**
25419554ec99d57e820a4c9da3bcde93d77b537d515Jesse Wilson     * Some applications rely on parsing '#' to lead an end-of-line comment.
25519554ec99d57e820a4c9da3bcde93d77b537d515Jesse Wilson     * http://b/2571423
25619554ec99d57e820a4c9da3bcde93d77b537d515Jesse Wilson     */
25719554ec99d57e820a4c9da3bcde93d77b537d515Jesse Wilson    public void testNextCleanHashComments() throws JSONException {
25819554ec99d57e820a4c9da3bcde93d77b537d515Jesse Wilson        JSONTokener tokener = new JSONTokener("A # B */ /* C */ \nD #");
25919554ec99d57e820a4c9da3bcde93d77b537d515Jesse Wilson        assertEquals('A', tokener.nextClean());
26019554ec99d57e820a4c9da3bcde93d77b537d515Jesse Wilson        assertEquals('D', tokener.nextClean());
26119554ec99d57e820a4c9da3bcde93d77b537d515Jesse Wilson        assertEquals('\0', tokener.nextClean());
26251a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson    }
26351a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson
26451a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson    public void testNextCleanCommentsTrailingSingleSlash() throws JSONException {
26551a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson        JSONTokener tokener = new JSONTokener(" / S /");
26651a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson        assertEquals('/', tokener.nextClean());
26751a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson        assertEquals('S', tokener.nextClean());
26851a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson        assertEquals('/', tokener.nextClean());
26951a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson        assertEquals("nextClean doesn't consume a trailing slash",
27051a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson                '\0', tokener.nextClean());
27151a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson    }
27251a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson
27367f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson    public void testNextCleanTrailingOpenComment() throws JSONException {
27467f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        try {
27567f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson            new JSONTokener("  /* ").nextClean();
27667f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson            fail();
27767f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        } catch (JSONException e) {
27867f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        }
27967f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals('\0', new JSONTokener("  // ").nextClean());
28067f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson    }
28167f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson
28267f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson    public void testNextCleanNewlineDelimiters() throws JSONException {
28367f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals('B', new JSONTokener("  // \r\n  B ").nextClean());
28467f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals('B', new JSONTokener("  // \n  B ").nextClean());
28567f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals('B', new JSONTokener("  // \r  B ").nextClean());
28667f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson    }
28767f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson
28851a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson    public void testNextCleanSkippedWhitespace() throws JSONException {
28951a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson        assertEquals("character tabulation", 'A', new JSONTokener("\tA").nextClean());
29051a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson        assertEquals("line feed",            'A', new JSONTokener("\nA").nextClean());
29151a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson        assertEquals("carriage return",      'A', new JSONTokener("\rA").nextClean());
29251a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson        assertEquals("space",                'A', new JSONTokener(" A").nextClean());
29351a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson    }
29451a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson
29567f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson    /**
29667f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson     * Tests which characters tokener treats as ignorable whitespace. See Kevin Bourrillion's
29767f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson     * <a href="https://spreadsheets.google.com/pub?key=pd8dAQyHbdewRsnE5x5GzKQ">list
29867f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson     * of whitespace characters</a>.
29967f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson     */
30051a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson    public void testNextCleanRetainedWhitespace() throws JSONException {
30151a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson        assertNotClean("null",                      '\u0000');
30251a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson        assertNotClean("next line",                 '\u0085');
30351a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson        assertNotClean("non-breaking space",        '\u00a0');
30451a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson        assertNotClean("ogham space mark",          '\u1680');
30551a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson        assertNotClean("mongolian vowel separator", '\u180e');
30651a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson        assertNotClean("en quad",                   '\u2000');
30751a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson        assertNotClean("em quad",                   '\u2001');
30851a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson        assertNotClean("en space",                  '\u2002');
30951a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson        assertNotClean("em space",                  '\u2003');
31051a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson        assertNotClean("three-per-em space",        '\u2004');
31151a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson        assertNotClean("four-per-em space",         '\u2005');
31251a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson        assertNotClean("six-per-em space",          '\u2006');
31351a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson        assertNotClean("figure space",              '\u2007');
31451a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson        assertNotClean("punctuation space",         '\u2008');
31551a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson        assertNotClean("thin space",                '\u2009');
31651a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson        assertNotClean("hair space",                '\u200a');
31751a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson        assertNotClean("zero-width space",          '\u200b');
31851a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson        assertNotClean("left-to-right mark",        '\u200e');
31951a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson        assertNotClean("right-to-left mark",        '\u200f');
32051a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson        assertNotClean("line separator",            '\u2028');
32151a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson        assertNotClean("paragraph separator",       '\u2029');
32251a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson        assertNotClean("narrow non-breaking space", '\u202f');
32351a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson        assertNotClean("medium mathematical space", '\u205f');
32451a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson        assertNotClean("ideographic space",         '\u3000');
32551a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson        assertNotClean("line tabulation",           '\u000b');
32651a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson        assertNotClean("form feed",                 '\u000c');
32751a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson        assertNotClean("information separator 4",   '\u001c');
32851a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson        assertNotClean("information separator 3",   '\u001d');
32951a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson        assertNotClean("information separator 2",   '\u001e');
33051a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson        assertNotClean("information separator 1",   '\u001f');
33151a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson    }
33251a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson
33351a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson    private void assertNotClean(String name, char c) throws JSONException {
33451a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson        assertEquals("The character " + name + " is not whitespace according to the JSON spec.",
33551a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson                c, new JSONTokener(new String(new char[] { c, 'A' })).nextClean());
33667f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson    }
33767f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson
33867f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson    public void testNextString() throws JSONException {
33967f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals("", new JSONTokener("'").nextString('\''));
34067f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals("", new JSONTokener("\"").nextString('\"'));
34167f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals("ABC", new JSONTokener("ABC'DEF").nextString('\''));
34267f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals("ABC", new JSONTokener("ABC'''DEF").nextString('\''));
34367f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson
344f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        // nextString permits slash-escaping of arbitrary characters!
34567f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals("ABC", new JSONTokener("A\\B\\C'DEF").nextString('\''));
34667f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson
34767f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        JSONTokener tokener = new JSONTokener(" 'abc' 'def' \"ghi\"");
34867f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        tokener.next();
34967f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals('\'', tokener.next());
35067f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals("abc", tokener.nextString('\''));
35167f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        tokener.next();
35267f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals('\'', tokener.next());
35367f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals("def", tokener.nextString('\''));
35467f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        tokener.next();
35567f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals('"', tokener.next());
35667f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals("ghi", tokener.nextString('\"'));
35767f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertFalse(tokener.more());
35867f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson    }
35967f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson
36067f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson    public void testNextStringNoDelimiter() throws JSONException {
36167f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        try {
36267f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson            new JSONTokener("").nextString('\'');
36367f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson            fail();
36467f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        } catch (JSONException e) {
36567f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        }
36667f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson
36767f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        JSONTokener tokener = new JSONTokener(" 'abc");
36867f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        tokener.next();
36967f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        tokener.next();
37067f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        try {
37167f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson            tokener.next('\'');
37267f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson            fail();
37367f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        } catch (JSONException e) {
37467f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        }
37567f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson    }
37667f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson
37767f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson    public void testNextStringEscapedQuote() throws JSONException {
37867f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        try {
37967f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson            new JSONTokener("abc\\").nextString('"');
38067f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson            fail();
38167f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        } catch (JSONException e) {
38267f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        }
38367f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson
38467f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        // we're mixing Java escaping like \" and JavaScript escaping like \\\"
38567f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        // which makes these tests extra tricky to read!
38667f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals("abc\"def", new JSONTokener("abc\\\"def\"ghi").nextString('"'));
38767f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals("abc\\def", new JSONTokener("abc\\\\def\"ghi").nextString('"'));
38867f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals("abc/def", new JSONTokener("abc\\/def\"ghi").nextString('"'));
38967f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals("abc\bdef", new JSONTokener("abc\\bdef\"ghi").nextString('"'));
39067f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals("abc\fdef", new JSONTokener("abc\\fdef\"ghi").nextString('"'));
39167f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals("abc\ndef", new JSONTokener("abc\\ndef\"ghi").nextString('"'));
39267f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals("abc\rdef", new JSONTokener("abc\\rdef\"ghi").nextString('"'));
39367f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals("abc\tdef", new JSONTokener("abc\\tdef\"ghi").nextString('"'));
39467f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson    }
39567f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson
39667f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson    public void testNextStringUnicodeEscaped() throws JSONException {
39767f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        // we're mixing Java escaping like \\ and JavaScript escaping like \\u
39867f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals("abc def", new JSONTokener("abc\\u0020def\"ghi").nextString('"'));
39967f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals("abcU0020def", new JSONTokener("abc\\U0020def\"ghi").nextString('"'));
40067f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson
40167f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        // JSON requires 4 hex characters after a unicode escape
40267f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        try {
40367f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson            new JSONTokener("abc\\u002\"").nextString('"');
40467f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson            fail();
40567f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        } catch (JSONException e) {
40667f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        }
40767f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        try {
40867f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson            new JSONTokener("abc\\u").nextString('"');
40967f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson            fail();
41067f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        } catch (JSONException e) {
41167f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        }
41267f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        try {
41367f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson            new JSONTokener("abc\\u    \"").nextString('"');
41467f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson            fail();
415c75cd0a51c12a49893977532f6fac03f2beca21bElliott Hughes        } catch (JSONException e) {
41667f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        }
41767f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals("abc\"def", new JSONTokener("abc\\u0022def\"ghi").nextString('"'));
41867f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        try {
41967f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson            new JSONTokener("abc\\u000G\"").nextString('"');
42067f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson            fail();
421c75cd0a51c12a49893977532f6fac03f2beca21bElliott Hughes        } catch (JSONException e) {
42267f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        }
42367f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson    }
42467f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson
42567f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson    public void testNextStringNonQuote() throws JSONException {
42667f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals("AB", new JSONTokener("ABC").nextString('C'));
42767f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals("ABCD", new JSONTokener("AB\\CDC").nextString('C'));
42867f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals("AB\nC", new JSONTokener("AB\\nCn").nextString('n'));
42967f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson    }
43067f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson
43167f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson    public void testNextTo() throws JSONException {
43267f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals("ABC", new JSONTokener("ABCDEFG").nextTo("DHI"));
43367f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals("ABCDEF", new JSONTokener("ABCDEF").nextTo(""));
43467f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson
43567f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        JSONTokener tokener = new JSONTokener("ABC\rDEF\nGHI\r\nJKL");
43667f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals("ABC", tokener.nextTo("M"));
43767f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals('\r', tokener.next());
43867f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals("DEF", tokener.nextTo("M"));
43967f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals('\n', tokener.next());
44067f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals("GHI", tokener.nextTo("M"));
44167f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals('\r', tokener.next());
44267f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals('\n', tokener.next());
44367f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals("JKL", tokener.nextTo("M"));
44467f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson
44567f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        tokener = new JSONTokener("ABCDEFGHI");
44667f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals("ABC", tokener.nextTo("DEF"));
44767f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals("", tokener.nextTo("DEF"));
44867f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals('D', tokener.next());
44967f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals("", tokener.nextTo("DEF"));
45067f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals('E', tokener.next());
45167f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals("", tokener.nextTo("DEF"));
45267f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals('F', tokener.next());
45367f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals("GHI", tokener.nextTo("DEF"));
45467f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals("", tokener.nextTo("DEF"));
45567f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson
45667f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        tokener = new JSONTokener(" \t \fABC \t DEF");
45767f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals("ABC", tokener.nextTo("DEF"));
45867f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals('D', tokener.next());
45967f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson
46067f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        tokener = new JSONTokener(" \t \fABC \n DEF");
46167f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals("ABC", tokener.nextTo("\n"));
46267f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals("", tokener.nextTo("\n"));
46367f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson
46467f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        tokener = new JSONTokener("");
46567f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        try {
46667f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson            tokener.nextTo(null);
46767f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson            fail();
46867f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        } catch (NullPointerException e) {
46967f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        }
47067f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson    }
47167f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson
47251a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson    public void testNextToTrimming() {
47351a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson        assertEquals("ABC", new JSONTokener("\t ABC \tDEF").nextTo("DE"));
47451a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson        assertEquals("ABC", new JSONTokener("\t ABC \tDEF").nextTo('D'));
47551a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson    }
47651a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson
47751a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson    public void testNextToTrailing() {
47851a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson        assertEquals("ABC DEF", new JSONTokener("\t ABC DEF \t").nextTo("G"));
47951a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson        assertEquals("ABC DEF", new JSONTokener("\t ABC DEF \t").nextTo('G'));
48051a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson    }
48151a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson
48251a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson    public void testNextToDoesntStopOnNull() {
48351a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson        String message = "nextTo() shouldn't stop after \\0 characters";
48451a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson        JSONTokener tokener = new JSONTokener(" \0\t \fABC \n DEF");
48551a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson        assertEquals(message, "ABC", tokener.nextTo("D"));
48651a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson        assertEquals(message, '\n', tokener.next());
48751a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson        assertEquals(message, "", tokener.nextTo("D"));
48851a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson    }
48951a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson
49051a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson    public void testNextToConsumesNull() {
49151a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson        String message = "nextTo shouldn't consume \\0.";
49251a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson        JSONTokener tokener = new JSONTokener("ABC\0DEF");
49351a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson        assertEquals(message, "ABC", tokener.nextTo("\0"));
49451a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson        assertEquals(message, '\0', tokener.next());
49551a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson        assertEquals(message, "DEF", tokener.nextTo("\0"));
49651a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson    }
49751a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson
49867f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson    public void testSkipPast() {
49967f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        JSONTokener tokener = new JSONTokener("ABCDEF");
50067f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        tokener.skipPast("ABC");
50167f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals('D', tokener.next());
50267f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        tokener.skipPast("EF");
50367f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals('\0', tokener.next());
50467f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson
50567f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        tokener = new JSONTokener("ABCDEF");
50667f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        tokener.skipPast("ABCDEF");
50767f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals('\0', tokener.next());
50867f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson
50967f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        tokener = new JSONTokener("ABCDEF");
51067f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        tokener.skipPast("G");
51167f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals('\0', tokener.next());
51267f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson
51367f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        tokener = new JSONTokener("ABC\0ABC");
51467f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        tokener.skipPast("ABC");
51567f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals('\0', tokener.next());
51667f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals('A', tokener.next());
51767f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson
51867f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        tokener = new JSONTokener("\0ABC");
51967f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        tokener.skipPast("ABC");
52067f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals('\0', tokener.next());
52167f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson
52267f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        tokener = new JSONTokener("ABC\nDEF");
52367f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        tokener.skipPast("DEF");
52467f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals('\0', tokener.next());
52567f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson
52667f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        tokener = new JSONTokener("ABC");
52767f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        tokener.skipPast("ABCDEF");
52867f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals('\0', tokener.next());
52967f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson
53067f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        tokener = new JSONTokener("ABCDABCDABCD");
53167f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        tokener.skipPast("ABC");
53267f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals('D', tokener.next());
53367f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        tokener.skipPast("ABC");
53467f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals('D', tokener.next());
53567f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        tokener.skipPast("ABC");
53667f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals('D', tokener.next());
53767f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson
53867f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        tokener = new JSONTokener("");
53967f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        try {
54067f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson            tokener.skipPast(null);
54167f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson            fail();
54267f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        } catch (NullPointerException e) {
54367f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        }
54467f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson    }
54567f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson
54667f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson    public void testSkipTo() {
54767f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        JSONTokener tokener = new JSONTokener("ABCDEF");
54867f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        tokener.skipTo('A');
54967f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals('A', tokener.next());
55067f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        tokener.skipTo('D');
55167f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals('D', tokener.next());
55267f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        tokener.skipTo('G');
55367f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals('E', tokener.next());
55467f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        tokener.skipTo('A');
55567f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals('F', tokener.next());
55667f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson
55767f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        tokener = new JSONTokener("ABC\nDEF");
55867f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        tokener.skipTo('F');
55967f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals('F', tokener.next());
56067f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson
56167f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        tokener = new JSONTokener("ABCfDEF");
56267f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        tokener.skipTo('F');
56367f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals('F', tokener.next());
56467f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson
56567f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        tokener = new JSONTokener("ABC/* DEF */");
56667f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        tokener.skipTo('D');
56767f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals('D', tokener.next());
56867f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson    }
56967f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson
57051a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson    public void testSkipToStopsOnNull() {
57151a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson        JSONTokener tokener = new JSONTokener("ABC\0DEF");
57251a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson        tokener.skipTo('F');
57351a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson        assertEquals("skipTo shouldn't stop when it sees '\\0'", 'F', tokener.next());
57451a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson    }
57551a095f0bc7aadfcc7e6b3873b97c050c523d102Jesse Wilson
576037fb18dd4ba3f54c5b2fb5386c5673e1db5babfJesse Wilson    public void testBomIgnoredAsFirstCharacterOfDocument() throws JSONException {
577037fb18dd4ba3f54c5b2fb5386c5673e1db5babfJesse Wilson        JSONTokener tokener = new JSONTokener("\ufeff[]");
578037fb18dd4ba3f54c5b2fb5386c5673e1db5babfJesse Wilson        JSONArray array = (JSONArray) tokener.nextValue();
579037fb18dd4ba3f54c5b2fb5386c5673e1db5babfJesse Wilson        assertEquals(0, array.length());
580037fb18dd4ba3f54c5b2fb5386c5673e1db5babfJesse Wilson    }
581037fb18dd4ba3f54c5b2fb5386c5673e1db5babfJesse Wilson
582037fb18dd4ba3f54c5b2fb5386c5673e1db5babfJesse Wilson    public void testBomTreatedAsCharacterInRestOfDocument() throws JSONException {
583037fb18dd4ba3f54c5b2fb5386c5673e1db5babfJesse Wilson        JSONTokener tokener = new JSONTokener("[\ufeff]");
584037fb18dd4ba3f54c5b2fb5386c5673e1db5babfJesse Wilson        JSONArray array = (JSONArray) tokener.nextValue();
585037fb18dd4ba3f54c5b2fb5386c5673e1db5babfJesse Wilson        assertEquals(1, array.length());
586037fb18dd4ba3f54c5b2fb5386c5673e1db5babfJesse Wilson    }
587037fb18dd4ba3f54c5b2fb5386c5673e1db5babfJesse Wilson
58867f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson    public void testDehexchar() {
58967f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals( 0, JSONTokener.dehexchar('0'));
59067f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals( 1, JSONTokener.dehexchar('1'));
59167f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals( 2, JSONTokener.dehexchar('2'));
59267f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals( 3, JSONTokener.dehexchar('3'));
59367f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals( 4, JSONTokener.dehexchar('4'));
59467f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals( 5, JSONTokener.dehexchar('5'));
59567f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals( 6, JSONTokener.dehexchar('6'));
59667f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals( 7, JSONTokener.dehexchar('7'));
59767f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals( 8, JSONTokener.dehexchar('8'));
59867f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals( 9, JSONTokener.dehexchar('9'));
59967f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals(10, JSONTokener.dehexchar('A'));
60067f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals(11, JSONTokener.dehexchar('B'));
60167f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals(12, JSONTokener.dehexchar('C'));
60267f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals(13, JSONTokener.dehexchar('D'));
60367f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals(14, JSONTokener.dehexchar('E'));
60467f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals(15, JSONTokener.dehexchar('F'));
60567f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals(10, JSONTokener.dehexchar('a'));
60667f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals(11, JSONTokener.dehexchar('b'));
60767f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals(12, JSONTokener.dehexchar('c'));
60867f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals(13, JSONTokener.dehexchar('d'));
60967f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals(14, JSONTokener.dehexchar('e'));
61067f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        assertEquals(15, JSONTokener.dehexchar('f'));
61167f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson
61267f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        for (int c = 0; c <= 0xFFFF; c++) {
61367f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson            if ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f')) {
61467f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson                continue;
61567f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson            }
61667f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson            assertEquals("dehexchar " + c, -1, JSONTokener.dehexchar((char) c));
61767f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson        }
61867f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson    }
61967f4459a2fcc50cb3378c302b6c663af48f60ff0Jesse Wilson}
620