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