/*
* Copyright (C) 2015 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.ide.common.resources.configuration;
import static com.android.ide.common.resources.configuration.LocaleQualifier.FAKE_VALUE;
import static com.android.ide.common.resources.configuration.LocaleQualifier.getQualifier;
import static com.android.ide.common.resources.configuration.LocaleQualifier.isNormalizedCase;
import static com.android.ide.common.resources.configuration.LocaleQualifier.normalizeCase;
import static com.android.ide.common.resources.configuration.LocaleQualifier.parseBcp47;
import junit.framework.TestCase;
import java.util.Locale;
public class LocaleQualifierTest extends TestCase {
private FolderConfiguration config;
private LocaleQualifier lq;
@Override
public void setUp() throws Exception {
super.setUp();
config = new FolderConfiguration();
lq = new LocaleQualifier();
}
@Override
protected void tearDown() throws Exception {
super.tearDown();
config = null;
lq = null;
}
public void testCheckAndSet() {
assertEquals(true, lq.checkAndSet("b+kok", config)); //$NON-NLS-1$
assertTrue(config.getLocaleQualifier() != null);
assertEquals("kok", config.getLocaleQualifier().toString()); //$NON-NLS-1$
}
public void testCheckAndSetCaseInsensitive() {
assertEquals(true, lq.checkAndSet("b+KOK", config)); //$NON-NLS-1$
assertTrue(config.getLocaleQualifier() != null);
assertEquals("kok", config.getLocaleQualifier().toString()); //$NON-NLS-1$
}
public void testFailures() {
assertEquals(false, lq.checkAndSet("", config)); //$NON-NLS-1$
assertEquals(false, lq.checkAndSet("abcd", config)); //$NON-NLS-1$
assertEquals(false, lq.checkAndSet("en-USofA", config)); //$NON-NLS-1$
}
@SuppressWarnings("ConstantConditions")
public void testGetQualifier() {
assertNull(getQualifier("v4")); // version qualifier shouldn't match
assertNull(getQualifier(""));
assertEquals("en", getQualifier("en").getLanguage());
assertNull(getQualifier("en").getRegion());
assertNull(getQualifier("en").getScript());
assertEquals("en", getQualifier("EN").getLanguage());
assertEquals("en", getQualifier("EN").getFull());
assertEquals("en", getQualifier("en-rUS").getLanguage());
assertEquals("US", getQualifier("en-rUS").getRegion());
assertNull(getQualifier("en-rUS").getScript());
assertEquals("en", getQualifier("EN-RUS").getLanguage());
assertEquals("en", getQualifier("EN-RUS").getLanguage());
assertEquals("US", getQualifier("EN-RUS").getRegion());
assertNull(getQualifier("EN-RUS").getScript());
assertEquals("en-rUS", getQualifier("EN-RUS").getFull());
assertEquals("eng", getQualifier("eng").getLanguage());
assertNull(getQualifier("eng").getRegion());
assertNull(getQualifier("eng").getScript());
assertEquals("eng", getQualifier("ENG").getLanguage());
assertEquals("eng", getQualifier("ENG").getFull());
assertEquals("foo", getQualifier("foo").getLanguage());
assertNull(getQualifier("car")); // car mode: not recognized as language
assertEquals("eng", getQualifier("eng-rUS").getLanguage());
assertEquals("US", getQualifier("eng-rUS").getRegion());
assertNull(getQualifier("eng-rUS").getScript());
assertEquals("eng", getQualifier("ENG-RUS").getLanguage());
assertEquals("eng", getQualifier("ENG-RUS").getLanguage());
assertEquals("US", getQualifier("ENG-RUS").getRegion());
assertNull(getQualifier("ENG-RUS").getScript());
assertEquals("eng-rUS", getQualifier("ENG-RUS").getFull());
assertNull(getQualifier("eng-rUSA"));
assertNull(getQualifier("kok-rIND"));
assertEquals("kok", getQualifier("b+kok").getLanguage());
assertNull(getQualifier("b+kok").getRegion());
assertEquals("kok", getQualifier("b+kok+VARIANT").getLanguage());
assertNull(getQualifier("b+kok+VARIANT").getRegion());
assertEquals("kok", getQualifier("b+kok+Knda+419+VARIANT").getLanguage());
assertEquals("419", getQualifier("b+kok+Knda+419+VARIANT").getRegion());
assertEquals("Knda", getQualifier("b+kok+Knda+419+VARIANT").getScript());
assertEquals("kok", getQualifier("b+kok+VARIANT").getLanguage());
assertNull(getQualifier("b+kok+VARIANT").getRegion());
assertEquals("kok", getQualifier("b+kok+IN").getLanguage());
assertEquals("IN", getQualifier("b+kok+IN").getRegion());
assertEquals("kok", getQualifier("b+kok+Knda").getLanguage());
assertNull(getQualifier("b+kok+Knda").getRegion());
assertEquals("kok", getQualifier("b+kok+Knda+419").getLanguage());
assertEquals("419", getQualifier("b+kok+Knda+419").getRegion());
assertEquals("b+kok+Knda+419", getQualifier("b+KOK+knda+419").getFull());
}
public void testSetRegion() {
LocaleQualifier qualifier = getQualifier("en");
assertNotNull(qualifier);
qualifier.setRegionSegment("rUS");
assertEquals("en", qualifier.getLanguage());
assertEquals("US", qualifier.getRegion());
assertEquals("en-rUS", qualifier.getFull());
// Case check
qualifier = getQualifier("EN");
assertNotNull(qualifier);
qualifier.setRegionSegment("Rus");
assertEquals("en", qualifier.getLanguage());
assertEquals("US", qualifier.getRegion());
assertEquals("en-rUS", qualifier.getFull());
// 3 letter language
qualifier = getQualifier("eng");
assertNotNull(qualifier);
qualifier.setRegionSegment("rUS");
assertEquals("eng", qualifier.getLanguage());
assertEquals("US", qualifier.getRegion());
assertEquals("eng-rUS", qualifier.getFull());
}
public void testEquals() {
LocaleQualifier qualifier1 = getQualifier("b+KOK+knda+419");
LocaleQualifier qualifier2 = getQualifier("b+kok+knda+419");
assertNotNull(qualifier1);
assertNotNull(qualifier2);
assertEquals(qualifier1, qualifier2);
assertEquals(qualifier2, qualifier1);
qualifier2 = getQualifier("b+kok+knda");
assertNotNull(qualifier2);
assertFalse(qualifier1.equals(qualifier2));
assertFalse(qualifier2.equals(qualifier1));
// Equivalent, with different syntax
qualifier1 = getQualifier("b+en+US");
qualifier2 = getQualifier("en-rUS");
assertNotNull(qualifier1);
assertNotNull(qualifier1);
assertNotNull(qualifier2);
assertEquals(qualifier1, qualifier2);
assertEquals(qualifier2, qualifier1);
qualifier1 = getQualifier("b+eng+US");
qualifier2 = getQualifier("eng-rUS");
assertNotNull(qualifier1);
assertNotNull(qualifier1);
assertNotNull(qualifier2);
assertEquals(qualifier1, qualifier2);
assertEquals(qualifier2, qualifier1);
}
@SuppressWarnings("ConstantConditions")
public void testParseBcp47() {
assertNull(parseBcp47("kok-rIN"));
assertEquals("kok", parseBcp47("b+kok").getLanguage());
assertNull(parseBcp47("b+kok").getRegion());
assertEquals("kok", parseBcp47("b+kok+VARIANT").getLanguage());
assertNull(parseBcp47("b+kok+VARIANT").getRegion());
assertEquals("kok", parseBcp47("b+kok+Knda+419+VARIANT").getLanguage());
assertEquals("419", parseBcp47("b+kok+Knda+419+VARIANT").getRegion());
assertEquals("Knda", parseBcp47("b+kok+Knda+419+VARIANT").getScript());
assertEquals("kok", parseBcp47("b+kok+VARIANT").getLanguage());
assertNull(parseBcp47("b+kok+VARIANT").getRegion());
assertEquals("kok", parseBcp47("b+kok+IN").getLanguage());
assertEquals("IN", parseBcp47("b+kok+IN").getRegion());
assertEquals("kok", parseBcp47("b+kok+Knda").getLanguage());
assertEquals("Knda", parseBcp47("b+kok+Knda").getScript());
assertNull(parseBcp47("b+kok+Knda").getRegion());
assertEquals("kok", parseBcp47("b+kok+Knda+419").getLanguage());
assertEquals("419", parseBcp47("b+kok+Knda+419").getRegion());
assertEquals("Knda", parseBcp47("b+kok+Knda+419").getScript());
}
@SuppressWarnings("ConstantConditions")
public void testGetLanguageAndGetRegion() {
assertEquals(true, lq.checkAndSet("b+kok", config)); //$NON-NLS-1$
assertEquals("kok", config.getLocaleQualifier().getValue());
assertEquals("kok", config.getLocaleQualifier().getLanguage());
assertEquals("kok", config.getLocaleQualifier().getLanguage());
assertNull("kok", config.getLocaleQualifier().getRegion());
assertEquals(true, lq.checkAndSet("b+kok+VARIANT", config)); //$NON-NLS-1$
assertEquals("b+kok+variant", config.getLocaleQualifier().getValue());
assertEquals("kok", config.getLocaleQualifier().getLanguage());
assertNull("kok", config.getLocaleQualifier().getRegion());
assertEquals(true, lq.checkAndSet("b+kok+Knda+419+VARIANT", config)); //$NON-NLS-1$
assertEquals("b+kok+Knda+419+variant", config.getLocaleQualifier().getValue());
assertEquals("kok", config.getLocaleQualifier().getLanguage());
assertEquals("419", config.getLocaleQualifier().getRegion());
assertEquals(true, lq.checkAndSet("b+kok+IN", config)); //$NON-NLS-1$
assertEquals("kok-rIN", config.getLocaleQualifier().getValue());
assertEquals("kok", config.getLocaleQualifier().getLanguage());
assertEquals("IN", config.getLocaleQualifier().getRegion());
assertEquals(true, lq.checkAndSet("b+kok+Knda", config)); //$NON-NLS-1$
assertEquals("b+kok+Knda", config.getLocaleQualifier().getValue());
assertEquals("kok", config.getLocaleQualifier().getLanguage());
assertNull(config.getLocaleQualifier().getRegion());
assertEquals(true, lq.checkAndSet("b+kok+Knda+419", config)); //$NON-NLS-1$
assertEquals("b+kok+Knda+419", config.getLocaleQualifier().getValue());
assertEquals("kok", config.getLocaleQualifier().getLanguage());
assertEquals("419", config.getLocaleQualifier().getRegion());
}
public void testIsNormalCase() {
// Language
assertFalse(isNormalizedCase("LL"));
assertFalse(isNormalizedCase("Ll"));
assertFalse(isNormalizedCase("lL"));
assertFalse(isNormalizedCase("LLL"));
assertTrue(isNormalizedCase("ll"));
assertTrue(isNormalizedCase("lll"));
// Language + Region
assertFalse(isNormalizedCase("LL-rRR"));
assertFalse(isNormalizedCase("ll-rrr"));
assertFalse(isNormalizedCase("LL-rrr"));
assertFalse(isNormalizedCase("ll-RRR"));
assertFalse(isNormalizedCase("lL-frR"));
assertFalse(isNormalizedCase("Ll-fRr"));
assertFalse(isNormalizedCase("llL-frr"));
assertTrue(isNormalizedCase("ll-rRR"));
assertTrue(isNormalizedCase("lll-rRR"));
// BCP 47
assertFalse(isNormalizedCase("b+en+CA+x+ca".toLowerCase(Locale.US)));
assertTrue(isNormalizedCase("b+en+CA+x+ca"));
assertFalse(isNormalizedCase("b+sgn+BE+FR".toLowerCase(Locale.US)));
assertTrue(isNormalizedCase("b+sgn+BE+FR"));
assertFalse(isNormalizedCase("b+az+Latn+x+latn".toLowerCase(Locale.US)));
assertTrue(isNormalizedCase("b+az+Latn+x+latn"));
assertFalse(isNormalizedCase("b+MN+cYRL+mn".toLowerCase(Locale.US)));
assertTrue(isNormalizedCase("b+mn+Cyrl+MN"));
assertFalse(isNormalizedCase("b+zh+CN+a+myext+x+private".toLowerCase(Locale.US)));
assertTrue(isNormalizedCase("b+zh+CN+a+myext+x+private"));
}
public void testNormalizeCase() {
assertEquals("bb", normalizeCase("BB"));
assertEquals("ll-rRR", normalizeCase("LL-Rrr"));
assertEquals("lll-rRR", normalizeCase("LLL-Rrr"));
assertEquals("b+en+CA+x+ca", normalizeCase("b+en+CA+x+ca".toLowerCase(Locale.US)));
assertEquals("b+sgn+BE+FR", normalizeCase("b+sgn+BE+FR".toLowerCase(Locale.US)));
assertEquals("b+az+Latn+x+latn", normalizeCase("b+az+Latn+x+latn".toLowerCase(Locale.US)));
assertEquals("b+mn+Cyrl+MN", normalizeCase("b+MN+cYRL+mn".toLowerCase(Locale.US)));
assertEquals("b+zh+CN+a+myext+x+private", normalizeCase(
"b+zh+CN+a+myext+x+private".toLowerCase(Locale.US)));
}
@SuppressWarnings("ConstantConditions")
public void testIsMatchFor() {
assertTrue(getQualifier("en").isMatchFor(getQualifier("en")));
assertFalse(getQualifier("en").isMatchFor(getQualifier("fr")));
assertFalse(getQualifier("fr").isMatchFor(getQualifier("en")));
assertTrue(getQualifier("en-rUS").isMatchFor(getQualifier("en-rUS")));
assertFalse(getQualifier("en-rUS").isMatchFor(getQualifier("en-rGB")));
assertFalse(getQualifier("en-rGB").isMatchFor(getQualifier("en-rUS")));
assertFalse(getQualifier("fr-rGB").isMatchFor(getQualifier("en-rGB")));
assertTrue(getQualifier("en-rUS").isMatchFor(getQualifier("en-rUS")));
assertTrue(getQualifier("en-rUS").isMatchFor(getQualifier("en")));
assertTrue(getQualifier("b+en+US").isMatchFor(getQualifier("b+en+US")));
assertTrue(getQualifier("b+en+US").isMatchFor(getQualifier("b+en")));
assertTrue(getQualifier("b+en+US").isMatchFor(getQualifier("en")));
assertTrue(getQualifier("b+en+US").isMatchFor(getQualifier("b+en+US")));
assertTrue(getQualifier("b+en+Knda+US").isMatchFor(getQualifier("b+en+Knda+US")));
assertTrue(getQualifier("b+en+Knda+US").isMatchFor(getQualifier("b+en")));
// Apparently isMatchFor is a bit more general than you would think; it
// can't restrict as shown in these two conditions because then other
// configuration matching code will fail
//assertFalse(getQualifier("en").isMatchFor(getQualifier("en-rUS")));
//assertFalse(getQualifier("b+en").isMatchFor(getQualifier("b+en+Knda+US")));
}
@SuppressWarnings("ConstantConditions")
public void testGetTag() {
assertEquals("en-CA", getQualifier("b+en+CA".toLowerCase(Locale.US)).getTag());
assertEquals("eng-CA", getQualifier("b+eng+CA".toLowerCase(Locale.US)).getTag());
assertEquals("en-CA-x-ca", getQualifier("b+en+CA+x+ca".toLowerCase(Locale.US)).getTag());
assertEquals("en", getQualifier("EN").getTag());
assertEquals("en-US", getQualifier("EN-rUS").getTag());
}
public void testHasLanguage() {
//noinspection ConstantConditions
assertTrue(LocaleQualifier.getQualifier("b+en+CA+x+ca").hasLanguage());
assertTrue(new LocaleQualifier("en").hasLanguage());
assertFalse(new LocaleQualifier(FAKE_VALUE).hasLanguage());
}
public void testHasRegion() {
//noinspection ConstantConditions
assertTrue(LocaleQualifier.getQualifier("b+en+CA+x+ca").hasRegion());
//noinspection ConstantConditions
assertFalse(LocaleQualifier.getQualifier("b+en").hasRegion());
assertFalse(new LocaleQualifier(FAKE_VALUE).hasRegion());
assertFalse(new LocaleQualifier("", FAKE_VALUE, FAKE_VALUE, null).hasRegion());
}
}