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