blob: deba40f62173254bbdd48e850578dbc2881ab57a [file] [log] [blame]
/*
* Copyright (C) 2016 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.internal.inputmethod;
import android.test.InstrumentationTestCase;
import android.test.suitebuilder.annotation.SmallTest;
import android.util.LocaleList;
import java.util.ArrayList;
import java.util.Locale;
public class LocaleUtilsTest extends InstrumentationTestCase {
private static final LocaleUtils.LocaleExtractor<Locale> sIdentityMapper =
new LocaleUtils.LocaleExtractor<Locale>() {
@Override
public Locale get(Locale source) {
return source;
}
};
@SmallTest
public void testFilterByLanguageEmptyLanguageList() throws Exception {
final ArrayList<Locale> availableLocales = new ArrayList<>();
availableLocales.add(Locale.forLanguageTag("en-US"));
availableLocales.add(Locale.forLanguageTag("fr-CA"));
availableLocales.add(Locale.forLanguageTag("in"));
availableLocales.add(Locale.forLanguageTag("ja"));
availableLocales.add(Locale.forLanguageTag("fil"));
final LocaleList preferredLocales = LocaleList.getEmptyLocaleList();
final ArrayList<Locale> dest = new ArrayList<>();
LocaleUtils.filterByLanguage(availableLocales, sIdentityMapper, preferredLocales, dest);
assertEquals(0, dest.size());
}
@SmallTest
public void testFilterDoesNotMatchAnything() throws Exception {
final ArrayList<Locale> availableLocales = new ArrayList<>();
availableLocales.add(Locale.forLanguageTag("en-US"));
availableLocales.add(Locale.forLanguageTag("fr-CA"));
availableLocales.add(Locale.forLanguageTag("in"));
availableLocales.add(Locale.forLanguageTag("ja"));
availableLocales.add(Locale.forLanguageTag("fil"));
final LocaleList preferredLocales = LocaleList.forLanguageTags("zh-Hans-TW");
final ArrayList<Locale> dest = new ArrayList<>();
LocaleUtils.filterByLanguage(availableLocales, sIdentityMapper, preferredLocales, dest);
assertEquals(0, dest.size());
}
@SmallTest
public void testFilterByLanguageEmptySource() throws Exception {
final ArrayList<Locale> availableLocales = new ArrayList<>();
final LocaleList preferredLocales = LocaleList.forLanguageTags("fr,en-US,ja-JP");
final ArrayList<Locale> dest = new ArrayList<>();
LocaleUtils.filterByLanguage(availableLocales, sIdentityMapper, preferredLocales, dest);
assertEquals(0, dest.size());
}
@SmallTest
public void testFilterByLanguageNullAvailableLocales() throws Exception {
{
final LocaleList preferredLocales =
LocaleList.forLanguageTags("en-AU,en-GB,en-US,en,en-IN");
final ArrayList<Locale> availableLocales = new ArrayList<>();
availableLocales.add(null);
final ArrayList<Locale> dest = new ArrayList<>();
LocaleUtils.filterByLanguage(availableLocales, sIdentityMapper, preferredLocales, dest);
assertEquals(0, dest.size());
}
{
final LocaleList preferredLocales =
LocaleList.forLanguageTags("en-AU,en-GB,en-US,en,en-IN");
final ArrayList<Locale> availableLocales = new ArrayList<>();
availableLocales.add(null);
availableLocales.add(null);
availableLocales.add(null);
final ArrayList<Locale> dest = new ArrayList<>();
LocaleUtils.filterByLanguage(availableLocales, sIdentityMapper, preferredLocales, dest);
assertEquals(0, dest.size());
}
{
final LocaleList preferredLocales =
LocaleList.forLanguageTags("en-AU,en-GB,en-US,en,en-IN");
final ArrayList<Locale> availableLocales = new ArrayList<>();
availableLocales.add(null);
availableLocales.add(Locale.forLanguageTag("en-US"));
availableLocales.add(null);
availableLocales.add(null);
final ArrayList<Locale> dest = new ArrayList<>();
LocaleUtils.filterByLanguage(availableLocales, sIdentityMapper, preferredLocales, dest);
assertEquals(1, dest.size());
assertEquals(availableLocales.get(1), dest.get(0)); // "en-US"
}
{
final LocaleList preferredLocales =
LocaleList.forLanguageTags("en-AU,en-GB,en-US,en,en-IN");
final ArrayList<Locale> availableLocales = new ArrayList<>();
availableLocales.add(null);
availableLocales.add(Locale.forLanguageTag("en"));
availableLocales.add(null);
availableLocales.add(null);
final ArrayList<Locale> dest = new ArrayList<>();
LocaleUtils.filterByLanguage(availableLocales, sIdentityMapper, preferredLocales, dest);
assertEquals(1, dest.size());
assertEquals(availableLocales.get(1), dest.get(0)); // "en"
}
{
final LocaleList preferredLocales =
LocaleList.forLanguageTags("en-AU,en-GB,en-US,en,en-IN");
final ArrayList<Locale> availableLocales = new ArrayList<>();
availableLocales.add(null);
availableLocales.add(Locale.forLanguageTag("ja-JP"));
availableLocales.add(null);
availableLocales.add(null);
final ArrayList<Locale> dest = new ArrayList<>();
LocaleUtils.filterByLanguage(availableLocales, sIdentityMapper, preferredLocales, dest);
assertEquals(0, dest.size());
}
}
@SmallTest
public void testFilterByLanguage() throws Exception {
{
final ArrayList<Locale> availableLocales = new ArrayList<>();
availableLocales.add(Locale.forLanguageTag("en-US"));
availableLocales.add(Locale.forLanguageTag("fr-CA"));
availableLocales.add(Locale.forLanguageTag("in"));
availableLocales.add(Locale.forLanguageTag("ja"));
availableLocales.add(Locale.forLanguageTag("fil"));
final LocaleList preferredLocales = LocaleList.forLanguageTags("fr,en-US,ja-JP");
final ArrayList<Locale> dest = new ArrayList<>();
LocaleUtils.filterByLanguage(availableLocales, sIdentityMapper, preferredLocales, dest);
assertEquals(3, dest.size());
assertEquals(availableLocales.get(1), dest.get(0)); // "fr-CA"
assertEquals(availableLocales.get(0), dest.get(1)); // "en-US"
assertEquals(availableLocales.get(3), dest.get(2)); // "ja"
}
{
final ArrayList<Locale> availableLocales = new ArrayList<>();
availableLocales.add(Locale.forLanguageTag("en-US"));
availableLocales.add(Locale.forLanguageTag("en-GB"));
availableLocales.add(Locale.forLanguageTag("en-IN"));
final LocaleList preferredLocales = LocaleList.forLanguageTags("en-US");
final ArrayList<Locale> dest = new ArrayList<>();
LocaleUtils.filterByLanguage(availableLocales, sIdentityMapper, preferredLocales, dest);
assertEquals(1, dest.size());
assertEquals(availableLocales.get(0), dest.get(0)); // "en-US"
}
}
@SmallTest
public void testFilterByLanguageTheSameLanguage() throws Exception {
{
final LocaleList preferredLocales =
LocaleList.forLanguageTags("en-AU,en-GB,en-US,en,en-IN");
final ArrayList<Locale> availableLocales = new ArrayList<>();
availableLocales.add(Locale.forLanguageTag("fr-CA"));
availableLocales.add(Locale.forLanguageTag("en-US"));
final ArrayList<Locale> dest = new ArrayList<>();
LocaleUtils.filterByLanguage(availableLocales, sIdentityMapper, preferredLocales, dest);
assertEquals(1, dest.size());
assertEquals(availableLocales.get(1), dest.get(0)); // "en-US"
}
{
final LocaleList preferredLocales =
LocaleList.forLanguageTags("en-AU,en-GB,en-US,en,en-IN");
final ArrayList<Locale> availableLocales = new ArrayList<>();
availableLocales.add(Locale.forLanguageTag("fr-CA"));
availableLocales.add(Locale.forLanguageTag("en"));
final ArrayList<Locale> dest = new ArrayList<>();
LocaleUtils.filterByLanguage(availableLocales, sIdentityMapper, preferredLocales, dest);
assertEquals(1, dest.size());
assertEquals(availableLocales.get(1), dest.get(0)); // "en"
}
{
final LocaleList preferredLocales =
LocaleList.forLanguageTags("en-AU,en-GB,en-US,en,en-IN");
final ArrayList<Locale> availableLocales = new ArrayList<>();
availableLocales.add(Locale.forLanguageTag("fr-CA"));
availableLocales.add(Locale.forLanguageTag("en-CA"));
availableLocales.add(Locale.forLanguageTag("en-IN"));
final ArrayList<Locale> dest = new ArrayList<>();
LocaleUtils.filterByLanguage(availableLocales, sIdentityMapper, preferredLocales, dest);
assertEquals(1, dest.size());
assertEquals(availableLocales.get(2), dest.get(0)); // "en-IN"
}
{
final LocaleList preferredLocales =
LocaleList.forLanguageTags("en-AU,en-GB,en-US,en-IN");
final ArrayList<Locale> availableLocales = new ArrayList<>();
availableLocales.add(Locale.forLanguageTag("fr-CA"));
availableLocales.add(Locale.forLanguageTag("en-CA"));
availableLocales.add(Locale.forLanguageTag("en-NZ"));
availableLocales.add(Locale.forLanguageTag("en-BZ"));
final ArrayList<Locale> dest = new ArrayList<>();
LocaleUtils.filterByLanguage(availableLocales, sIdentityMapper, preferredLocales, dest);
assertEquals(1, dest.size());
assertEquals(availableLocales.get(1), dest.get(0)); // "en-CA"
}
}
@SmallTest
public void testFilterByLanguageFallbackRules() throws Exception {
{
final LocaleList preferredLocales = LocaleList.forLanguageTags("sr-Latn-RS");
final ArrayList<Locale> availableLocales = new ArrayList<>();
availableLocales.add(Locale.forLanguageTag("sr-Cyrl-BA"));
availableLocales.add(Locale.forLanguageTag("sr-Cyrl-CS"));
availableLocales.add(Locale.forLanguageTag("sr-Cyrl-ME"));
availableLocales.add(Locale.forLanguageTag("sr-Cyrl-RS"));
availableLocales.add(Locale.forLanguageTag("sr-Latn-BA"));
availableLocales.add(Locale.forLanguageTag("sr-Latn-CS"));
availableLocales.add(Locale.forLanguageTag("sr-Latn-ME"));
availableLocales.add(Locale.forLanguageTag("sr-Latn-RS"));
final ArrayList<Locale> dest = new ArrayList<>();
LocaleUtils.filterByLanguage(availableLocales, sIdentityMapper, preferredLocales, dest);
assertEquals(1, dest.size());
assertEquals(availableLocales.get(7), dest.get(0)); // "sr-Latn-RS"
}
{
final LocaleList preferredLocales = LocaleList.forLanguageTags("sr-Latn-RS-x-android");
final ArrayList<Locale> availableLocales = new ArrayList<>();
availableLocales.add(Locale.forLanguageTag("sr-Cyrl-BA"));
availableLocales.add(Locale.forLanguageTag("sr-Cyrl-CS"));
availableLocales.add(Locale.forLanguageTag("sr-Cyrl-ME"));
availableLocales.add(Locale.forLanguageTag("sr-Cyrl-RS"));
availableLocales.add(Locale.forLanguageTag("sr-Latn-BA"));
availableLocales.add(Locale.forLanguageTag("sr-Latn-CS"));
availableLocales.add(Locale.forLanguageTag("sr-Latn-ME"));
availableLocales.add(Locale.forLanguageTag("sr-Latn-RS"));
final ArrayList<Locale> dest = new ArrayList<>();
LocaleUtils.filterByLanguage(availableLocales, sIdentityMapper, preferredLocales, dest);
assertEquals(1, dest.size());
assertEquals(availableLocales.get(7), dest.get(0)); // "sr-Latn-RS"
}
{
final LocaleList preferredLocales = LocaleList.forLanguageTags("sr-Latn-RS");
final ArrayList<Locale> availableLocales = new ArrayList<>();
availableLocales.add(Locale.forLanguageTag("sr-Cyrl-BA-x-android"));
availableLocales.add(Locale.forLanguageTag("sr-Cyrl-CS-x-android"));
availableLocales.add(Locale.forLanguageTag("sr-Cyrl-ME-x-android"));
availableLocales.add(Locale.forLanguageTag("sr-Cyrl-RS-x-android"));
availableLocales.add(Locale.forLanguageTag("sr-Latn-BA-x-android"));
availableLocales.add(Locale.forLanguageTag("sr-Latn-CS-x-android"));
availableLocales.add(Locale.forLanguageTag("sr-Latn-ME-x-android"));
availableLocales.add(Locale.forLanguageTag("sr-Latn-RS-x-android"));
final ArrayList<Locale> dest = new ArrayList<>();
LocaleUtils.filterByLanguage(availableLocales, sIdentityMapper, preferredLocales, dest);
assertEquals(1, dest.size());
assertEquals(availableLocales.get(7), dest.get(0)); // "sr-Latn-RS-x-android"
}
{
final LocaleList preferredLocales = LocaleList.forLanguageTags("sr-Latn-RS");
final ArrayList<Locale> availableLocales = new ArrayList<>();
availableLocales.add(Locale.forLanguageTag("sr"));
availableLocales.add(Locale.forLanguageTag("sr-Cyrl"));
availableLocales.add(Locale.forLanguageTag("sr-Latn"));
final ArrayList<Locale> dest = new ArrayList<>();
LocaleUtils.filterByLanguage(availableLocales, sIdentityMapper, preferredLocales, dest);
assertEquals(1, dest.size());
assertEquals(availableLocales.get(2), dest.get(0)); // "sr-Latn"
}
{
final LocaleList preferredLocales = LocaleList.forLanguageTags("sr-RS");
final ArrayList<Locale> availableLocales = new ArrayList<>();
availableLocales.add(Locale.forLanguageTag("sr"));
availableLocales.add(Locale.forLanguageTag("sr-RS"));
availableLocales.add(Locale.forLanguageTag("sr-Latn"));
final ArrayList<Locale> dest = new ArrayList<>();
LocaleUtils.filterByLanguage(availableLocales, sIdentityMapper, preferredLocales, dest);
assertEquals(1, dest.size());
assertEquals(availableLocales.get(0), dest.get(0)); // "sr"
}
{
final LocaleList preferredLocales = LocaleList.forLanguageTags("sr-Latn");
final ArrayList<Locale> availableLocales = new ArrayList<>();
availableLocales.add(Locale.forLanguageTag("sr"));
availableLocales.add(Locale.forLanguageTag("sr-RS"));
availableLocales.add(Locale.forLanguageTag("sr-Latn"));
final ArrayList<Locale> dest = new ArrayList<>();
LocaleUtils.filterByLanguage(availableLocales, sIdentityMapper, preferredLocales, dest);
assertEquals(1, dest.size());
assertEquals(availableLocales.get(2), dest.get(0)); // "sr-Latn"
}
{
final LocaleList preferredLocales = LocaleList.forLanguageTags("sr");
final ArrayList<Locale> availableLocales = new ArrayList<>();
availableLocales.add(Locale.forLanguageTag("sr"));
availableLocales.add(Locale.forLanguageTag("sr-RS"));
availableLocales.add(Locale.forLanguageTag("sr-Latn"));
final ArrayList<Locale> dest = new ArrayList<>();
LocaleUtils.filterByLanguage(availableLocales, sIdentityMapper, preferredLocales, dest);
assertEquals(1, dest.size());
assertEquals(availableLocales.get(0), dest.get(0)); // "sr"
}
{
final LocaleList preferredLocales = LocaleList.forLanguageTags("sr");
final ArrayList<Locale> availableLocales = new ArrayList<>();
availableLocales.add(Locale.forLanguageTag("sr-Latn"));
availableLocales.add(Locale.forLanguageTag("sr-RS"));
availableLocales.add(Locale.forLanguageTag("sr"));
final ArrayList<Locale> dest = new ArrayList<>();
LocaleUtils.filterByLanguage(availableLocales, sIdentityMapper, preferredLocales, dest);
assertEquals(1, dest.size());
assertEquals(availableLocales.get(1), dest.get(0)); // "sr-RS"
}
{
final LocaleList preferredLocales = LocaleList.forLanguageTags("sr");
final ArrayList<Locale> availableLocales = new ArrayList<>();
availableLocales.add(Locale.forLanguageTag("sr-Cyrl-RS"));
availableLocales.add(Locale.forLanguageTag("sr-Latn-RS"));
final ArrayList<Locale> dest = new ArrayList<>();
LocaleUtils.filterByLanguage(availableLocales, sIdentityMapper, preferredLocales, dest);
assertEquals(1, dest.size());
assertEquals(availableLocales.get(0), dest.get(0)); // "sr-Cyrl-RS"
}
{
final LocaleList preferredLocales = LocaleList.forLanguageTags("sr-Latn");
final ArrayList<Locale> availableLocales = new ArrayList<>();
availableLocales.add(Locale.forLanguageTag("sr-Latn-RS"));
availableLocales.add(Locale.forLanguageTag("sr-Cyrl-RS"));
final ArrayList<Locale> dest = new ArrayList<>();
LocaleUtils.filterByLanguage(availableLocales, sIdentityMapper, preferredLocales, dest);
assertEquals(1, dest.size());
assertEquals(availableLocales.get(0), dest.get(0)); // "sr-Latn-RS"
}
}
public void testFilterKnownLimitation() throws Exception {
// Following test cases are not for intentional behavior but checks for preventing the
// behavior from becoming worse.
{
final LocaleList preferredLocales = LocaleList.forLanguageTags("ja-Hrkt");
final ArrayList<Locale> availableLocales = new ArrayList<>();
availableLocales.add(Locale.forLanguageTag("ja-Jpan"));
availableLocales.add(Locale.forLanguageTag("ja-Hrkt"));
final ArrayList<Locale> dest = new ArrayList<>();
LocaleUtils.filterByLanguage(availableLocales, sIdentityMapper, preferredLocales, dest);
assertEquals(1, dest.size());
// Should be ja-Jpan since it supports ja-Hrkt and listed before ja-Hrkt.
assertEquals(availableLocales.get(1), dest.get(0));
}
{
final LocaleList preferredLocales = LocaleList.forLanguageTags("zh-Hani");
final ArrayList<Locale> availableLocales = new ArrayList<>();
availableLocales.add(Locale.forLanguageTag("zh-Hans"));
availableLocales.add(Locale.forLanguageTag("zh-Hant"));
availableLocales.add(Locale.forLanguageTag("zh-Hanb"));
availableLocales.add(Locale.forLanguageTag("zh-Hani"));
final ArrayList<Locale> dest = new ArrayList<>();
LocaleUtils.filterByLanguage(availableLocales, sIdentityMapper, preferredLocales, dest);
assertEquals(1, dest.size());
// Should be zh-Hans since it supports zh-Hani. Also zh-Hant, zh-Hanb supports zh-Hani.
assertEquals(availableLocales.get(3), dest.get(0));
}
}
}