blob: b1ae6f5b7aa0186353b5dff280078bea400905fe [file] [log] [blame]
/*
* Copyright (C) 2010 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.inputmethod.keyboard.internal;
import static com.android.inputmethod.keyboard.internal.KeyboardIconsSet.ICON_UNDEFINED;
import static com.android.inputmethod.latin.Constants.CODE_OUTPUT_TEXT;
import static com.android.inputmethod.latin.Constants.CODE_UNSPECIFIED;
import android.test.AndroidTestCase;
import android.test.suitebuilder.annotation.SmallTest;
import com.android.inputmethod.latin.Constants;
import java.util.Arrays;
import java.util.Locale;
@SmallTest
public class KeySpecParserTests extends AndroidTestCase {
private final KeyboardCodesSet mCodesSet = new KeyboardCodesSet();
private final KeyboardTextsSet mTextsSet = new KeyboardTextsSet();
private static final String CODE_SETTINGS = "!code/key_settings";
private static final String ICON_SETTINGS = "!icon/settings_key";
private static final String CODE_SETTINGS_UPPERCASE = CODE_SETTINGS.toUpperCase();
private static final String ICON_SETTINGS_UPPERCASE = ICON_SETTINGS.toUpperCase();
private static final String CODE_NON_EXISTING = "!code/non_existing";
private static final String ICON_NON_EXISTING = "!icon/non_existing";
private int mCodeSettings;
private int mCodeActionNext;
private int mSettingsIconId;
@Override
protected void setUp() throws Exception {
super.setUp();
final String language = Locale.ENGLISH.getLanguage();
mCodesSet.setLanguage(language);
mTextsSet.setLanguage(language);
mTextsSet.loadStringResources(getContext());
mCodeSettings = KeySpecParser.parseCode(
CODE_SETTINGS, mCodesSet, CODE_UNSPECIFIED);
mCodeActionNext = KeySpecParser.parseCode(
"!code/key_action_next", mCodesSet, CODE_UNSPECIFIED);
mSettingsIconId = KeySpecParser.getIconId(ICON_SETTINGS);
}
private void assertParser(String message, String moreKeySpec, String expectedLabel,
String expectedOutputText, int expectedIcon, int expectedCode) {
final String labelResolved = KeySpecParser.resolveTextReference(moreKeySpec, mTextsSet);
final MoreKeySpec spec = new MoreKeySpec(labelResolved, false /* needsToUpperCase */,
Locale.US, mCodesSet);
assertEquals(message + " [label]", expectedLabel, spec.mLabel);
assertEquals(message + " [ouptputText]", expectedOutputText, spec.mOutputText);
assertEquals(message + " [icon]",
KeyboardIconsSet.getIconName(expectedIcon),
KeyboardIconsSet.getIconName(spec.mIconId));
assertEquals(message + " [code]",
Constants.printableCode(expectedCode),
Constants.printableCode(spec.mCode));
}
private void assertParserError(String message, String moreKeySpec, String expectedLabel,
String expectedOutputText, int expectedIcon, int expectedCode) {
try {
assertParser(message, moreKeySpec, expectedLabel, expectedOutputText, expectedIcon,
expectedCode);
fail(message);
} catch (Exception pcpe) {
// success.
}
}
// \U001d11e: MUSICAL SYMBOL G CLEF
private static final String PAIR1 = "\ud834\udd1e";
private static final int CODE1 = PAIR1.codePointAt(0);
// \U001d122: MUSICAL SYMBOL F CLEF
private static final String PAIR2 = "\ud834\udd22";
private static final int CODE2 = PAIR2.codePointAt(0);
// \U002f8a6: CJK COMPATIBILITY IDEOGRAPH-2F8A6; variant character of \u6148.
private static final String PAIR3 = "\ud87e\udca6";
private static final String SURROGATE1 = PAIR1 + PAIR2;
private static final String SURROGATE2 = PAIR1 + PAIR2 + PAIR3;
public void testSingleLetter() {
assertParser("Single letter", "a",
"a", null, ICON_UNDEFINED, 'a');
assertParser("Single surrogate", PAIR1,
PAIR1, null, ICON_UNDEFINED, CODE1);
assertParser("Single escaped bar", "\\|",
"|", null, ICON_UNDEFINED, '|');
assertParser("Single escaped escape", "\\\\",
"\\", null, ICON_UNDEFINED, '\\');
assertParser("Single comma", ",",
",", null, ICON_UNDEFINED, ',');
assertParser("Single escaped comma", "\\,",
",", null, ICON_UNDEFINED, ',');
assertParser("Single escaped letter", "\\a",
"a", null, ICON_UNDEFINED, 'a');
assertParser("Single escaped surrogate", "\\" + PAIR2,
PAIR2, null, ICON_UNDEFINED, CODE2);
assertParser("Single bang", "!",
"!", null, ICON_UNDEFINED, '!');
assertParser("Single escaped bang", "\\!",
"!", null, ICON_UNDEFINED, '!');
assertParser("Single output text letter", "a|a",
"a", null, ICON_UNDEFINED, 'a');
assertParser("Single surrogate pair outputText", "G Clef|" + PAIR1,
"G Clef", null, ICON_UNDEFINED, CODE1);
assertParser("Single letter with outputText", "a|abc",
"a", "abc", ICON_UNDEFINED, CODE_OUTPUT_TEXT);
assertParser("Single letter with surrogate outputText", "a|" + SURROGATE1,
"a", SURROGATE1, ICON_UNDEFINED, CODE_OUTPUT_TEXT);
assertParser("Single surrogate with outputText", PAIR3 + "|abc",
PAIR3, "abc", ICON_UNDEFINED, CODE_OUTPUT_TEXT);
assertParser("Single letter with escaped outputText", "a|a\\|c",
"a", "a|c", ICON_UNDEFINED, CODE_OUTPUT_TEXT);
assertParser("Single letter with escaped surrogate outputText",
"a|" + PAIR1 + "\\|" + PAIR2,
"a", PAIR1 + "|" + PAIR2, ICON_UNDEFINED, CODE_OUTPUT_TEXT);
assertParser("Single letter with comma outputText", "a|a,b",
"a", "a,b", ICON_UNDEFINED, CODE_OUTPUT_TEXT);
assertParser("Single letter with escaped comma outputText", "a|a\\,b",
"a", "a,b", ICON_UNDEFINED, CODE_OUTPUT_TEXT);
assertParser("Single letter with outputText starts with bang", "a|!bc",
"a", "!bc", ICON_UNDEFINED, CODE_OUTPUT_TEXT);
assertParser("Single letter with surrogate outputText starts with bang", "a|!" + SURROGATE2,
"a", "!" + SURROGATE2, ICON_UNDEFINED, CODE_OUTPUT_TEXT);
assertParser("Single letter with outputText contains bang", "a|a!c",
"a", "a!c", ICON_UNDEFINED, CODE_OUTPUT_TEXT);
assertParser("Single letter with escaped bang outputText", "a|\\!bc",
"a", "!bc", ICON_UNDEFINED, CODE_OUTPUT_TEXT);
assertParser("Single escaped escape with single outputText", "\\\\|\\\\",
"\\", null, ICON_UNDEFINED, '\\');
assertParser("Single escaped bar with single outputText", "\\||\\|",
"|", null, ICON_UNDEFINED, '|');
assertParser("Single letter with code", "a|" + CODE_SETTINGS,
"a", null, ICON_UNDEFINED, mCodeSettings);
}
public void testLabel() {
assertParser("Simple label", "abc",
"abc", "abc", ICON_UNDEFINED, CODE_OUTPUT_TEXT);
assertParser("Simple surrogate label", SURROGATE1,
SURROGATE1, SURROGATE1, ICON_UNDEFINED, CODE_OUTPUT_TEXT);
assertParser("Label with escaped bar", "a\\|c",
"a|c", "a|c", ICON_UNDEFINED, CODE_OUTPUT_TEXT);
assertParser("Surrogate label with escaped bar", PAIR1 + "\\|" + PAIR2,
PAIR1 + "|" + PAIR2, PAIR1 + "|" + PAIR2,
ICON_UNDEFINED, CODE_OUTPUT_TEXT);
assertParser("Label with escaped escape", "a\\\\c",
"a\\c", "a\\c", ICON_UNDEFINED, CODE_OUTPUT_TEXT);
assertParser("Label with comma", "a,c",
"a,c", "a,c", ICON_UNDEFINED, CODE_OUTPUT_TEXT);
assertParser("Label with escaped comma", "a\\,c",
"a,c", "a,c", ICON_UNDEFINED, CODE_OUTPUT_TEXT);
assertParser("Label starts with bang", "!bc",
"!bc", "!bc", ICON_UNDEFINED, CODE_OUTPUT_TEXT);
assertParser("Surrogate label starts with bang", "!" + SURROGATE1,
"!" + SURROGATE1, "!" + SURROGATE1, ICON_UNDEFINED, CODE_OUTPUT_TEXT);
assertParser("Label contains bang", "a!c",
"a!c", "a!c", ICON_UNDEFINED, CODE_OUTPUT_TEXT);
assertParser("Label with escaped bang", "\\!bc",
"!bc", "!bc", ICON_UNDEFINED, CODE_OUTPUT_TEXT);
assertParser("Label with escaped letter", "\\abc",
"abc", "abc", ICON_UNDEFINED, CODE_OUTPUT_TEXT);
assertParser("Label with outputText", "abc|def",
"abc", "def", ICON_UNDEFINED, CODE_OUTPUT_TEXT);
assertParser("Label with comma and outputText", "a,c|def",
"a,c", "def", ICON_UNDEFINED, CODE_OUTPUT_TEXT);
assertParser("Escaped comma label with outputText", "a\\,c|def",
"a,c", "def", ICON_UNDEFINED, CODE_OUTPUT_TEXT);
assertParser("Escaped label with outputText", "a\\|c|def",
"a|c", "def", ICON_UNDEFINED, CODE_OUTPUT_TEXT);
assertParser("Label with escaped bar outputText", "abc|d\\|f",
"abc", "d|f", ICON_UNDEFINED, CODE_OUTPUT_TEXT);
assertParser("Escaped escape label with outputText", "a\\\\|def",
"a\\", "def", ICON_UNDEFINED, CODE_OUTPUT_TEXT);
assertParser("Label starts with bang and outputText", "!bc|def",
"!bc", "def", ICON_UNDEFINED, CODE_OUTPUT_TEXT);
assertParser("Label contains bang label and outputText", "a!c|def",
"a!c", "def", ICON_UNDEFINED, CODE_OUTPUT_TEXT);
assertParser("Escaped bang label with outputText", "\\!bc|def",
"!bc", "def", ICON_UNDEFINED, CODE_OUTPUT_TEXT);
assertParser("Label with comma outputText", "abc|a,b",
"abc", "a,b", ICON_UNDEFINED, CODE_OUTPUT_TEXT);
assertParser("Label with escaped comma outputText", "abc|a\\,b",
"abc", "a,b", ICON_UNDEFINED, CODE_OUTPUT_TEXT);
assertParser("Label with outputText starts with bang", "abc|!bc",
"abc", "!bc", ICON_UNDEFINED, CODE_OUTPUT_TEXT);
assertParser("Label with outputText contains bang", "abc|a!c",
"abc", "a!c", ICON_UNDEFINED, CODE_OUTPUT_TEXT);
assertParser("Label with escaped bang outputText", "abc|\\!bc",
"abc", "!bc", ICON_UNDEFINED, CODE_OUTPUT_TEXT);
assertParser("Label with escaped bar outputText", "abc|d\\|f",
"abc", "d|f", ICON_UNDEFINED, CODE_OUTPUT_TEXT);
assertParser("Escaped bar label with escaped bar outputText", "a\\|c|d\\|f",
"a|c", "d|f", ICON_UNDEFINED, CODE_OUTPUT_TEXT);
assertParser("Label with code", "abc|" + CODE_SETTINGS,
"abc", null, ICON_UNDEFINED, mCodeSettings);
assertParser("Escaped label with code", "a\\|c|" + CODE_SETTINGS,
"a|c", null, ICON_UNDEFINED, mCodeSettings);
}
public void testIconAndCode() {
assertParser("Icon with outputText", ICON_SETTINGS + "|abc",
null, "abc", mSettingsIconId, CODE_OUTPUT_TEXT);
assertParser("Icon with outputText starts with bang", ICON_SETTINGS + "|!bc",
null, "!bc", mSettingsIconId, CODE_OUTPUT_TEXT);
assertParser("Icon with outputText contains bang", ICON_SETTINGS + "|a!c",
null, "a!c", mSettingsIconId, CODE_OUTPUT_TEXT);
assertParser("Icon with escaped bang outputText", ICON_SETTINGS + "|\\!bc",
null, "!bc", mSettingsIconId, CODE_OUTPUT_TEXT);
assertParser("Label starts with bang and code", "!bc|" + CODE_SETTINGS,
"!bc", null, ICON_UNDEFINED, mCodeSettings);
assertParser("Label contains bang and code", "a!c|" + CODE_SETTINGS,
"a!c", null, ICON_UNDEFINED, mCodeSettings);
assertParser("Escaped bang label with code", "\\!bc|" + CODE_SETTINGS,
"!bc", null, ICON_UNDEFINED, mCodeSettings);
assertParser("Icon with code", ICON_SETTINGS + "|" + CODE_SETTINGS,
null, null, mSettingsIconId, mCodeSettings);
}
public void testResourceReference() {
assertParser("Settings as more key", "!text/settings_as_more_key",
null, null, mSettingsIconId, mCodeSettings);
assertParser("Action next as more key", "!text/label_next_key|!code/key_action_next",
"Next", null, ICON_UNDEFINED, mCodeActionNext);
assertParser("Popular domain",
"!text/keylabel_for_popular_domain|!text/keylabel_for_popular_domain ",
".com", ".com ", ICON_UNDEFINED, CODE_OUTPUT_TEXT);
}
public void testFormatError() {
assertParserError("Empty spec", "", null,
null, ICON_UNDEFINED, CODE_UNSPECIFIED);
assertParserError("Empty label with outputText", "|a",
null, "a", ICON_UNDEFINED, CODE_UNSPECIFIED);
assertParserError("Empty label with code", "|" + CODE_SETTINGS,
null, null, ICON_UNDEFINED, mCodeSettings);
assertParserError("Empty outputText with label", "a|",
"a", null, ICON_UNDEFINED, CODE_UNSPECIFIED);
assertParserError("Empty outputText with icon", ICON_SETTINGS + "|",
null, null, mSettingsIconId, CODE_UNSPECIFIED);
assertParserError("Empty icon and code", "|",
null, null, ICON_UNDEFINED, CODE_UNSPECIFIED);
assertParserError("Icon without code", ICON_SETTINGS,
null, null, mSettingsIconId, CODE_UNSPECIFIED);
assertParserError("Non existing icon", ICON_NON_EXISTING + "|abc",
null, "abc", ICON_UNDEFINED, CODE_OUTPUT_TEXT);
assertParserError("Non existing code", "abc|" + CODE_NON_EXISTING,
"abc", null, ICON_UNDEFINED, CODE_UNSPECIFIED);
assertParserError("Third bar at end", "a|b|",
"a", null, ICON_UNDEFINED, CODE_UNSPECIFIED);
assertParserError("Multiple bar", "a|b|c",
"a", null, ICON_UNDEFINED, CODE_UNSPECIFIED);
assertParserError("Multiple bar with label and code", "a|" + CODE_SETTINGS + "|c",
"a", null, ICON_UNDEFINED, mCodeSettings);
assertParserError("Multiple bar with icon and outputText", ICON_SETTINGS + "|b|c",
null, null, mSettingsIconId, CODE_UNSPECIFIED);
assertParserError("Multiple bar with icon and code",
ICON_SETTINGS + "|" + CODE_SETTINGS + "|c",
null, null, mSettingsIconId, mCodeSettings);
}
public void testUselessUpperCaseSpecifier() {
assertParser("Single letter with CODE", "a|" + CODE_SETTINGS_UPPERCASE,
"a", "!CODE/KEY_SETTINGS", ICON_UNDEFINED, CODE_OUTPUT_TEXT);
assertParser("Label with CODE", "abc|" + CODE_SETTINGS_UPPERCASE,
"abc", "!CODE/KEY_SETTINGS", ICON_UNDEFINED, CODE_OUTPUT_TEXT);
assertParser("Escaped label with CODE", "a\\|c|" + CODE_SETTINGS_UPPERCASE,
"a|c", "!CODE/KEY_SETTINGS", ICON_UNDEFINED, CODE_OUTPUT_TEXT);
assertParser("ICON with outputText", ICON_SETTINGS_UPPERCASE + "|abc",
"!ICON/SETTINGS_KEY", "abc", ICON_UNDEFINED, CODE_OUTPUT_TEXT);
assertParser("ICON with outputText starts with bang", ICON_SETTINGS_UPPERCASE + "|!bc",
"!ICON/SETTINGS_KEY", "!bc", ICON_UNDEFINED, CODE_OUTPUT_TEXT);
assertParser("ICON with outputText contains bang", ICON_SETTINGS_UPPERCASE + "|a!c",
"!ICON/SETTINGS_KEY", "a!c", ICON_UNDEFINED, CODE_OUTPUT_TEXT);
assertParser("ICON with escaped bang outputText", ICON_SETTINGS_UPPERCASE + "|\\!bc",
"!ICON/SETTINGS_KEY", "!bc", ICON_UNDEFINED, CODE_OUTPUT_TEXT);
assertParser("Label starts with bang and CODE", "!bc|" + CODE_SETTINGS_UPPERCASE,
"!bc", "!CODE/KEY_SETTINGS", ICON_UNDEFINED, CODE_OUTPUT_TEXT);
assertParser("Label contains bang and CODE", "a!c|" + CODE_SETTINGS_UPPERCASE,
"a!c", "!CODE/KEY_SETTINGS", ICON_UNDEFINED, CODE_OUTPUT_TEXT);
assertParser("Escaped bang label with CODE", "\\!bc|" + CODE_SETTINGS_UPPERCASE,
"!bc", "!CODE/KEY_SETTINGS", ICON_UNDEFINED, CODE_OUTPUT_TEXT);
assertParser("ICON with CODE", ICON_SETTINGS_UPPERCASE + "|" + CODE_SETTINGS_UPPERCASE,
"!ICON/SETTINGS_KEY", "!CODE/KEY_SETTINGS", ICON_UNDEFINED, CODE_OUTPUT_TEXT);
assertParser("SETTINGS AS MORE KEY", "!TEXT/SETTINGS_AS_MORE_KEY",
"!TEXT/SETTINGS_AS_MORE_KEY", "!TEXT/SETTINGS_AS_MORE_KEY", ICON_UNDEFINED,
CODE_OUTPUT_TEXT);
assertParser("ACTION NEXT AS MORE KEY", "!TEXT/LABEL_NEXT_KEY|!CODE/KEY_ACTION_NEXT",
"!TEXT/LABEL_NEXT_KEY", "!CODE/KEY_ACTION_NEXT", ICON_UNDEFINED,
CODE_OUTPUT_TEXT);
assertParser("POPULAR DOMAIN",
"!TEXT/KEYLABEL_FOR_POPULAR_DOMAIN|!TEXT/KEYLABEL_FOR_POPULAR_DOMAIN ",
"!TEXT/KEYLABEL_FOR_POPULAR_DOMAIN", "!TEXT/KEYLABEL_FOR_POPULAR_DOMAIN ",
ICON_UNDEFINED, CODE_OUTPUT_TEXT);
assertParserError("Empty label with CODE", "|" + CODE_SETTINGS_UPPERCASE,
null, null, ICON_UNDEFINED, mCodeSettings);
assertParserError("Empty outputText with ICON", ICON_SETTINGS_UPPERCASE + "|",
null, null, mSettingsIconId, CODE_UNSPECIFIED);
assertParser("ICON without code", ICON_SETTINGS_UPPERCASE,
"!ICON/SETTINGS_KEY", "!ICON/SETTINGS_KEY", ICON_UNDEFINED, CODE_OUTPUT_TEXT);
assertParserError("Multiple bar with label and CODE", "a|" + CODE_SETTINGS_UPPERCASE + "|c",
"a", null, ICON_UNDEFINED, mCodeSettings);
assertParserError("Multiple bar with ICON and outputText", ICON_SETTINGS_UPPERCASE + "|b|c",
null, null, mSettingsIconId, CODE_UNSPECIFIED);
assertParserError("Multiple bar with ICON and CODE",
ICON_SETTINGS_UPPERCASE + "|" + CODE_SETTINGS_UPPERCASE + "|c",
null, null, mSettingsIconId, mCodeSettings);
}
private static void assertArrayEquals(String message, Object[] expected, Object[] actual) {
if (expected == actual) {
return;
}
if (expected == null || actual == null) {
assertEquals(message, Arrays.toString(expected), Arrays.toString(actual));
return;
}
if (expected.length != actual.length) {
assertEquals(message + " [length]", Arrays.toString(expected), Arrays.toString(actual));
return;
}
for (int i = 0; i < expected.length; i++) {
assertEquals(message + " [" + i + "]",
Arrays.toString(expected), Arrays.toString(actual));
}
}
private static void assertInsertAdditionalMoreKeys(String message, String[] moreKeys,
String[] additionalMoreKeys, String[] expected) {
final String[] actual =
KeySpecParser.insertAdditionalMoreKeys( moreKeys, additionalMoreKeys);
assertArrayEquals(message, expected, actual);
}
public void testEmptyEntry() {
assertInsertAdditionalMoreKeys("null more keys and null additons",
null,
null,
null);
assertInsertAdditionalMoreKeys("null more keys and empty additons",
null,
new String[0],
null);
assertInsertAdditionalMoreKeys("empty more keys and null additons",
new String[0],
null,
null);
assertInsertAdditionalMoreKeys("empty more keys and empty additons",
new String[0],
new String[0],
null);
assertInsertAdditionalMoreKeys("filter out empty more keys",
new String[] { null, "a", "", "b", null },
null,
new String[] { "a", "b" });
assertInsertAdditionalMoreKeys("filter out empty additons",
new String[] { "a", "%", "b", "%", "c", "%", "d" },
new String[] { null, "A", "", "B", null },
new String[] { "a", "A", "b", "B", "c", "d" });
}
public void testInsertAdditionalMoreKeys() {
// Escaped marker.
assertInsertAdditionalMoreKeys("escaped marker",
new String[] { "\\%", "%-)" },
new String[] { "1", "2" },
new String[] { "1", "2", "\\%", "%-)" });
// 0 more key.
assertInsertAdditionalMoreKeys("null & null", null, null, null);
assertInsertAdditionalMoreKeys("null & 1 additon",
null,
new String[] { "1" },
new String[] { "1" });
assertInsertAdditionalMoreKeys("null & 2 additons",
null,
new String[] { "1", "2" },
new String[] { "1", "2" });
// 0 additional more key.
assertInsertAdditionalMoreKeys("1 more key & null",
new String[] { "A" },
null,
new String[] { "A" });
assertInsertAdditionalMoreKeys("2 more keys & null",
new String[] { "A", "B" },
null,
new String[] { "A", "B" });
// No marker.
assertInsertAdditionalMoreKeys("1 more key & 1 addtional & no marker",
new String[] { "A" },
new String[] { "1" },
new String[] { "1", "A" });
assertInsertAdditionalMoreKeys("1 more key & 2 addtionals & no marker",
new String[] { "A" },
new String[] { "1", "2" },
new String[] { "1", "2", "A" });
assertInsertAdditionalMoreKeys("2 more keys & 1 addtional & no marker",
new String[] { "A", "B" },
new String[] { "1" },
new String[] { "1", "A", "B" });
assertInsertAdditionalMoreKeys("2 more keys & 2 addtionals & no marker",
new String[] { "A", "B" },
new String[] { "1", "2" },
new String[] { "1", "2", "A", "B" });
// 1 marker.
assertInsertAdditionalMoreKeys("1 more key & 1 additon & marker at head",
new String[] { "%", "A" },
new String[] { "1" },
new String[] { "1", "A" });
assertInsertAdditionalMoreKeys("1 more key & 1 additon & marker at tail",
new String[] { "A", "%" },
new String[] { "1" },
new String[] { "A", "1" });
assertInsertAdditionalMoreKeys("2 more keys & 1 additon & marker at middle",
new String[] { "A", "%", "B" },
new String[] { "1" },
new String[] { "A", "1", "B" });
// 1 marker & excess additional more keys.
assertInsertAdditionalMoreKeys("1 more key & 2 additons & marker at head",
new String[] { "%", "A", "B" },
new String[] { "1", "2" },
new String[] { "1", "A", "B", "2" });
assertInsertAdditionalMoreKeys("1 more key & 2 additons & marker at tail",
new String[] { "A", "B", "%" },
new String[] { "1", "2" },
new String[] { "A", "B", "1", "2" });
assertInsertAdditionalMoreKeys("2 more keys & 2 additons & marker at middle",
new String[] { "A", "%", "B" },
new String[] { "1", "2" },
new String[] { "A", "1", "B", "2" });
// 2 markers.
assertInsertAdditionalMoreKeys("0 more key & 2 addtional & 2 markers",
new String[] { "%", "%" },
new String[] { "1", "2" },
new String[] { "1", "2" });
assertInsertAdditionalMoreKeys("1 more key & 2 addtional & 2 markers at head",
new String[] { "%", "%", "A" },
new String[] { "1", "2" },
new String[] { "1", "2", "A" });
assertInsertAdditionalMoreKeys("1 more key & 2 addtional & 2 markers at tail",
new String[] { "A", "%", "%" },
new String[] { "1", "2" },
new String[] { "A", "1", "2" });
assertInsertAdditionalMoreKeys("2 more keys & 2 addtional & 2 markers at middle",
new String[] { "A", "%", "%", "B" },
new String[] { "1", "2" },
new String[] { "A", "1", "2", "B" });
assertInsertAdditionalMoreKeys("2 more keys & 2 addtional & 2 markers at head & middle",
new String[] { "%", "A", "%", "B" },
new String[] { "1", "2" },
new String[] { "1", "A", "2", "B" });
assertInsertAdditionalMoreKeys("2 more keys & 2 addtional & 2 markers at head & tail",
new String[] { "%", "A", "B", "%" },
new String[] { "1", "2" },
new String[] { "1", "A", "B", "2" });
assertInsertAdditionalMoreKeys("2 more keys & 2 addtional & 2 markers at middle & tail",
new String[] { "A", "%", "B", "%" },
new String[] { "1", "2" },
new String[] { "A", "1", "B", "2" });
// 2 markers & excess additional more keys.
assertInsertAdditionalMoreKeys("0 more key & 2 additons & 2 markers",
new String[] { "%", "%" },
new String[] { "1", "2", "3" },
new String[] { "1", "2", "3" });
assertInsertAdditionalMoreKeys("1 more key & 2 additons & 2 markers at head",
new String[] { "%", "%", "A" },
new String[] { "1", "2", "3" },
new String[] { "1", "2", "A", "3" });
assertInsertAdditionalMoreKeys("1 more key & 2 additons & 2 markers at tail",
new String[] { "A", "%", "%" },
new String[] { "1", "2", "3" },
new String[] { "A", "1", "2", "3" });
assertInsertAdditionalMoreKeys("2 more keys & 2 additons & 2 markers at middle",
new String[] { "A", "%", "%", "B" },
new String[] { "1", "2", "3" },
new String[] { "A", "1", "2", "B", "3" });
assertInsertAdditionalMoreKeys("2 more keys & 2 additons & 2 markers at head & middle",
new String[] { "%", "A", "%", "B" },
new String[] { "1", "2", "3" },
new String[] { "1", "A", "2", "B", "3" });
assertInsertAdditionalMoreKeys("2 more keys & 2 additons & 2 markers at head & tail",
new String[] { "%", "A", "B", "%" },
new String[] { "1", "2", "3" },
new String[] { "1", "A", "B", "2", "3" });
assertInsertAdditionalMoreKeys("2 more keys & 2 additons & 2 markers at middle & tail",
new String[] { "A", "%", "B", "%" },
new String[] { "1", "2", "3" },
new String[] { "A", "1", "B", "2", "3" });
// 0 addtional more key and excess markers.
assertInsertAdditionalMoreKeys("0 more key & null & excess marker",
new String[] { "%" },
null,
null);
assertInsertAdditionalMoreKeys("1 more key & null & excess marker at head",
new String[] { "%", "A" },
null,
new String[] { "A" });
assertInsertAdditionalMoreKeys("1 more key & null & excess marker at tail",
new String[] { "A", "%" },
null,
new String[] { "A" });
assertInsertAdditionalMoreKeys("2 more keys & null & excess marker at middle",
new String[] { "A", "%", "B" },
null,
new String[] { "A", "B" });
assertInsertAdditionalMoreKeys("2 more keys & null & excess markers",
new String[] { "%", "A", "%", "B", "%" },
null,
new String[] { "A", "B" });
// Excess markers.
assertInsertAdditionalMoreKeys("0 more key & 1 additon & excess marker",
new String[] { "%", "%" },
new String[] { "1" },
new String[] { "1" });
assertInsertAdditionalMoreKeys("1 more key & 1 additon & excess marker at head",
new String[] { "%", "%", "A" },
new String[] { "1" },
new String[] { "1", "A" });
assertInsertAdditionalMoreKeys("1 more key & 1 additon & excess marker at tail",
new String[] { "A", "%", "%" },
new String[] { "1" },
new String[] { "A", "1" });
assertInsertAdditionalMoreKeys("2 more keys & 1 additon & excess marker at middle",
new String[] { "A", "%", "%", "B" },
new String[] { "1" },
new String[] { "A", "1", "B" });
assertInsertAdditionalMoreKeys("2 more keys & 1 additon & excess markers",
new String[] { "%", "A", "%", "B", "%" },
new String[] { "1" },
new String[] { "1", "A", "B" });
assertInsertAdditionalMoreKeys("2 more keys & 2 additons & excess markers",
new String[] { "%", "A", "%", "B", "%" },
new String[] { "1", "2" },
new String[] { "1", "A", "2", "B" });
assertInsertAdditionalMoreKeys("2 more keys & 3 additons & excess markers",
new String[] { "%", "A", "%", "%", "B", "%" },
new String[] { "1", "2", "3" },
new String[] { "1", "A", "2", "3", "B" });
}
private static final String HAS_LABEL = "!hasLabel!";
private static final String NEEDS_DIVIDER = "!needsDividers!";
private static final String AUTO_COLUMN_ORDER = "!autoColumnOrder!";
private static final String FIXED_COLUMN_ORDER = "!fixedColumnOrder!";
private static void assertGetBooleanValue(String message, String key, String[] moreKeys,
String[] expected, boolean expectedValue) {
final String[] actual = Arrays.copyOf(moreKeys, moreKeys.length);
final boolean actualValue = KeySpecParser.getBooleanValue(actual, key);
assertEquals(message + " [value]", expectedValue, actualValue);
assertArrayEquals(message, expected, actual);
}
public void testGetBooleanValue() {
assertGetBooleanValue("Has label", HAS_LABEL,
new String[] { HAS_LABEL, "a", "b", "c" },
new String[] { null, "a", "b", "c" }, true);
// Upper case specification will not work.
assertGetBooleanValue("HAS LABEL", HAS_LABEL,
new String[] { HAS_LABEL.toUpperCase(), "a", "b", "c" },
new String[] { "!HASLABEL!", "a", "b", "c" }, false);
assertGetBooleanValue("No has label", HAS_LABEL,
new String[] { "a", "b", "c" },
new String[] { "a", "b", "c" }, false);
assertGetBooleanValue("No has label with fixed clumn order", HAS_LABEL,
new String[] { FIXED_COLUMN_ORDER + "3", "a", "b", "c" },
new String[] { FIXED_COLUMN_ORDER + "3", "a", "b", "c" }, false);
// Upper case specification will not work.
assertGetBooleanValue("Multiple has label", HAS_LABEL,
new String[] {
"a", HAS_LABEL.toUpperCase(), "b", "c", HAS_LABEL, "d" },
new String[] {
"a", "!HASLABEL!", "b", "c", null, "d" }, true);
// Upper case specification will not work.
assertGetBooleanValue("Multiple has label with needs dividers", HAS_LABEL,
new String[] {
"a", HAS_LABEL, "b", NEEDS_DIVIDER, HAS_LABEL.toUpperCase(), "d" },
new String[] {
"a", null, "b", NEEDS_DIVIDER, "!HASLABEL!", "d" }, true);
}
private static void assertGetIntValue(String message, String key, int defaultValue,
String[] moreKeys, String[] expected, int expectedValue) {
final String[] actual = Arrays.copyOf(moreKeys, moreKeys.length);
final int actualValue = KeySpecParser.getIntValue(actual, key, defaultValue);
assertEquals(message + " [value]", expectedValue, actualValue);
assertArrayEquals(message, expected, actual);
}
public void testGetIntValue() {
assertGetIntValue("Fixed column order 3", FIXED_COLUMN_ORDER, -1,
new String[] { FIXED_COLUMN_ORDER + "3", "a", "b", "c" },
new String[] { null, "a", "b", "c" }, 3);
// Upper case specification will not work.
assertGetIntValue("FIXED COLUMN ORDER 3", FIXED_COLUMN_ORDER, -1,
new String[] { FIXED_COLUMN_ORDER.toUpperCase() + "3", "a", "b", "c" },
new String[] { "!FIXEDCOLUMNORDER!3", "a", "b", "c" }, -1);
assertGetIntValue("No fixed column order", FIXED_COLUMN_ORDER, -1,
new String[] { "a", "b", "c" },
new String[] { "a", "b", "c" }, -1);
assertGetIntValue("No fixed column order with auto column order", FIXED_COLUMN_ORDER, -1,
new String[] { AUTO_COLUMN_ORDER + "5", "a", "b", "c" },
new String[] { AUTO_COLUMN_ORDER + "5", "a", "b", "c" }, -1);
assertGetIntValue("Multiple fixed column order 3,5", FIXED_COLUMN_ORDER, -1,
new String[] { FIXED_COLUMN_ORDER + "3", "a", FIXED_COLUMN_ORDER + "5", "b" },
new String[] { null, "a", null, "b" }, 3);
// Upper case specification will not work.
assertGetIntValue("Multiple fixed column order 5,3 with has label", FIXED_COLUMN_ORDER, -1,
new String[] {
FIXED_COLUMN_ORDER.toUpperCase() + "5", HAS_LABEL, "a",
FIXED_COLUMN_ORDER + "3", "b" },
new String[] { "!FIXEDCOLUMNORDER!5", HAS_LABEL, "a", null, "b" }, 3);
}
}