19b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka/* 29b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka * Copyright (C) 2010 The Android Open Source Project 39b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka * 4ce6bcdd1a547c9874f05a08074cafdfea16196d6Tadashi G. Takaoka * Licensed under the Apache License, Version 2.0 (the "License"); 5ce6bcdd1a547c9874f05a08074cafdfea16196d6Tadashi G. Takaoka * you may not use this file except in compliance with the License. 6ce6bcdd1a547c9874f05a08074cafdfea16196d6Tadashi G. Takaoka * You may obtain a copy of the License at 79b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka * 8ce6bcdd1a547c9874f05a08074cafdfea16196d6Tadashi G. Takaoka * http://www.apache.org/licenses/LICENSE-2.0 99b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka * 109b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka * Unless required by applicable law or agreed to in writing, software 11ce6bcdd1a547c9874f05a08074cafdfea16196d6Tadashi G. Takaoka * distributed under the License is distributed on an "AS IS" BASIS, 12ce6bcdd1a547c9874f05a08074cafdfea16196d6Tadashi G. Takaoka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ce6bcdd1a547c9874f05a08074cafdfea16196d6Tadashi G. Takaoka * See the License for the specific language governing permissions and 14ce6bcdd1a547c9874f05a08074cafdfea16196d6Tadashi G. Takaoka * limitations under the License. 159b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka */ 169b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka 1772934bd5967d0127f71fd4d66158b18b4e6ceefeTadashi G. Takaokapackage com.android.inputmethod.keyboard.internal; 189b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka 199a5bf1d12ea3c8714e5702cdb07753e0325185acTadashi G. Takaokaimport android.app.Instrumentation; 208586a43424bc9e53dd7a01c5bf2214ba317da43bTadashi G. Takaokaimport android.content.Context; 218586a43424bc9e53dd7a01c5bf2214ba317da43bTadashi G. Takaokaimport android.content.res.Resources; 229a5bf1d12ea3c8714e5702cdb07753e0325185acTadashi G. Takaokaimport android.test.InstrumentationTestCase; 23307f49b8c1e954cfcba4f12ff74b22803825ca15Tadashi G. Takaokaimport android.test.suitebuilder.annotation.MediumTest; 249b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka 25e28eba5074664d5716b8e58b8d0a235746b261ebKen Wakasaimport com.android.inputmethod.latin.utils.CollectionUtils; 260c3a9b549c3ff9bdf47c52cf59347f7e111dd183Tadashi G. Takaokaimport com.android.inputmethod.latin.utils.RunInLocale; 275f282ea9e4a4590fcbab6e27d5fca7dacbb40a6aTadashi G. Takaoka 282be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaokaimport java.lang.reflect.Field; 292be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaokaimport java.util.ArrayList; 30e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaokaimport java.util.Arrays; 312be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaokaimport java.util.Locale; 32e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka 33307f49b8c1e954cfcba4f12ff74b22803825ca15Tadashi G. Takaoka@MediumTest 34dbed20ad8d48e9b42b52c522c54bfd9e62553f7aTadashi G. Takaokapublic class KeySpecParserSplitTests extends InstrumentationTestCase { 358586a43424bc9e53dd7a01c5bf2214ba317da43bTadashi G. Takaoka private static final Locale TEST_LOCALE = Locale.ENGLISH; 368586a43424bc9e53dd7a01c5bf2214ba317da43bTadashi G. Takaoka final KeyboardTextsSet mTextsSet = new KeyboardTextsSet(); 37e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka 38e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka @Override 39e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka protected void setUp() throws Exception { 40e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka super.setUp(); 41e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka 429a5bf1d12ea3c8714e5702cdb07753e0325185acTadashi G. Takaoka final Instrumentation instrumentation = getInstrumentation(); 438586a43424bc9e53dd7a01c5bf2214ba317da43bTadashi G. Takaoka final Context targetContext = instrumentation.getTargetContext(); 448586a43424bc9e53dd7a01c5bf2214ba317da43bTadashi G. Takaoka mTextsSet.setLanguage(TEST_LOCALE.getLanguage()); 458586a43424bc9e53dd7a01c5bf2214ba317da43bTadashi G. Takaoka new RunInLocale<Void>() { 468586a43424bc9e53dd7a01c5bf2214ba317da43bTadashi G. Takaoka @Override 478586a43424bc9e53dd7a01c5bf2214ba317da43bTadashi G. Takaoka protected Void job(final Resources res) { 488586a43424bc9e53dd7a01c5bf2214ba317da43bTadashi G. Takaoka mTextsSet.loadStringResources(targetContext); 498586a43424bc9e53dd7a01c5bf2214ba317da43bTadashi G. Takaoka return null; 508586a43424bc9e53dd7a01c5bf2214ba317da43bTadashi G. Takaoka } 518586a43424bc9e53dd7a01c5bf2214ba317da43bTadashi G. Takaoka }.runInLocale(targetContext.getResources(), TEST_LOCALE); 522be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka final String[] testResourceNames = getAllResourceIdNames( 532be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka com.android.inputmethod.latin.tests.R.string.class); 54b80cc628ff793b51ccc443708d97c34f385e7841Tadashi G. Takaoka mTextsSet.loadStringResourcesInternal(instrumentation.getContext(), testResourceNames, 55b80cc628ff793b51ccc443708d97c34f385e7841Tadashi G. Takaoka // This dummy raw resource is needed to be able to load string resources from a test 56b80cc628ff793b51ccc443708d97c34f385e7841Tadashi G. Takaoka // APK successfully. 57b80cc628ff793b51ccc443708d97c34f385e7841Tadashi G. Takaoka com.android.inputmethod.latin.tests.R.raw.dummy_resource_for_testing); 582be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka } 592be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka 602be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka private static String[] getAllResourceIdNames(final Class<?> resourceIdClass) { 615f282ea9e4a4590fcbab6e27d5fca7dacbb40a6aTadashi G. Takaoka final ArrayList<String> names = CollectionUtils.newArrayList(); 622be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka for (final Field field : resourceIdClass.getFields()) { 632be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka if (field.getType() == Integer.TYPE) { 642be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka names.add(field.getName()); 652be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka } 662be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka } 672be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka return names.toArray(new String[names.size()]); 68e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka } 69e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka 7035091716e781c7ddb618bb4c251c5f43b6643f3eTadashi G. Takaoka private static <T> void assertArrayEquals(final String message, final T[] expected, 7135091716e781c7ddb618bb4c251c5f43b6643f3eTadashi G. Takaoka final T[] actual) { 722f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka if (expected == actual) { 739b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka return; 749b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka } 752f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka if (expected == null || actual == null) { 762f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka assertEquals(message, Arrays.toString(expected), Arrays.toString(actual)); 772f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka return; 782f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka } 792f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka if (expected.length != actual.length) { 802f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka assertEquals(message + " [length]", Arrays.toString(expected), Arrays.toString(actual)); 812f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka return; 822f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka } 832f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka for (int i = 0; i < expected.length; i++) { 8435091716e781c7ddb618bb4c251c5f43b6643f3eTadashi G. Takaoka final T e = expected[i]; 8535091716e781c7ddb618bb4c251c5f43b6643f3eTadashi G. Takaoka final T a = actual[i]; 8635091716e781c7ddb618bb4c251c5f43b6643f3eTadashi G. Takaoka if (e == a) { 8735091716e781c7ddb618bb4c251c5f43b6643f3eTadashi G. Takaoka continue; 8835091716e781c7ddb618bb4c251c5f43b6643f3eTadashi G. Takaoka } 8935091716e781c7ddb618bb4c251c5f43b6643f3eTadashi G. Takaoka assertEquals(message + " [" + i + "]", e, a); 909b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka } 919b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka } 929b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka 939f3774c194bb28aa8e9df0786cb9d71e1cf72315Tadashi G. Takaoka private void assertTextArray(final String message, final String value, 949f3774c194bb28aa8e9df0786cb9d71e1cf72315Tadashi G. Takaoka final String ... expectedArray) { 95b3fd70118119e736209173d34053974e61f936d8Tadashi G. Takaoka final String resolvedActual = KeySpecParser.resolveTextReference(value, mTextsSet); 96dbed20ad8d48e9b42b52c522c54bfd9e62553f7aTadashi G. Takaoka final String[] actual = KeySpecParser.splitKeySpecs(resolvedActual); 972f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka final String[] expected = (expectedArray.length == 0) ? null : expectedArray; 982f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka assertArrayEquals(message, expected, actual); 992f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka } 1002f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka 1019f3774c194bb28aa8e9df0786cb9d71e1cf72315Tadashi G. Takaoka private void assertError(final String message, final String value, final String ... expected) { 102e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka try { 103e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka assertTextArray(message, value, expected); 104e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka fail(message); 105e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka } catch (Exception pcpe) { 106e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka // success. 107e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka } 108e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka } 109e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka 110e01d272603f3643ce613e61dd3204379f4f4fb73Tadashi G. Takaoka // \U001d11e: MUSICAL SYMBOL G CLEF 111e01d272603f3643ce613e61dd3204379f4f4fb73Tadashi G. Takaoka private static final String PAIR1 = "\ud834\udd1e"; 112e01d272603f3643ce613e61dd3204379f4f4fb73Tadashi G. Takaoka // \U001d122: MUSICAL SYMBOL F CLEF 113e01d272603f3643ce613e61dd3204379f4f4fb73Tadashi G. Takaoka private static final String PAIR2 = "\ud834\udd22"; 114e01d272603f3643ce613e61dd3204379f4f4fb73Tadashi G. Takaoka // \U002f8a6: CJK COMPATIBILITY IDEOGRAPH-2F8A6; variant character of \u6148. 115e01d272603f3643ce613e61dd3204379f4f4fb73Tadashi G. Takaoka private static final String PAIR3 = "\ud87e\udca6"; 116e01d272603f3643ce613e61dd3204379f4f4fb73Tadashi G. Takaoka private static final String SURROGATE1 = PAIR1 + PAIR2; 117e01d272603f3643ce613e61dd3204379f4f4fb73Tadashi G. Takaoka private static final String SURROGATE2 = PAIR1 + PAIR2 + PAIR3; 118e01d272603f3643ce613e61dd3204379f4f4fb73Tadashi G. Takaoka 119dbed20ad8d48e9b42b52c522c54bfd9e62553f7aTadashi G. Takaoka public void testSplitZero() { 1209b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka assertTextArray("Empty string", ""); 12124cd2617f527d3d52c7fa36463002c47024083c8Tadashi G. Takaoka assertTextArray("Empty entry", ","); 12224cd2617f527d3d52c7fa36463002c47024083c8Tadashi G. Takaoka assertTextArray("Empty entry at beginning", ",a", "a"); 12324cd2617f527d3d52c7fa36463002c47024083c8Tadashi G. Takaoka assertTextArray("Empty entry at end", "a,", "a"); 12424cd2617f527d3d52c7fa36463002c47024083c8Tadashi G. Takaoka assertTextArray("Empty entry at middle", "a,,b", "a", "b"); 12524cd2617f527d3d52c7fa36463002c47024083c8Tadashi G. Takaoka assertTextArray("Empty entries with escape", ",a,b\\,c,,d,", "a", "b\\,c", "d"); 1269b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka } 1279b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka 128dbed20ad8d48e9b42b52c522c54bfd9e62553f7aTadashi G. Takaoka public void testSplitSingle() { 1299b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka assertTextArray("Single char", "a", "a"); 130e01d272603f3643ce613e61dd3204379f4f4fb73Tadashi G. Takaoka assertTextArray("Surrogate pair", PAIR1, PAIR1); 1315852a2594f4cce518e0b18069c895c2f8561d093Tadashi G. Takaoka assertTextArray("Single escape", "\\", "\\"); 1329b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka assertTextArray("Space", " ", " "); 1339b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka assertTextArray("Single label", "abc", "abc"); 13424cd2617f527d3d52c7fa36463002c47024083c8Tadashi G. Takaoka assertTextArray("Single surrogate pairs label", SURROGATE2, SURROGATE2); 1359b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka assertTextArray("Spaces", " ", " "); 1369b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka assertTextArray("Spaces in label", "a b c", "a b c"); 1379b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka assertTextArray("Spaces at beginning of label", " abc", " abc"); 1389b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka assertTextArray("Spaces at end of label", "abc ", "abc "); 139e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka assertTextArray("Label surrounded by spaces", " abc ", " abc "); 140e01d272603f3643ce613e61dd3204379f4f4fb73Tadashi G. Takaoka assertTextArray("Surrogate pair surrounded by space", 141e01d272603f3643ce613e61dd3204379f4f4fb73Tadashi G. Takaoka " " + PAIR1 + " ", 142e01d272603f3643ce613e61dd3204379f4f4fb73Tadashi G. Takaoka " " + PAIR1 + " "); 143e01d272603f3643ce613e61dd3204379f4f4fb73Tadashi G. Takaoka assertTextArray("Surrogate pair within characters", 144e01d272603f3643ce613e61dd3204379f4f4fb73Tadashi G. Takaoka "ab" + PAIR2 + "cd", 145e01d272603f3643ce613e61dd3204379f4f4fb73Tadashi G. Takaoka "ab" + PAIR2 + "cd"); 146e01d272603f3643ce613e61dd3204379f4f4fb73Tadashi G. Takaoka assertTextArray("Surrogate pairs within characters", 147e01d272603f3643ce613e61dd3204379f4f4fb73Tadashi G. Takaoka "ab" + SURROGATE1 + "cd", 148e01d272603f3643ce613e61dd3204379f4f4fb73Tadashi G. Takaoka "ab" + SURROGATE1 + "cd"); 149e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka 1506bfd5f631908c4afd893c9b25b353e5e16c5fc0cTadashi G. Takaoka assertTextArray("Incomplete resource reference 1", "text", "text"); 1516bfd5f631908c4afd893c9b25b353e5e16c5fc0cTadashi G. Takaoka assertTextArray("Incomplete resource reference 2", "!text", "!text"); 1526bfd5f631908c4afd893c9b25b353e5e16c5fc0cTadashi G. Takaoka assertTextArray("Incomplete RESOURCE REFERENCE 2", "!TEXT", "!TEXT"); 1536bfd5f631908c4afd893c9b25b353e5e16c5fc0cTadashi G. Takaoka assertTextArray("Incomplete resource reference 3", "text/", "text/"); 1542be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka assertTextArray("Incomplete resource reference 4", "!" + SURROGATE2, "!" + SURROGATE2); 1559b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka } 1569b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka 157dbed20ad8d48e9b42b52c522c54bfd9e62553f7aTadashi G. Takaoka public void testSplitSingleEscaped() { 1585852a2594f4cce518e0b18069c895c2f8561d093Tadashi G. Takaoka assertTextArray("Escaped char", "\\a", "\\a"); 1595852a2594f4cce518e0b18069c895c2f8561d093Tadashi G. Takaoka assertTextArray("Escaped surrogate pair", "\\" + PAIR1, "\\" + PAIR1); 1605852a2594f4cce518e0b18069c895c2f8561d093Tadashi G. Takaoka assertTextArray("Escaped comma", "\\,", "\\,"); 1615852a2594f4cce518e0b18069c895c2f8561d093Tadashi G. Takaoka assertTextArray("Escaped comma escape", "a\\,\\", "a\\,\\"); 1625852a2594f4cce518e0b18069c895c2f8561d093Tadashi G. Takaoka assertTextArray("Escaped escape", "\\\\", "\\\\"); 1635852a2594f4cce518e0b18069c895c2f8561d093Tadashi G. Takaoka assertTextArray("Escaped label", "a\\bc", "a\\bc"); 1645852a2594f4cce518e0b18069c895c2f8561d093Tadashi G. Takaoka assertTextArray("Escaped surrogate", "a\\" + PAIR1 + "c", "a\\" + PAIR1 + "c"); 1655852a2594f4cce518e0b18069c895c2f8561d093Tadashi G. Takaoka assertTextArray("Escaped label at beginning", "\\abc", "\\abc"); 1665852a2594f4cce518e0b18069c895c2f8561d093Tadashi G. Takaoka assertTextArray("Escaped surrogate at beginning", "\\" + SURROGATE2, "\\" + SURROGATE2); 1675852a2594f4cce518e0b18069c895c2f8561d093Tadashi G. Takaoka assertTextArray("Escaped label at end", "abc\\", "abc\\"); 1685852a2594f4cce518e0b18069c895c2f8561d093Tadashi G. Takaoka assertTextArray("Escaped surrogate at end", SURROGATE2 + "\\", SURROGATE2 + "\\"); 1695852a2594f4cce518e0b18069c895c2f8561d093Tadashi G. Takaoka assertTextArray("Escaped label with comma", "a\\,c", "a\\,c"); 1705852a2594f4cce518e0b18069c895c2f8561d093Tadashi G. Takaoka assertTextArray("Escaped surrogate with comma", 1715852a2594f4cce518e0b18069c895c2f8561d093Tadashi G. Takaoka PAIR1 + "\\," + PAIR2, PAIR1 + "\\," + PAIR2); 1725852a2594f4cce518e0b18069c895c2f8561d093Tadashi G. Takaoka assertTextArray("Escaped label with comma at beginning", "\\,bc", "\\,bc"); 173e01d272603f3643ce613e61dd3204379f4f4fb73Tadashi G. Takaoka assertTextArray("Escaped surrogate with comma at beginning", 1745852a2594f4cce518e0b18069c895c2f8561d093Tadashi G. Takaoka "\\," + SURROGATE1, "\\," + SURROGATE1); 1755852a2594f4cce518e0b18069c895c2f8561d093Tadashi G. Takaoka assertTextArray("Escaped label with comma at end", "ab\\,", "ab\\,"); 1765852a2594f4cce518e0b18069c895c2f8561d093Tadashi G. Takaoka assertTextArray("Escaped surrogate with comma at end", 1775852a2594f4cce518e0b18069c895c2f8561d093Tadashi G. Takaoka SURROGATE2 + "\\,", SURROGATE2 + "\\,"); 1785852a2594f4cce518e0b18069c895c2f8561d093Tadashi G. Takaoka assertTextArray("Escaped label with successive", "\\,\\\\bc", "\\,\\\\bc"); 179e01d272603f3643ce613e61dd3204379f4f4fb73Tadashi G. Takaoka assertTextArray("Escaped surrogate with successive", 1805852a2594f4cce518e0b18069c895c2f8561d093Tadashi G. Takaoka "\\,\\\\" + SURROGATE1, "\\,\\\\" + SURROGATE1); 1815852a2594f4cce518e0b18069c895c2f8561d093Tadashi G. Takaoka assertTextArray("Escaped label with escape", "a\\\\c", "a\\\\c"); 182e01d272603f3643ce613e61dd3204379f4f4fb73Tadashi G. Takaoka assertTextArray("Escaped surrogate with escape", 1835852a2594f4cce518e0b18069c895c2f8561d093Tadashi G. Takaoka PAIR1 + "\\\\" + PAIR2, PAIR1 + "\\\\" + PAIR2); 184e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka 1856bfd5f631908c4afd893c9b25b353e5e16c5fc0cTadashi G. Takaoka assertTextArray("Escaped !text", "\\!text", "\\!text"); 1866bfd5f631908c4afd893c9b25b353e5e16c5fc0cTadashi G. Takaoka assertTextArray("Escaped !text/", "\\!text/", "\\!text/"); 1876bfd5f631908c4afd893c9b25b353e5e16c5fc0cTadashi G. Takaoka assertTextArray("Escaped !TEXT/", "\\!TEXT/", "\\!TEXT/"); 1886bfd5f631908c4afd893c9b25b353e5e16c5fc0cTadashi G. Takaoka assertTextArray("Escaped !text/name", "\\!text/empty_string", "\\!text/empty_string"); 1896bfd5f631908c4afd893c9b25b353e5e16c5fc0cTadashi G. Takaoka assertTextArray("Escaped !TEXT/NAME", "\\!TEXT/EMPTY_STRING", "\\!TEXT/EMPTY_STRING"); 1909b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka } 1919b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka 192dbed20ad8d48e9b42b52c522c54bfd9e62553f7aTadashi G. Takaoka public void testSplitMulti() { 1939b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka assertTextArray("Multiple chars", "a,b,c", "a", "b", "c"); 1945852a2594f4cce518e0b18069c895c2f8561d093Tadashi G. Takaoka assertTextArray("Multiple chars", "a,b,\\c", "a", "b", "\\c"); 1955852a2594f4cce518e0b18069c895c2f8561d093Tadashi G. Takaoka assertTextArray("Multiple chars and escape at beginning and end", 1965852a2594f4cce518e0b18069c895c2f8561d093Tadashi G. Takaoka "\\a,b,\\c\\", "\\a", "b", "\\c\\"); 197e01d272603f3643ce613e61dd3204379f4f4fb73Tadashi G. Takaoka assertTextArray("Multiple surrogates", PAIR1 + "," + PAIR2 + "," + PAIR3, 198e01d272603f3643ce613e61dd3204379f4f4fb73Tadashi G. Takaoka PAIR1, PAIR2, PAIR3); 1999b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka assertTextArray("Multiple chars surrounded by spaces", " a , b , c ", " a ", " b ", " c "); 2009b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka assertTextArray("Multiple labels", "abc,def,ghi", "abc", "def", "ghi"); 201e01d272603f3643ce613e61dd3204379f4f4fb73Tadashi G. Takaoka assertTextArray("Multiple surrogated", SURROGATE1 + "," + SURROGATE2, 202e01d272603f3643ce613e61dd3204379f4f4fb73Tadashi G. Takaoka SURROGATE1, SURROGATE2); 2039b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka assertTextArray("Multiple labels surrounded by spaces", " abc , def , ghi ", 2049b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka " abc ", " def ", " ghi "); 2059b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka } 2069b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka 207dbed20ad8d48e9b42b52c522c54bfd9e62553f7aTadashi G. Takaoka public void testSplitMultiEscaped() { 2085852a2594f4cce518e0b18069c895c2f8561d093Tadashi G. Takaoka assertTextArray("Multiple chars with comma", "a,\\,,c", "a", "\\,", "c"); 2099b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka assertTextArray("Multiple chars with comma surrounded by spaces", " a , \\, , c ", 2105852a2594f4cce518e0b18069c895c2f8561d093Tadashi G. Takaoka " a ", " \\, ", " c "); 2115852a2594f4cce518e0b18069c895c2f8561d093Tadashi G. Takaoka assertTextArray("Multiple labels with escape", 2125852a2594f4cce518e0b18069c895c2f8561d093Tadashi G. Takaoka "\\abc,d\\ef,gh\\i", "\\abc", "d\\ef", "gh\\i"); 2139b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka assertTextArray("Multiple labels with escape surrounded by spaces", 2145852a2594f4cce518e0b18069c895c2f8561d093Tadashi G. Takaoka " \\abc , d\\ef , gh\\i ", " \\abc ", " d\\ef ", " gh\\i "); 2159b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka assertTextArray("Multiple labels with comma and escape", 2165852a2594f4cce518e0b18069c895c2f8561d093Tadashi G. Takaoka "ab\\\\,d\\\\\\,,g\\,i", "ab\\\\", "d\\\\\\,", "g\\,i"); 2179b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka assertTextArray("Multiple labels with comma and escape surrounded by spaces", 2185852a2594f4cce518e0b18069c895c2f8561d093Tadashi G. Takaoka " ab\\\\ , d\\\\\\, , g\\,i ", " ab\\\\ ", " d\\\\\\, ", " g\\,i "); 219e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka 2206bfd5f631908c4afd893c9b25b353e5e16c5fc0cTadashi G. Takaoka assertTextArray("Multiple escaped !text", "\\!,\\!text/empty_string", 2216bfd5f631908c4afd893c9b25b353e5e16c5fc0cTadashi G. Takaoka "\\!", "\\!text/empty_string"); 2226bfd5f631908c4afd893c9b25b353e5e16c5fc0cTadashi G. Takaoka assertTextArray("Multiple escaped !TEXT", "\\!,\\!TEXT/EMPTY_STRING", 2236bfd5f631908c4afd893c9b25b353e5e16c5fc0cTadashi G. Takaoka "\\!", "\\!TEXT/EMPTY_STRING"); 224e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka } 225e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka 226dbed20ad8d48e9b42b52c522c54bfd9e62553f7aTadashi G. Takaoka public void testSplitResourceError() { 2276bfd5f631908c4afd893c9b25b353e5e16c5fc0cTadashi G. Takaoka assertError("Incomplete resource name", "!text/", "!text/"); 2286bfd5f631908c4afd893c9b25b353e5e16c5fc0cTadashi G. Takaoka assertError("Non existing resource", "!text/non_existing"); 229e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka } 230e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka 231dbed20ad8d48e9b42b52c522c54bfd9e62553f7aTadashi G. Takaoka public void testSplitResourceZero() { 232e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka assertTextArray("Empty string", 2336bfd5f631908c4afd893c9b25b353e5e16c5fc0cTadashi G. Takaoka "!text/empty_string"); 234e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka } 235e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka 236dbed20ad8d48e9b42b52c522c54bfd9e62553f7aTadashi G. Takaoka public void testSplitResourceSingle() { 237e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka assertTextArray("Single char", 2386bfd5f631908c4afd893c9b25b353e5e16c5fc0cTadashi G. Takaoka "!text/single_char", "a"); 239e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka assertTextArray("Space", 2406bfd5f631908c4afd893c9b25b353e5e16c5fc0cTadashi G. Takaoka "!text/space", " "); 241e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka assertTextArray("Single label", 2426bfd5f631908c4afd893c9b25b353e5e16c5fc0cTadashi G. Takaoka "!text/single_label", "abc"); 243e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka assertTextArray("Spaces", 2446bfd5f631908c4afd893c9b25b353e5e16c5fc0cTadashi G. Takaoka "!text/spaces", " "); 245e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka assertTextArray("Spaces in label", 2466bfd5f631908c4afd893c9b25b353e5e16c5fc0cTadashi G. Takaoka "!text/spaces_in_label", "a b c"); 247e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka assertTextArray("Spaces at beginning of label", 2486bfd5f631908c4afd893c9b25b353e5e16c5fc0cTadashi G. Takaoka "!text/spaces_at_beginning_of_label", " abc"); 249e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka assertTextArray("Spaces at end of label", 2506bfd5f631908c4afd893c9b25b353e5e16c5fc0cTadashi G. Takaoka "!text/spaces_at_end_of_label", "abc "); 251e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka assertTextArray("label surrounded by spaces", 2526bfd5f631908c4afd893c9b25b353e5e16c5fc0cTadashi G. Takaoka "!text/label_surrounded_by_spaces", " abc "); 2535852a2594f4cce518e0b18069c895c2f8561d093Tadashi G. Takaoka 2545852a2594f4cce518e0b18069c895c2f8561d093Tadashi G. Takaoka assertTextArray("Escape and single char", 2556bfd5f631908c4afd893c9b25b353e5e16c5fc0cTadashi G. Takaoka "\\\\!text/single_char", "\\\\a"); 256e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka } 257e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka 258dbed20ad8d48e9b42b52c522c54bfd9e62553f7aTadashi G. Takaoka public void testSplitResourceSingleEscaped() { 259e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka assertTextArray("Escaped char", 2606bfd5f631908c4afd893c9b25b353e5e16c5fc0cTadashi G. Takaoka "!text/escaped_char", "\\a"); 261e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka assertTextArray("Escaped comma", 2626bfd5f631908c4afd893c9b25b353e5e16c5fc0cTadashi G. Takaoka "!text/escaped_comma", "\\,"); 2635852a2594f4cce518e0b18069c895c2f8561d093Tadashi G. Takaoka assertTextArray("Escaped comma escape", 2646bfd5f631908c4afd893c9b25b353e5e16c5fc0cTadashi G. Takaoka "!text/escaped_comma_escape", "a\\,\\"); 265e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka assertTextArray("Escaped escape", 2666bfd5f631908c4afd893c9b25b353e5e16c5fc0cTadashi G. Takaoka "!text/escaped_escape", "\\\\"); 267e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka assertTextArray("Escaped label", 2686bfd5f631908c4afd893c9b25b353e5e16c5fc0cTadashi G. Takaoka "!text/escaped_label", "a\\bc"); 269e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka assertTextArray("Escaped label at beginning", 2706bfd5f631908c4afd893c9b25b353e5e16c5fc0cTadashi G. Takaoka "!text/escaped_label_at_beginning", "\\abc"); 2715852a2594f4cce518e0b18069c895c2f8561d093Tadashi G. Takaoka assertTextArray("Escaped label at end", 2726bfd5f631908c4afd893c9b25b353e5e16c5fc0cTadashi G. Takaoka "!text/escaped_label_at_end", "abc\\"); 273e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka assertTextArray("Escaped label with comma", 2746bfd5f631908c4afd893c9b25b353e5e16c5fc0cTadashi G. Takaoka "!text/escaped_label_with_comma", "a\\,c"); 275e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka assertTextArray("Escaped label with comma at beginning", 2766bfd5f631908c4afd893c9b25b353e5e16c5fc0cTadashi G. Takaoka "!text/escaped_label_with_comma_at_beginning", "\\,bc"); 2775852a2594f4cce518e0b18069c895c2f8561d093Tadashi G. Takaoka assertTextArray("Escaped label with comma at end", 2786bfd5f631908c4afd893c9b25b353e5e16c5fc0cTadashi G. Takaoka "!text/escaped_label_with_comma_at_end", "ab\\,"); 279e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka assertTextArray("Escaped label with successive", 2806bfd5f631908c4afd893c9b25b353e5e16c5fc0cTadashi G. Takaoka "!text/escaped_label_with_successive", "\\,\\\\bc"); 281e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka assertTextArray("Escaped label with escape", 2826bfd5f631908c4afd893c9b25b353e5e16c5fc0cTadashi G. Takaoka "!text/escaped_label_with_escape", "a\\\\c"); 283e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka } 284e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka 285dbed20ad8d48e9b42b52c522c54bfd9e62553f7aTadashi G. Takaoka public void testSplitResourceMulti() { 286e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka assertTextArray("Multiple chars", 2876bfd5f631908c4afd893c9b25b353e5e16c5fc0cTadashi G. Takaoka "!text/multiple_chars", "a", "b", "c"); 288e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka assertTextArray("Multiple chars surrounded by spaces", 2896bfd5f631908c4afd893c9b25b353e5e16c5fc0cTadashi G. Takaoka "!text/multiple_chars_surrounded_by_spaces", 290e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka " a ", " b ", " c "); 291e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka assertTextArray("Multiple labels", 2926bfd5f631908c4afd893c9b25b353e5e16c5fc0cTadashi G. Takaoka "!text/multiple_labels", "abc", "def", "ghi"); 293e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka assertTextArray("Multiple labels surrounded by spaces", 2946bfd5f631908c4afd893c9b25b353e5e16c5fc0cTadashi G. Takaoka "!text/multiple_labels_surrounded_by_spaces", " abc ", " def ", " ghi "); 295e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka } 296e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka 297dbed20ad8d48e9b42b52c522c54bfd9e62553f7aTadashi G. Takaoka public void testSplitResourcetMultiEscaped() { 298e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka assertTextArray("Multiple chars with comma", 2996bfd5f631908c4afd893c9b25b353e5e16c5fc0cTadashi G. Takaoka "!text/multiple_chars_with_comma", 3005852a2594f4cce518e0b18069c895c2f8561d093Tadashi G. Takaoka "a", "\\,", "c"); 301e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka assertTextArray("Multiple chars with comma surrounded by spaces", 3026bfd5f631908c4afd893c9b25b353e5e16c5fc0cTadashi G. Takaoka "!text/multiple_chars_with_comma_surrounded_by_spaces", 3035852a2594f4cce518e0b18069c895c2f8561d093Tadashi G. Takaoka " a ", " \\, ", " c "); 304e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka assertTextArray("Multiple labels with escape", 3056bfd5f631908c4afd893c9b25b353e5e16c5fc0cTadashi G. Takaoka "!text/multiple_labels_with_escape", 3065852a2594f4cce518e0b18069c895c2f8561d093Tadashi G. Takaoka "\\abc", "d\\ef", "gh\\i"); 307e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka assertTextArray("Multiple labels with escape surrounded by spaces", 3086bfd5f631908c4afd893c9b25b353e5e16c5fc0cTadashi G. Takaoka "!text/multiple_labels_with_escape_surrounded_by_spaces", 3095852a2594f4cce518e0b18069c895c2f8561d093Tadashi G. Takaoka " \\abc ", " d\\ef ", " gh\\i "); 310e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka assertTextArray("Multiple labels with comma and escape", 3116bfd5f631908c4afd893c9b25b353e5e16c5fc0cTadashi G. Takaoka "!text/multiple_labels_with_comma_and_escape", 3125852a2594f4cce518e0b18069c895c2f8561d093Tadashi G. Takaoka "ab\\\\", "d\\\\\\,", "g\\,i"); 313e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka assertTextArray("Multiple labels with comma and escape surrounded by spaces", 3146bfd5f631908c4afd893c9b25b353e5e16c5fc0cTadashi G. Takaoka "!text/multiple_labels_with_comma_and_escape_surrounded_by_spaces", 3155852a2594f4cce518e0b18069c895c2f8561d093Tadashi G. Takaoka " ab\\\\ ", " d\\\\\\, ", " g\\,i "); 316e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka } 317e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka 318dbed20ad8d48e9b42b52c522c54bfd9e62553f7aTadashi G. Takaoka public void testSplitMultipleResources() { 319e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka assertTextArray("Literals and resources", 3206bfd5f631908c4afd893c9b25b353e5e16c5fc0cTadashi G. Takaoka "1,!text/multiple_chars,z", "1", "a", "b", "c", "z"); 3215852a2594f4cce518e0b18069c895c2f8561d093Tadashi G. Takaoka assertTextArray("Literals and resources and escape at end", 3226bfd5f631908c4afd893c9b25b353e5e16c5fc0cTadashi G. Takaoka "\\1,!text/multiple_chars,z\\", "\\1", "a", "b", "c", "z\\"); 323e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka assertTextArray("Multiple single resource chars and labels", 3246bfd5f631908c4afd893c9b25b353e5e16c5fc0cTadashi G. Takaoka "!text/single_char,!text/single_label,!text/escaped_comma", 3255852a2594f4cce518e0b18069c895c2f8561d093Tadashi G. Takaoka "a", "abc", "\\,"); 3265852a2594f4cce518e0b18069c895c2f8561d093Tadashi G. Takaoka assertTextArray("Multiple single resource chars and labels 2", 3276bfd5f631908c4afd893c9b25b353e5e16c5fc0cTadashi G. Takaoka "!text/single_char,!text/single_label,!text/escaped_comma_escape", 3285852a2594f4cce518e0b18069c895c2f8561d093Tadashi G. Takaoka "a", "abc", "a\\,\\"); 329e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka assertTextArray("Multiple multiple resource chars and labels", 3306bfd5f631908c4afd893c9b25b353e5e16c5fc0cTadashi G. Takaoka "!text/multiple_chars,!text/multiple_labels,!text/multiple_chars_with_comma", 3315852a2594f4cce518e0b18069c895c2f8561d093Tadashi G. Takaoka "a", "b", "c", "abc", "def", "ghi", "a", "\\,", "c"); 332e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka assertTextArray("Concatenated resources", 3336bfd5f631908c4afd893c9b25b353e5e16c5fc0cTadashi G. Takaoka "!text/multiple_chars!text/multiple_labels!text/multiple_chars_with_comma", 3345852a2594f4cce518e0b18069c895c2f8561d093Tadashi G. Takaoka "a", "b", "cabc", "def", "ghia", "\\,", "c"); 335e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka assertTextArray("Concatenated resource and literal", 3366bfd5f631908c4afd893c9b25b353e5e16c5fc0cTadashi G. Takaoka "abc!text/multiple_labels", 337e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka "abcabc", "def", "ghi"); 3389b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka } 339aca8870128caeec74ed4426f3c1e23ab60597453Tadashi G. Takaoka 340dbed20ad8d48e9b42b52c522c54bfd9e62553f7aTadashi G. Takaoka public void testSplitIndirectReference() { 341aca8870128caeec74ed4426f3c1e23ab60597453Tadashi G. Takaoka assertTextArray("Indirect", 3426bfd5f631908c4afd893c9b25b353e5e16c5fc0cTadashi G. Takaoka "!text/indirect_string", "a", "b", "c"); 343aca8870128caeec74ed4426f3c1e23ab60597453Tadashi G. Takaoka assertTextArray("Indirect with literal", 3446bfd5f631908c4afd893c9b25b353e5e16c5fc0cTadashi G. Takaoka "1,!text/indirect_string_with_literal,2", "1", "x", "a", "b", "c", "y", "2"); 3452f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka assertTextArray("Indirect2", 3466bfd5f631908c4afd893c9b25b353e5e16c5fc0cTadashi G. Takaoka "!text/indirect2_string", "a", "b", "c"); 347aca8870128caeec74ed4426f3c1e23ab60597453Tadashi G. Takaoka } 348aca8870128caeec74ed4426f3c1e23ab60597453Tadashi G. Takaoka 349dbed20ad8d48e9b42b52c522c54bfd9e62553f7aTadashi G. Takaoka public void testSplitInfiniteIndirectReference() { 350aca8870128caeec74ed4426f3c1e23ab60597453Tadashi G. Takaoka assertError("Infinite indirection", 3516bfd5f631908c4afd893c9b25b353e5e16c5fc0cTadashi G. Takaoka "1,!text/infinite_indirection,2", "1", "infinite", "<infinite>", "loop", "2"); 3522f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka } 3532f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka 3542f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka public void testLabelReferece() { 3556bfd5f631908c4afd893c9b25b353e5e16c5fc0cTadashi G. Takaoka assertTextArray("Label time am", "!text/label_time_am", "AM"); 3562f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka 3576bfd5f631908c4afd893c9b25b353e5e16c5fc0cTadashi G. Takaoka assertTextArray("More keys for am pm", "!text/more_keys_for_am_pm", 3582f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka "!fixedColumnOrder!2", "!hasLabels!", "AM", "PM"); 3592f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka 3606bfd5f631908c4afd893c9b25b353e5e16c5fc0cTadashi G. Takaoka assertTextArray("Settings as more key", "!text/settings_as_more_key", 361cf41aff251ecc94b729307ede05208a104fcd8b0Tadashi G. Takaoka "!icon/settings_key|!code/key_settings"); 3622f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka 3632f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka assertTextArray("Indirect naviagte actions as more key", 3646bfd5f631908c4afd893c9b25b353e5e16c5fc0cTadashi G. Takaoka "!text/indirect_navigate_actions_as_more_key", 3652f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka "!fixedColumnOrder!2", 3662f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka "!hasLabels!", "Prev|!code/key_action_previous", 3672f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka "!hasLabels!", "Next|!code/key_action_next"); 3680a3362d26474cbd60bf870be7ad1413359e4fad6Tadashi G. Takaoka } 3690a3362d26474cbd60bf870be7ad1413359e4fad6Tadashi G. Takaoka 3700a3362d26474cbd60bf870be7ad1413359e4fad6Tadashi G. Takaoka public void testUselessUpperCaseSpecifier() { 3710a3362d26474cbd60bf870be7ad1413359e4fad6Tadashi G. Takaoka assertTextArray("EMPTY STRING", 3720a3362d26474cbd60bf870be7ad1413359e4fad6Tadashi G. Takaoka "!TEXT/EMPTY_STRING", "!TEXT/EMPTY_STRING"); 3730a3362d26474cbd60bf870be7ad1413359e4fad6Tadashi G. Takaoka 3740a3362d26474cbd60bf870be7ad1413359e4fad6Tadashi G. Takaoka assertTextArray("SINGLE CHAR", 3750a3362d26474cbd60bf870be7ad1413359e4fad6Tadashi G. Takaoka "!TEXT/SINGLE_CHAR", "!TEXT/SINGLE_CHAR"); 3760a3362d26474cbd60bf870be7ad1413359e4fad6Tadashi G. Takaoka assertTextArray("Escape and SINGLE CHAR", 3770a3362d26474cbd60bf870be7ad1413359e4fad6Tadashi G. Takaoka "\\\\!TEXT/SINGLE_CHAR", "\\\\!TEXT/SINGLE_CHAR"); 3780a3362d26474cbd60bf870be7ad1413359e4fad6Tadashi G. Takaoka 3790a3362d26474cbd60bf870be7ad1413359e4fad6Tadashi G. Takaoka assertTextArray("MULTIPLE CHARS", 3800a3362d26474cbd60bf870be7ad1413359e4fad6Tadashi G. Takaoka "!TEXT/MULTIPLE_CHARS", "!TEXT/MULTIPLE_CHARS"); 3810a3362d26474cbd60bf870be7ad1413359e4fad6Tadashi G. Takaoka 3820a3362d26474cbd60bf870be7ad1413359e4fad6Tadashi G. Takaoka assertTextArray("Literals and RESOURCES", 3830a3362d26474cbd60bf870be7ad1413359e4fad6Tadashi G. Takaoka "1,!TEXT/MULTIPLE_CHARS,z", "1", "!TEXT/MULTIPLE_CHARS", "z"); 3840a3362d26474cbd60bf870be7ad1413359e4fad6Tadashi G. Takaoka assertTextArray("Multiple single RESOURCE chars and LABELS 2", 3850a3362d26474cbd60bf870be7ad1413359e4fad6Tadashi G. Takaoka "!TEXT/SINGLE_CHAR,!TEXT/SINGLE_LABEL,!TEXT/ESCAPED_COMMA_ESCAPE", 3860a3362d26474cbd60bf870be7ad1413359e4fad6Tadashi G. Takaoka "!TEXT/SINGLE_CHAR", "!TEXT/SINGLE_LABEL", "!TEXT/ESCAPED_COMMA_ESCAPE"); 3870a3362d26474cbd60bf870be7ad1413359e4fad6Tadashi G. Takaoka 3880a3362d26474cbd60bf870be7ad1413359e4fad6Tadashi G. Takaoka assertTextArray("INDIRECT", 3890a3362d26474cbd60bf870be7ad1413359e4fad6Tadashi G. Takaoka "!TEXT/INDIRECT_STRING", "!TEXT/INDIRECT_STRING"); 3900a3362d26474cbd60bf870be7ad1413359e4fad6Tadashi G. Takaoka assertTextArray("INDIRECT with literal", 3910a3362d26474cbd60bf870be7ad1413359e4fad6Tadashi G. Takaoka "1,!TEXT/INDIRECT_STRING_WITH_LITERAL,2", 3920a3362d26474cbd60bf870be7ad1413359e4fad6Tadashi G. Takaoka "1", "!TEXT/INDIRECT_STRING_WITH_LITERAL", "2"); 3930a3362d26474cbd60bf870be7ad1413359e4fad6Tadashi G. Takaoka assertTextArray("INDIRECT2", 3940a3362d26474cbd60bf870be7ad1413359e4fad6Tadashi G. Takaoka "!TEXT/INDIRECT2_STRING", "!TEXT/INDIRECT2_STRING"); 3950a3362d26474cbd60bf870be7ad1413359e4fad6Tadashi G. Takaoka 3960a3362d26474cbd60bf870be7ad1413359e4fad6Tadashi G. Takaoka assertTextArray("Upper indirect", 3970a3362d26474cbd60bf870be7ad1413359e4fad6Tadashi G. Takaoka "!text/upper_indirect_string", "!TEXT/MULTIPLE_CHARS"); 3980a3362d26474cbd60bf870be7ad1413359e4fad6Tadashi G. Takaoka assertTextArray("Upper indirect with literal", 3990a3362d26474cbd60bf870be7ad1413359e4fad6Tadashi G. Takaoka "1,!text/upper_indirect_string_with_literal,2", 4000a3362d26474cbd60bf870be7ad1413359e4fad6Tadashi G. Takaoka "1", "x", "!TEXT/MULTIPLE_CHARS", "y", "2"); 4010a3362d26474cbd60bf870be7ad1413359e4fad6Tadashi G. Takaoka assertTextArray("Upper indirect2", 4020a3362d26474cbd60bf870be7ad1413359e4fad6Tadashi G. Takaoka "!text/upper_indirect2_string", "!TEXT/UPPER_INDIRECT_STRING"); 4030a3362d26474cbd60bf870be7ad1413359e4fad6Tadashi G. Takaoka 4040a3362d26474cbd60bf870be7ad1413359e4fad6Tadashi G. Takaoka assertTextArray("UPPER INDIRECT", 4050a3362d26474cbd60bf870be7ad1413359e4fad6Tadashi G. Takaoka "!TEXT/upper_INDIRECT_STRING", "!TEXT/upper_INDIRECT_STRING"); 4060a3362d26474cbd60bf870be7ad1413359e4fad6Tadashi G. Takaoka assertTextArray("Upper INDIRECT with literal", 4070a3362d26474cbd60bf870be7ad1413359e4fad6Tadashi G. Takaoka "1,!TEXT/upper_INDIRECT_STRING_WITH_LITERAL,2", 4080a3362d26474cbd60bf870be7ad1413359e4fad6Tadashi G. Takaoka "1", "!TEXT/upper_INDIRECT_STRING_WITH_LITERAL", "2"); 4090a3362d26474cbd60bf870be7ad1413359e4fad6Tadashi G. Takaoka assertTextArray("Upper INDIRECT2", 4100a3362d26474cbd60bf870be7ad1413359e4fad6Tadashi G. Takaoka "!TEXT/upper_INDIRECT2_STRING", "!TEXT/upper_INDIRECT2_STRING"); 4110a3362d26474cbd60bf870be7ad1413359e4fad6Tadashi G. Takaoka 4120a3362d26474cbd60bf870be7ad1413359e4fad6Tadashi G. Takaoka assertTextArray("INFINITE INDIRECTION", 4130a3362d26474cbd60bf870be7ad1413359e4fad6Tadashi G. Takaoka "1,!TEXT/INFINITE_INDIRECTION,2", "1", "!TEXT/INFINITE_INDIRECTION", "2"); 4140a3362d26474cbd60bf870be7ad1413359e4fad6Tadashi G. Takaoka 4150a3362d26474cbd60bf870be7ad1413359e4fad6Tadashi G. Takaoka assertTextArray("Upper infinite indirection", 4160a3362d26474cbd60bf870be7ad1413359e4fad6Tadashi G. Takaoka "1,!text/upper_infinite_indirection,2", 4170a3362d26474cbd60bf870be7ad1413359e4fad6Tadashi G. Takaoka "1", "infinite", "!TEXT/INFINITE_INDIRECTION", "loop", "2"); 4180a3362d26474cbd60bf870be7ad1413359e4fad6Tadashi G. Takaoka assertTextArray("Upper INFINITE INDIRECTION", 4190a3362d26474cbd60bf870be7ad1413359e4fad6Tadashi G. Takaoka "1,!TEXT/UPPER_INFINITE_INDIRECTION,2", 4200a3362d26474cbd60bf870be7ad1413359e4fad6Tadashi G. Takaoka "1", "!TEXT/UPPER_INFINITE_INDIRECTION", "2"); 4210a3362d26474cbd60bf870be7ad1413359e4fad6Tadashi G. Takaoka 4220a3362d26474cbd60bf870be7ad1413359e4fad6Tadashi G. Takaoka assertTextArray("LABEL TIME AM", "!TEXT/LABEL_TIME_AM", "!TEXT/LABEL_TIME_AM"); 4230a3362d26474cbd60bf870be7ad1413359e4fad6Tadashi G. Takaoka assertTextArray("MORE KEYS FOR AM OM", "!TEXT/MORE_KEYS_FOR_AM_PM", 4240a3362d26474cbd60bf870be7ad1413359e4fad6Tadashi G. Takaoka "!TEXT/MORE_KEYS_FOR_AM_PM"); 4250a3362d26474cbd60bf870be7ad1413359e4fad6Tadashi G. Takaoka assertTextArray("SETTINGS AS MORE KEY", "!TEXT/SETTINGS_AS_MORE_KEY", 4260a3362d26474cbd60bf870be7ad1413359e4fad6Tadashi G. Takaoka "!TEXT/SETTINGS_AS_MORE_KEY"); 4272f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka assertTextArray("INDIRECT NAVIGATE ACTIONS AS MORE KEY", 4286bfd5f631908c4afd893c9b25b353e5e16c5fc0cTadashi G. Takaoka "!TEXT/INDIRECT_NAVIGATE_ACTIONS_AS_MORE_KEY", 4290a3362d26474cbd60bf870be7ad1413359e4fad6Tadashi G. Takaoka "!TEXT/INDIRECT_NAVIGATE_ACTIONS_AS_MORE_KEY"); 4300a3362d26474cbd60bf870be7ad1413359e4fad6Tadashi G. Takaoka } 4319b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka} 432