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
19d9c6b332090c90e4d4840e62fe3eb45c834b2e14Tadashi G. Takaokaimport static com.android.inputmethod.keyboard.internal.KeyboardIconsSet.ICON_UNDEFINED;
209342484e8d573a40f470b6a593df31c602fa4076Ken Wakasaimport static com.android.inputmethod.latin.common.Constants.CODE_UNSPECIFIED;
21d9c6b332090c90e4d4840e62fe3eb45c834b2e14Tadashi G. Takaoka
22b4598f7d05d6afd01ddc7ea0bed71dda837d1debTadashi G. Takaokaimport android.test.suitebuilder.annotation.SmallTest;
239b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka
249342484e8d573a40f470b6a593df31c602fa4076Ken Wakasaimport com.android.inputmethod.latin.common.Constants;
25c2a21786e526cc32e48a577a55b1b7e72ae1a6ddTadashi G. Takaoka
2615c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaokaimport java.util.Arrays;
27ed3bac91f242850c6d1833a5f8981b9cc208c5ddTadashi G. Takaokaimport java.util.Locale;
2815c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka
29b4598f7d05d6afd01ddc7ea0bed71dda837d1debTadashi G. Takaoka@SmallTest
302151216c09e9947bc78937c72492f4d4664a9389Tadashi G. Takaokapublic final class MoreKeySpecTests extends KeySpecParserTestsBase {
319b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka    @Override
32853e8d8869e2b7bb63a41bee031c91e350cf9d14Tadashi G. Takaoka    protected void assertParser(final String message, final String moreKeySpec,
33853e8d8869e2b7bb63a41bee031c91e350cf9d14Tadashi G. Takaoka            final String expectedLabel, final String expectedOutputText, final int expectedIconId,
34e855093f5513e46f7f2da6d99e74873ac4f1eeefTadashi G. Takaoka            final int expectedCode) {
350bae2ab460a257fa4911db91f5823b80d1a13c46Tadashi G. Takaoka        final String labelResolved = mTextsSet.resolveTextReference(moreKeySpec);
367ae6721ffad1e79ee446de87d13f18a27619830bTadashi G. Takaoka        final MoreKeySpec spec = new MoreKeySpec(
377ae6721ffad1e79ee446de87d13f18a27619830bTadashi G. Takaoka                labelResolved, false /* needsToUpperCase */, Locale.US);
38cf41aff251ecc94b729307ede05208a104fcd8b0Tadashi G. Takaoka        assertEquals(message + " [label]", expectedLabel, spec.mLabel);
39cf41aff251ecc94b729307ede05208a104fcd8b0Tadashi G. Takaoka        assertEquals(message + " [ouptputText]", expectedOutputText, spec.mOutputText);
40cf41aff251ecc94b729307ede05208a104fcd8b0Tadashi G. Takaoka        assertEquals(message + " [icon]",
41853e8d8869e2b7bb63a41bee031c91e350cf9d14Tadashi G. Takaoka                KeyboardIconsSet.getIconName(expectedIconId),
42cf41aff251ecc94b729307ede05208a104fcd8b0Tadashi G. Takaoka                KeyboardIconsSet.getIconName(spec.mIconId));
43cf41aff251ecc94b729307ede05208a104fcd8b0Tadashi G. Takaoka        assertEquals(message + " [code]",
44240871ecafde7834ebb4270cd7758fc904a5f3a7Tadashi G. Takaoka                Constants.printableCode(expectedCode),
45240871ecafde7834ebb4270cd7758fc904a5f3a7Tadashi G. Takaoka                Constants.printableCode(spec.mCode));
469b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka    }
479b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka
48d9c6b332090c90e4d4840e62fe3eb45c834b2e14Tadashi G. Takaoka    // TODO: Move this method to {@link KeySpecParserBase}.
49d9c6b332090c90e4d4840e62fe3eb45c834b2e14Tadashi G. Takaoka    public void testEmptySpec() {
50d9c6b332090c90e4d4840e62fe3eb45c834b2e14Tadashi G. Takaoka        assertParserError("Null spec", null,
51d9c6b332090c90e4d4840e62fe3eb45c834b2e14Tadashi G. Takaoka                null, null, ICON_UNDEFINED, CODE_UNSPECIFIED);
52d9c6b332090c90e4d4840e62fe3eb45c834b2e14Tadashi G. Takaoka        assertParserError("Empty spec", "",
53d9c6b332090c90e4d4840e62fe3eb45c834b2e14Tadashi G. Takaoka                null, null, ICON_UNDEFINED, CODE_UNSPECIFIED);
54d9c6b332090c90e4d4840e62fe3eb45c834b2e14Tadashi G. Takaoka    }
55d9c6b332090c90e4d4840e62fe3eb45c834b2e14Tadashi G. Takaoka
56e855093f5513e46f7f2da6d99e74873ac4f1eeefTadashi G. Takaoka    private static void assertArrayEquals(final String message, final Object[] expected,
57e855093f5513e46f7f2da6d99e74873ac4f1eeefTadashi G. Takaoka            final Object[] actual) {
582f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka        if (expected == actual) {
5915c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka            return;
6015c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka        }
6115c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka        if (expected == null || actual == null) {
6215c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka            assertEquals(message, Arrays.toString(expected), Arrays.toString(actual));
632f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka            return;
642f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka        }
652f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka        if (expected.length != actual.length) {
662f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka            assertEquals(message + " [length]", Arrays.toString(expected), Arrays.toString(actual));
672f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka            return;
6815c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka        }
692f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka        for (int i = 0; i < expected.length; i++) {
702f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka            assertEquals(message + " [" + i + "]",
712f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka                    Arrays.toString(expected), Arrays.toString(actual));
722f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka        }
732f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka    }
742f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka
75e855093f5513e46f7f2da6d99e74873ac4f1eeefTadashi G. Takaoka    private static void assertInsertAdditionalMoreKeys(final String message,
76e855093f5513e46f7f2da6d99e74873ac4f1eeefTadashi G. Takaoka            final String[] moreKeys, final String[] additionalMoreKeys, final String[] expected) {
77e855093f5513e46f7f2da6d99e74873ac4f1eeefTadashi G. Takaoka        final String[] actual = MoreKeySpec.insertAdditionalMoreKeys(moreKeys, additionalMoreKeys);
782f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka        assertArrayEquals(message, expected, actual);
7915c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka    }
8015c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka
815f00fe09e9a611b647592188316e5999465df4d3Tadashi G. Takaoka    @SuppressWarnings("static-method")
82aeeed758480b0fac848f4556884d978f3004555bTadashi G. Takaoka    public void testEmptyEntry() {
832f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka        assertInsertAdditionalMoreKeys("null more keys and null additons",
84aeeed758480b0fac848f4556884d978f3004555bTadashi G. Takaoka                null,
85aeeed758480b0fac848f4556884d978f3004555bTadashi G. Takaoka                null,
86aeeed758480b0fac848f4556884d978f3004555bTadashi G. Takaoka                null);
872f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka        assertInsertAdditionalMoreKeys("null more keys and empty additons",
88aeeed758480b0fac848f4556884d978f3004555bTadashi G. Takaoka                null,
89aeeed758480b0fac848f4556884d978f3004555bTadashi G. Takaoka                new String[0],
90aeeed758480b0fac848f4556884d978f3004555bTadashi G. Takaoka                null);
912f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka        assertInsertAdditionalMoreKeys("empty more keys and null additons",
92aeeed758480b0fac848f4556884d978f3004555bTadashi G. Takaoka                new String[0],
93aeeed758480b0fac848f4556884d978f3004555bTadashi G. Takaoka                null,
94aeeed758480b0fac848f4556884d978f3004555bTadashi G. Takaoka                null);
952f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka        assertInsertAdditionalMoreKeys("empty more keys and empty additons",
96aeeed758480b0fac848f4556884d978f3004555bTadashi G. Takaoka                new String[0],
97aeeed758480b0fac848f4556884d978f3004555bTadashi G. Takaoka                new String[0],
98aeeed758480b0fac848f4556884d978f3004555bTadashi G. Takaoka                null);
99aeeed758480b0fac848f4556884d978f3004555bTadashi G. Takaoka
1002f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka        assertInsertAdditionalMoreKeys("filter out empty more keys",
101aeeed758480b0fac848f4556884d978f3004555bTadashi G. Takaoka                new String[] { null, "a", "", "b", null },
102aeeed758480b0fac848f4556884d978f3004555bTadashi G. Takaoka                null,
103aeeed758480b0fac848f4556884d978f3004555bTadashi G. Takaoka                new String[] { "a", "b" });
1042f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka        assertInsertAdditionalMoreKeys("filter out empty additons",
105aeeed758480b0fac848f4556884d978f3004555bTadashi G. Takaoka                new String[] { "a", "%", "b", "%", "c", "%", "d" },
106aeeed758480b0fac848f4556884d978f3004555bTadashi G. Takaoka                new String[] { null, "A", "", "B", null },
107aeeed758480b0fac848f4556884d978f3004555bTadashi G. Takaoka                new String[] { "a", "A", "b", "B", "c", "d" });
108aeeed758480b0fac848f4556884d978f3004555bTadashi G. Takaoka    }
109aeeed758480b0fac848f4556884d978f3004555bTadashi G. Takaoka
1105f00fe09e9a611b647592188316e5999465df4d3Tadashi G. Takaoka    @SuppressWarnings("static-method")
11115c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka    public void testInsertAdditionalMoreKeys() {
11215c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka        // Escaped marker.
1132f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka        assertInsertAdditionalMoreKeys("escaped marker",
11415c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "\\%", "%-)" },
11515c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "1", "2" },
11615c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "1", "2", "\\%", "%-)" });
11715c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka
11815c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka        // 0 more key.
1192f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka        assertInsertAdditionalMoreKeys("null & null", null, null, null);
1202f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka        assertInsertAdditionalMoreKeys("null & 1 additon",
12115c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                null,
12215c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "1" },
12315c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "1" });
1242f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka        assertInsertAdditionalMoreKeys("null & 2 additons",
12515c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                null,
12615c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "1", "2" },
12715c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "1", "2" });
12815c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka
12915c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka        // 0 additional more key.
1302f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka        assertInsertAdditionalMoreKeys("1 more key & null",
13115c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "A" },
13215c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                null,
13315c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "A" });
1342f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka        assertInsertAdditionalMoreKeys("2 more keys & null",
13515c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "A", "B" },
13615c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                null,
13715c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "A", "B" });
13815c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka
13915c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka        // No marker.
1402f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka        assertInsertAdditionalMoreKeys("1 more key & 1 addtional & no marker",
14115c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "A" },
14215c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "1" },
14315c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "1", "A" });
1442f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka        assertInsertAdditionalMoreKeys("1 more key & 2 addtionals & no marker",
14515c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "A" },
14615c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "1", "2" },
14715c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "1", "2", "A" });
1482f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka        assertInsertAdditionalMoreKeys("2 more keys & 1 addtional & no marker",
14915c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "A", "B" },
15015c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "1" },
15115c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "1", "A", "B" });
1522f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka        assertInsertAdditionalMoreKeys("2 more keys & 2 addtionals & no marker",
15315c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "A", "B" },
15415c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "1", "2" },
15515c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "1", "2", "A", "B" });
15615c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka
15715c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka        // 1 marker.
1582f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka        assertInsertAdditionalMoreKeys("1 more key & 1 additon & marker at head",
15915c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "%", "A" },
16015c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "1" },
16115c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "1", "A" });
1622f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka        assertInsertAdditionalMoreKeys("1 more key & 1 additon & marker at tail",
16315c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "A", "%" },
16415c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "1" },
16515c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "A", "1" });
1662f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka        assertInsertAdditionalMoreKeys("2 more keys & 1 additon & marker at middle",
16715c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "A", "%", "B" },
16815c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "1" },
16915c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "A", "1", "B" });
17015c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka
17115c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka        // 1 marker & excess additional more keys.
1722f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka        assertInsertAdditionalMoreKeys("1 more key & 2 additons & marker at head",
17315c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "%", "A", "B" },
17415c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "1", "2" },
17515c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "1", "A", "B", "2" });
1762f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka        assertInsertAdditionalMoreKeys("1 more key & 2 additons & marker at tail",
17715c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "A", "B", "%" },
17815c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "1", "2" },
17915c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "A", "B", "1", "2" });
1802f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka        assertInsertAdditionalMoreKeys("2 more keys & 2 additons & marker at middle",
18115c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "A", "%", "B" },
18215c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "1", "2" },
18315c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "A", "1", "B", "2" });
18415c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka
18515c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka        // 2 markers.
1862f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka        assertInsertAdditionalMoreKeys("0 more key & 2 addtional & 2 markers",
18715c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "%", "%" },
18815c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "1", "2" },
18915c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "1", "2" });
1902f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka        assertInsertAdditionalMoreKeys("1 more key & 2 addtional & 2 markers at head",
19115c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "%", "%", "A" },
19215c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "1", "2" },
19315c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "1", "2", "A" });
1942f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka        assertInsertAdditionalMoreKeys("1 more key & 2 addtional & 2 markers at tail",
19515c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "A", "%", "%" },
19615c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "1", "2" },
19715c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "A", "1", "2" });
1982f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka        assertInsertAdditionalMoreKeys("2 more keys & 2 addtional & 2 markers at middle",
19915c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "A", "%", "%", "B" },
20015c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "1", "2" },
20115c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "A", "1", "2", "B" });
2022f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka        assertInsertAdditionalMoreKeys("2 more keys & 2 addtional & 2 markers at head & middle",
20315c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "%", "A", "%", "B" },
20415c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "1", "2" },
20515c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "1", "A", "2", "B" });
2062f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka        assertInsertAdditionalMoreKeys("2 more keys & 2 addtional & 2 markers at head & tail",
20715c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "%", "A", "B", "%" },
20815c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "1", "2" },
20915c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "1", "A", "B", "2" });
2102f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka        assertInsertAdditionalMoreKeys("2 more keys & 2 addtional & 2 markers at middle & tail",
21115c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "A", "%", "B", "%" },
21215c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "1", "2" },
21315c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "A", "1", "B", "2" });
21415c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka
215aeeed758480b0fac848f4556884d978f3004555bTadashi G. Takaoka        // 2 markers & excess additional more keys.
2162f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka        assertInsertAdditionalMoreKeys("0 more key & 2 additons & 2 markers",
21715c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "%", "%" },
21815c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "1", "2", "3" },
21915c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "1", "2", "3" });
2202f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka        assertInsertAdditionalMoreKeys("1 more key & 2 additons & 2 markers at head",
22115c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "%", "%", "A" },
22215c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "1", "2", "3" },
22315c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "1", "2", "A", "3" });
2242f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka        assertInsertAdditionalMoreKeys("1 more key & 2 additons & 2 markers at tail",
22515c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "A", "%", "%" },
22615c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "1", "2", "3" },
22715c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "A", "1", "2", "3" });
2282f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka        assertInsertAdditionalMoreKeys("2 more keys & 2 additons & 2 markers at middle",
22915c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "A", "%", "%", "B" },
23015c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "1", "2", "3" },
23115c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "A", "1", "2", "B", "3" });
2322f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka        assertInsertAdditionalMoreKeys("2 more keys & 2 additons & 2 markers at head & middle",
23315c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "%", "A", "%", "B" },
23415c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "1", "2", "3" },
23515c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "1", "A", "2", "B", "3" });
2362f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka        assertInsertAdditionalMoreKeys("2 more keys & 2 additons & 2 markers at head & tail",
23715c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "%", "A", "B", "%" },
23815c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "1", "2", "3" },
23915c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "1", "A", "B", "2", "3" });
2402f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka        assertInsertAdditionalMoreKeys("2 more keys & 2 additons & 2 markers at middle & tail",
24115c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "A", "%", "B", "%" },
24215c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "1", "2", "3" },
24315c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "A", "1", "B", "2", "3" });
24415c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka
24515c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka        // 0 addtional more key and excess markers.
2462f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka        assertInsertAdditionalMoreKeys("0 more key & null & excess marker",
24715c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "%" },
24815c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                null,
24915c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                null);
2502f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka        assertInsertAdditionalMoreKeys("1 more key & null & excess marker at head",
25115c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "%", "A" },
25215c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                null,
25315c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "A" });
2542f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka        assertInsertAdditionalMoreKeys("1 more key & null & excess marker at tail",
25515c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "A", "%" },
25615c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                null,
25715c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "A" });
2582f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka        assertInsertAdditionalMoreKeys("2 more keys & null & excess marker at middle",
25915c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "A", "%", "B" },
26015c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                null,
26115c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "A", "B" });
2622f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka        assertInsertAdditionalMoreKeys("2 more keys & null & excess markers",
26315c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "%", "A", "%", "B", "%" },
26415c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                null,
26515c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "A", "B" });
26615c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka
26715c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka        // Excess markers.
2682f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka        assertInsertAdditionalMoreKeys("0 more key & 1 additon & excess marker",
26915c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "%", "%" },
27015c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "1" },
27115c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "1" });
2722f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka        assertInsertAdditionalMoreKeys("1 more key & 1 additon & excess marker at head",
27315c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "%", "%", "A" },
27415c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "1" },
27515c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "1", "A" });
2762f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka        assertInsertAdditionalMoreKeys("1 more key & 1 additon & excess marker at tail",
27715c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "A", "%", "%" },
27815c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "1" },
27915c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "A", "1" });
2802f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka        assertInsertAdditionalMoreKeys("2 more keys & 1 additon & excess marker at middle",
28115c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "A", "%", "%", "B" },
28215c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "1" },
28315c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "A", "1", "B" });
2842f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka        assertInsertAdditionalMoreKeys("2 more keys & 1 additon & excess markers",
28515c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "%", "A", "%", "B", "%" },
28615c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "1" },
28715c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "1", "A", "B" });
2882f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka        assertInsertAdditionalMoreKeys("2 more keys & 2 additons & excess markers",
28915c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "%", "A", "%", "B", "%" },
29015c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "1", "2" },
29115c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "1", "A", "2", "B" });
2922f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka        assertInsertAdditionalMoreKeys("2 more keys & 3 additons & excess markers",
29315c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "%", "A", "%", "%", "B", "%" },
29415c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "1", "2", "3" },
29515c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka                new String[] { "1", "A", "2", "3", "B" });
29615c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka    }
2972f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka
2982f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka    private static final String HAS_LABEL = "!hasLabel!";
2992f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka    private static final String NEEDS_DIVIDER = "!needsDividers!";
3002f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka    private static final String AUTO_COLUMN_ORDER = "!autoColumnOrder!";
3012f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka    private static final String FIXED_COLUMN_ORDER = "!fixedColumnOrder!";
3022f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka
303e855093f5513e46f7f2da6d99e74873ac4f1eeefTadashi G. Takaoka    private static void assertGetBooleanValue(final String message, final String key,
304e855093f5513e46f7f2da6d99e74873ac4f1eeefTadashi G. Takaoka            final String[] moreKeys, final String[] expected, final boolean expectedValue) {
3052f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka        final String[] actual = Arrays.copyOf(moreKeys, moreKeys.length);
306e855093f5513e46f7f2da6d99e74873ac4f1eeefTadashi G. Takaoka        final boolean actualValue = MoreKeySpec.getBooleanValue(actual, key);
3072f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka        assertEquals(message + " [value]", expectedValue, actualValue);
3082f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka        assertArrayEquals(message, expected, actual);
3092f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka    }
3102f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka
3115f00fe09e9a611b647592188316e5999465df4d3Tadashi G. Takaoka    @SuppressWarnings("static-method")
3122f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka    public void testGetBooleanValue() {
3132f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka        assertGetBooleanValue("Has label", HAS_LABEL,
3142f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka                new String[] { HAS_LABEL, "a", "b", "c" },
3152f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka                new String[] { null, "a", "b", "c" }, true);
3160a3362d26474cbd60bf870be7ad1413359e4fad6Tadashi G. Takaoka        // Upper case specification will not work.
3172f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka        assertGetBooleanValue("HAS LABEL", HAS_LABEL,
31894027c7201a376107a35ec78cd21db1905662601Tadashi G. Takaoka                new String[] { HAS_LABEL.toUpperCase(Locale.ROOT), "a", "b", "c" },
3190a3362d26474cbd60bf870be7ad1413359e4fad6Tadashi G. Takaoka                new String[] { "!HASLABEL!", "a", "b", "c" }, false);
3202f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka
3212f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka        assertGetBooleanValue("No has label", HAS_LABEL,
3222f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka                new String[] { "a", "b", "c" },
3232f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka                new String[] { "a", "b", "c" }, false);
3242f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka        assertGetBooleanValue("No has label with fixed clumn order", HAS_LABEL,
3252f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka                new String[] { FIXED_COLUMN_ORDER + "3", "a", "b", "c" },
3262f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka                new String[] { FIXED_COLUMN_ORDER + "3", "a", "b", "c" }, false);
3272f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka
3280a3362d26474cbd60bf870be7ad1413359e4fad6Tadashi G. Takaoka        // Upper case specification will not work.
3292f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka        assertGetBooleanValue("Multiple has label", HAS_LABEL,
3302f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka                new String[] {
33194027c7201a376107a35ec78cd21db1905662601Tadashi G. Takaoka                    "a", HAS_LABEL.toUpperCase(Locale.ROOT), "b", "c", HAS_LABEL, "d" },
3322f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka                new String[] {
3330a3362d26474cbd60bf870be7ad1413359e4fad6Tadashi G. Takaoka                    "a", "!HASLABEL!", "b", "c", null, "d" }, true);
3340a3362d26474cbd60bf870be7ad1413359e4fad6Tadashi G. Takaoka        // Upper case specification will not work.
3352f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka        assertGetBooleanValue("Multiple has label with needs dividers", HAS_LABEL,
3362f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka                new String[] {
33794027c7201a376107a35ec78cd21db1905662601Tadashi G. Takaoka                    "a", HAS_LABEL, "b", NEEDS_DIVIDER, HAS_LABEL.toUpperCase(Locale.ROOT), "d" },
3382f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka                new String[] {
3390a3362d26474cbd60bf870be7ad1413359e4fad6Tadashi G. Takaoka                    "a", null, "b", NEEDS_DIVIDER, "!HASLABEL!", "d" }, true);
3402f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka    }
3412f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka
342e855093f5513e46f7f2da6d99e74873ac4f1eeefTadashi G. Takaoka    private static void assertGetIntValue(final String message, final String key,
343e855093f5513e46f7f2da6d99e74873ac4f1eeefTadashi G. Takaoka            final int defaultValue, final String[] moreKeys, final String[] expected,
344e855093f5513e46f7f2da6d99e74873ac4f1eeefTadashi G. Takaoka            final int expectedValue) {
3452f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka        final String[] actual = Arrays.copyOf(moreKeys, moreKeys.length);
346e855093f5513e46f7f2da6d99e74873ac4f1eeefTadashi G. Takaoka        final int actualValue = MoreKeySpec.getIntValue(actual, key, defaultValue);
3472f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka        assertEquals(message + " [value]", expectedValue, actualValue);
3482f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka        assertArrayEquals(message, expected, actual);
3492f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka    }
3502f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka
3515f00fe09e9a611b647592188316e5999465df4d3Tadashi G. Takaoka    @SuppressWarnings("static-method")
3522f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka    public void testGetIntValue() {
3532f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka        assertGetIntValue("Fixed column order 3", FIXED_COLUMN_ORDER, -1,
3542f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka                new String[] { FIXED_COLUMN_ORDER + "3", "a", "b", "c" },
3552f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka                new String[] { null, "a", "b", "c" }, 3);
3560a3362d26474cbd60bf870be7ad1413359e4fad6Tadashi G. Takaoka        // Upper case specification will not work.
3572f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka        assertGetIntValue("FIXED COLUMN ORDER 3", FIXED_COLUMN_ORDER, -1,
35894027c7201a376107a35ec78cd21db1905662601Tadashi G. Takaoka                new String[] { FIXED_COLUMN_ORDER.toUpperCase(Locale.ROOT) + "3", "a", "b", "c" },
3590a3362d26474cbd60bf870be7ad1413359e4fad6Tadashi G. Takaoka                new String[] { "!FIXEDCOLUMNORDER!3", "a", "b", "c" }, -1);
3602f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka
3612f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka        assertGetIntValue("No fixed column order", FIXED_COLUMN_ORDER, -1,
3622f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka                new String[] { "a", "b", "c" },
3632f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka                new String[] { "a", "b", "c" }, -1);
3642f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka        assertGetIntValue("No fixed column order with auto column order", FIXED_COLUMN_ORDER, -1,
3652f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka                new String[] { AUTO_COLUMN_ORDER + "5", "a", "b", "c" },
3662f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka                new String[] { AUTO_COLUMN_ORDER + "5", "a", "b", "c" }, -1);
3672f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka
3682f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka        assertGetIntValue("Multiple fixed column order 3,5", FIXED_COLUMN_ORDER, -1,
3692f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka                new String[] { FIXED_COLUMN_ORDER + "3", "a", FIXED_COLUMN_ORDER + "5", "b" },
3702f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka                new String[] { null, "a", null, "b" }, 3);
3710a3362d26474cbd60bf870be7ad1413359e4fad6Tadashi G. Takaoka        // Upper case specification will not work.
3722f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka        assertGetIntValue("Multiple fixed column order 5,3 with has label", FIXED_COLUMN_ORDER, -1,
3732f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka                new String[] {
37494027c7201a376107a35ec78cd21db1905662601Tadashi G. Takaoka                    FIXED_COLUMN_ORDER.toUpperCase(Locale.ROOT) + "5", HAS_LABEL, "a",
3752f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka                    FIXED_COLUMN_ORDER + "3", "b" },
3760a3362d26474cbd60bf870be7ad1413359e4fad6Tadashi G. Takaoka                new String[] { "!FIXEDCOLUMNORDER!5", HAS_LABEL, "a", null, "b" }, 3);
3772f16fd40faab7287dfcae4899050b9df360d0c29Tadashi G. Takaoka    }
3789b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka}
379