1102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa/*
2102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa * Copyright (C) 2016 The Android Open Source Project
3102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa *
4102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa * Licensed under the Apache License, Version 2.0 (the "License");
5102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa * you may not use this file except in compliance with the License.
6102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa * You may obtain a copy of the License at
7102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa *
8102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa *      http://www.apache.org/licenses/LICENSE-2.0
9102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa *
10102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa * Unless required by applicable law or agreed to in writing, software
11102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa * distributed under the License is distributed on an "AS IS" BASIS,
12102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa * See the License for the specific language governing permissions and
14102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa * limitations under the License.
15102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa */
16102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa
17102ff0726dad764df741e41766d78fcfb829184aYohei Yukawapackage com.android.internal.inputmethod;
18102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa
1923cbe85610f780134cc77dd4a54732a22ed6e86eYohei Yukawaimport android.os.LocaleList;
20102ff0726dad764df741e41766d78fcfb829184aYohei Yukawaimport android.test.InstrumentationTestCase;
21102ff0726dad764df741e41766d78fcfb829184aYohei Yukawaimport android.test.suitebuilder.annotation.SmallTest;
22102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa
23102ff0726dad764df741e41766d78fcfb829184aYohei Yukawaimport java.util.ArrayList;
24102ff0726dad764df741e41766d78fcfb829184aYohei Yukawaimport java.util.Locale;
25102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa
26102ff0726dad764df741e41766d78fcfb829184aYohei Yukawapublic class LocaleUtilsTest extends InstrumentationTestCase {
27102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa
28102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa    private static final LocaleUtils.LocaleExtractor<Locale> sIdentityMapper =
29102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            new LocaleUtils.LocaleExtractor<Locale>() {
30102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa                @Override
31102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa                public Locale get(Locale source) {
32102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa                    return source;
33102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa                }
34102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            };
35102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa
36102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa    @SmallTest
37102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa    public void testFilterByLanguageEmptyLanguageList() throws Exception {
38102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa        final ArrayList<Locale> availableLocales = new ArrayList<>();
39102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa        availableLocales.add(Locale.forLanguageTag("en-US"));
40102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa        availableLocales.add(Locale.forLanguageTag("fr-CA"));
41102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa        availableLocales.add(Locale.forLanguageTag("in"));
42102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa        availableLocales.add(Locale.forLanguageTag("ja"));
43102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa        availableLocales.add(Locale.forLanguageTag("fil"));
44102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa
45102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa        final LocaleList preferredLocales = LocaleList.getEmptyLocaleList();
46102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa
47102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa        final ArrayList<Locale> dest = new ArrayList<>();
48102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa        LocaleUtils.filterByLanguage(availableLocales, sIdentityMapper, preferredLocales, dest);
49102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa        assertEquals(0, dest.size());
50102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa    }
51102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa
52102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa    @SmallTest
53072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka    public void testFilterDoesNotMatchAnything() throws Exception {
54072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka        final ArrayList<Locale> availableLocales = new ArrayList<>();
55072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka        availableLocales.add(Locale.forLanguageTag("en-US"));
56072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka        availableLocales.add(Locale.forLanguageTag("fr-CA"));
57072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka        availableLocales.add(Locale.forLanguageTag("in"));
58072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka        availableLocales.add(Locale.forLanguageTag("ja"));
59072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka        availableLocales.add(Locale.forLanguageTag("fil"));
60072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka
61072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka        final LocaleList preferredLocales = LocaleList.forLanguageTags("zh-Hans-TW");
62072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka
63072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka        final ArrayList<Locale> dest = new ArrayList<>();
64072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka        LocaleUtils.filterByLanguage(availableLocales, sIdentityMapper, preferredLocales, dest);
65072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka        assertEquals(0, dest.size());
66072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka    }
67072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka
68072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka    @SmallTest
69102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa    public void testFilterByLanguageEmptySource() throws Exception {
70102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa        final ArrayList<Locale> availableLocales = new ArrayList<>();
71102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa
72102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa        final LocaleList preferredLocales = LocaleList.forLanguageTags("fr,en-US,ja-JP");
73102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa
74102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa        final ArrayList<Locale> dest = new ArrayList<>();
75102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa        LocaleUtils.filterByLanguage(availableLocales, sIdentityMapper, preferredLocales, dest);
76102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa        assertEquals(0, dest.size());
77102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa    }
78102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa
79102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa    @SmallTest
80102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa    public void testFilterByLanguageNullAvailableLocales() throws Exception {
81102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa        {
82102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            final LocaleList preferredLocales =
83102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa                    LocaleList.forLanguageTags("en-AU,en-GB,en-US,en,en-IN");
84102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            final ArrayList<Locale> availableLocales = new ArrayList<>();
85102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            availableLocales.add(null);
86102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            final ArrayList<Locale> dest = new ArrayList<>();
87102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            LocaleUtils.filterByLanguage(availableLocales, sIdentityMapper, preferredLocales, dest);
88102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            assertEquals(0, dest.size());
89102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa        }
90102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa        {
91102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            final LocaleList preferredLocales =
92102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa                    LocaleList.forLanguageTags("en-AU,en-GB,en-US,en,en-IN");
93102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            final ArrayList<Locale> availableLocales = new ArrayList<>();
94102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            availableLocales.add(null);
95102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            availableLocales.add(null);
96102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            availableLocales.add(null);
97102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            final ArrayList<Locale> dest = new ArrayList<>();
98102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            LocaleUtils.filterByLanguage(availableLocales, sIdentityMapper, preferredLocales, dest);
99102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            assertEquals(0, dest.size());
100102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa        }
101102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa        {
102102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            final LocaleList preferredLocales =
103102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa                    LocaleList.forLanguageTags("en-AU,en-GB,en-US,en,en-IN");
104102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            final ArrayList<Locale> availableLocales = new ArrayList<>();
105102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            availableLocales.add(null);
106102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            availableLocales.add(Locale.forLanguageTag("en-US"));
107102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            availableLocales.add(null);
108102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            availableLocales.add(null);
109102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            final ArrayList<Locale> dest = new ArrayList<>();
110102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            LocaleUtils.filterByLanguage(availableLocales, sIdentityMapper, preferredLocales, dest);
111102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            assertEquals(1, dest.size());
112102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            assertEquals(availableLocales.get(1), dest.get(0));  // "en-US"
113102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa        }
114102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa        {
115102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            final LocaleList preferredLocales =
116102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa                    LocaleList.forLanguageTags("en-AU,en-GB,en-US,en,en-IN");
117102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            final ArrayList<Locale> availableLocales = new ArrayList<>();
118102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            availableLocales.add(null);
119102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            availableLocales.add(Locale.forLanguageTag("en"));
120102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            availableLocales.add(null);
121102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            availableLocales.add(null);
122102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            final ArrayList<Locale> dest = new ArrayList<>();
123102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            LocaleUtils.filterByLanguage(availableLocales, sIdentityMapper, preferredLocales, dest);
124102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            assertEquals(1, dest.size());
125102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            assertEquals(availableLocales.get(1), dest.get(0));  // "en"
126102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa        }
127102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa        {
128102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            final LocaleList preferredLocales =
129102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa                    LocaleList.forLanguageTags("en-AU,en-GB,en-US,en,en-IN");
130102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            final ArrayList<Locale> availableLocales = new ArrayList<>();
131102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            availableLocales.add(null);
132102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            availableLocales.add(Locale.forLanguageTag("ja-JP"));
133102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            availableLocales.add(null);
134102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            availableLocales.add(null);
135102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            final ArrayList<Locale> dest = new ArrayList<>();
136102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            LocaleUtils.filterByLanguage(availableLocales, sIdentityMapper, preferredLocales, dest);
137102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            assertEquals(0, dest.size());
138102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa        }
139102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa    }
140102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa
141102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa    @SmallTest
142102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa    public void testFilterByLanguage() throws Exception {
143072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka        {
144072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            final ArrayList<Locale> availableLocales = new ArrayList<>();
145072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            availableLocales.add(Locale.forLanguageTag("en-US"));
146072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            availableLocales.add(Locale.forLanguageTag("fr-CA"));
147072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            availableLocales.add(Locale.forLanguageTag("in"));
148072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            availableLocales.add(Locale.forLanguageTag("ja"));
149072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            availableLocales.add(Locale.forLanguageTag("fil"));
150102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa
151072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            final LocaleList preferredLocales = LocaleList.forLanguageTags("fr,en-US,ja-JP");
152102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa
153072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            final ArrayList<Locale> dest = new ArrayList<>();
154072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            LocaleUtils.filterByLanguage(availableLocales, sIdentityMapper, preferredLocales, dest);
155072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            assertEquals(3, dest.size());
156072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            assertEquals(availableLocales.get(1), dest.get(0));  // "fr-CA"
157072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            assertEquals(availableLocales.get(0), dest.get(1));  // "en-US"
158072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            assertEquals(availableLocales.get(3), dest.get(2));  // "ja"
159072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka        }
160072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka        {
161072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            final ArrayList<Locale> availableLocales = new ArrayList<>();
162072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            availableLocales.add(Locale.forLanguageTag("en-US"));
163072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            availableLocales.add(Locale.forLanguageTag("en-GB"));
164072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            availableLocales.add(Locale.forLanguageTag("en-IN"));
165072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka
166072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            final LocaleList preferredLocales = LocaleList.forLanguageTags("en-US");
167072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka
168072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            final ArrayList<Locale> dest = new ArrayList<>();
169072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            LocaleUtils.filterByLanguage(availableLocales, sIdentityMapper, preferredLocales, dest);
170072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            assertEquals(1, dest.size());
171072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            assertEquals(availableLocales.get(0), dest.get(0));  // "en-US"
172072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka        }
173102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa    }
174102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa
175102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa    @SmallTest
176102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa    public void testFilterByLanguageTheSameLanguage() throws Exception {
177102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa        {
178102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            final LocaleList preferredLocales =
179102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa                    LocaleList.forLanguageTags("en-AU,en-GB,en-US,en,en-IN");
180102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            final ArrayList<Locale> availableLocales = new ArrayList<>();
181102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            availableLocales.add(Locale.forLanguageTag("fr-CA"));
182102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            availableLocales.add(Locale.forLanguageTag("en-US"));
183102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            final ArrayList<Locale> dest = new ArrayList<>();
184102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            LocaleUtils.filterByLanguage(availableLocales, sIdentityMapper, preferredLocales, dest);
185102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            assertEquals(1, dest.size());
186102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            assertEquals(availableLocales.get(1), dest.get(0));  // "en-US"
187102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa        }
188102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa        {
189102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            final LocaleList preferredLocales =
190102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa                    LocaleList.forLanguageTags("en-AU,en-GB,en-US,en,en-IN");
191102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            final ArrayList<Locale> availableLocales = new ArrayList<>();
192102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            availableLocales.add(Locale.forLanguageTag("fr-CA"));
193102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            availableLocales.add(Locale.forLanguageTag("en"));
194102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            final ArrayList<Locale> dest = new ArrayList<>();
195102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            LocaleUtils.filterByLanguage(availableLocales, sIdentityMapper, preferredLocales, dest);
196102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            assertEquals(1, dest.size());
197102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            assertEquals(availableLocales.get(1), dest.get(0));  // "en"
198102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa        }
199102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa        {
200102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            final LocaleList preferredLocales =
201102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa                    LocaleList.forLanguageTags("en-AU,en-GB,en-US,en,en-IN");
202102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            final ArrayList<Locale> availableLocales = new ArrayList<>();
203102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            availableLocales.add(Locale.forLanguageTag("fr-CA"));
204102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            availableLocales.add(Locale.forLanguageTag("en-CA"));
205102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            availableLocales.add(Locale.forLanguageTag("en-IN"));
206102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            final ArrayList<Locale> dest = new ArrayList<>();
207102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            LocaleUtils.filterByLanguage(availableLocales, sIdentityMapper, preferredLocales, dest);
208102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            assertEquals(1, dest.size());
209102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            assertEquals(availableLocales.get(2), dest.get(0));  // "en-IN"
210102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa        }
211102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa        {
212102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            final LocaleList preferredLocales =
213102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa                    LocaleList.forLanguageTags("en-AU,en-GB,en-US,en-IN");
214102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            final ArrayList<Locale> availableLocales = new ArrayList<>();
215102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            availableLocales.add(Locale.forLanguageTag("fr-CA"));
216102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            availableLocales.add(Locale.forLanguageTag("en-CA"));
217102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            availableLocales.add(Locale.forLanguageTag("en-NZ"));
218102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            availableLocales.add(Locale.forLanguageTag("en-BZ"));
219102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            final ArrayList<Locale> dest = new ArrayList<>();
220102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            LocaleUtils.filterByLanguage(availableLocales, sIdentityMapper, preferredLocales, dest);
221102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            assertEquals(1, dest.size());
222102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa            assertEquals(availableLocales.get(1), dest.get(0));  // "en-CA"
223102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa        }
224102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa    }
225072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka
226072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka    @SmallTest
227072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka    public void testFilterByLanguageFallbackRules() throws Exception {
228072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka        {
229072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            final LocaleList preferredLocales = LocaleList.forLanguageTags("sr-Latn-RS");
230072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            final ArrayList<Locale> availableLocales = new ArrayList<>();
231072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            availableLocales.add(Locale.forLanguageTag("sr-Cyrl-BA"));
232072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            availableLocales.add(Locale.forLanguageTag("sr-Cyrl-CS"));
233072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            availableLocales.add(Locale.forLanguageTag("sr-Cyrl-ME"));
234072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            availableLocales.add(Locale.forLanguageTag("sr-Cyrl-RS"));
235072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            availableLocales.add(Locale.forLanguageTag("sr-Latn-BA"));
236072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            availableLocales.add(Locale.forLanguageTag("sr-Latn-CS"));
237072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            availableLocales.add(Locale.forLanguageTag("sr-Latn-ME"));
238072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            availableLocales.add(Locale.forLanguageTag("sr-Latn-RS"));
239072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            final ArrayList<Locale> dest = new ArrayList<>();
240072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            LocaleUtils.filterByLanguage(availableLocales, sIdentityMapper, preferredLocales, dest);
241072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            assertEquals(1, dest.size());
242072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            assertEquals(availableLocales.get(7), dest.get(0));  // "sr-Latn-RS"
243072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka        }
244072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka        {
245072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            final LocaleList preferredLocales = LocaleList.forLanguageTags("sr-Latn-RS-x-android");
246072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            final ArrayList<Locale> availableLocales = new ArrayList<>();
247072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            availableLocales.add(Locale.forLanguageTag("sr-Cyrl-BA"));
248072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            availableLocales.add(Locale.forLanguageTag("sr-Cyrl-CS"));
249072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            availableLocales.add(Locale.forLanguageTag("sr-Cyrl-ME"));
250072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            availableLocales.add(Locale.forLanguageTag("sr-Cyrl-RS"));
251072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            availableLocales.add(Locale.forLanguageTag("sr-Latn-BA"));
252072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            availableLocales.add(Locale.forLanguageTag("sr-Latn-CS"));
253072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            availableLocales.add(Locale.forLanguageTag("sr-Latn-ME"));
254072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            availableLocales.add(Locale.forLanguageTag("sr-Latn-RS"));
255072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            final ArrayList<Locale> dest = new ArrayList<>();
256072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            LocaleUtils.filterByLanguage(availableLocales, sIdentityMapper, preferredLocales, dest);
257072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            assertEquals(1, dest.size());
258072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            assertEquals(availableLocales.get(7), dest.get(0));  // "sr-Latn-RS"
259072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka        }
260072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka        {
261072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            final LocaleList preferredLocales = LocaleList.forLanguageTags("sr-Latn-RS");
262072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            final ArrayList<Locale> availableLocales = new ArrayList<>();
263072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            availableLocales.add(Locale.forLanguageTag("sr-Cyrl-BA-x-android"));
264072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            availableLocales.add(Locale.forLanguageTag("sr-Cyrl-CS-x-android"));
265072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            availableLocales.add(Locale.forLanguageTag("sr-Cyrl-ME-x-android"));
266072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            availableLocales.add(Locale.forLanguageTag("sr-Cyrl-RS-x-android"));
267072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            availableLocales.add(Locale.forLanguageTag("sr-Latn-BA-x-android"));
268072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            availableLocales.add(Locale.forLanguageTag("sr-Latn-CS-x-android"));
269072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            availableLocales.add(Locale.forLanguageTag("sr-Latn-ME-x-android"));
270072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            availableLocales.add(Locale.forLanguageTag("sr-Latn-RS-x-android"));
271072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            final ArrayList<Locale> dest = new ArrayList<>();
272072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            LocaleUtils.filterByLanguage(availableLocales, sIdentityMapper, preferredLocales, dest);
273072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            assertEquals(1, dest.size());
274072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            assertEquals(availableLocales.get(7), dest.get(0));  // "sr-Latn-RS-x-android"
275072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka        }
276072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka
277072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka        {
278072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            final LocaleList preferredLocales = LocaleList.forLanguageTags("sr-Latn-RS");
279072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            final ArrayList<Locale> availableLocales = new ArrayList<>();
280072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            availableLocales.add(Locale.forLanguageTag("sr"));
281072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            availableLocales.add(Locale.forLanguageTag("sr-Cyrl"));
282072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            availableLocales.add(Locale.forLanguageTag("sr-Latn"));
283072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            final ArrayList<Locale> dest = new ArrayList<>();
284072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            LocaleUtils.filterByLanguage(availableLocales, sIdentityMapper, preferredLocales, dest);
285072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            assertEquals(1, dest.size());
286072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            assertEquals(availableLocales.get(2), dest.get(0));  // "sr-Latn"
287072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka        }
288072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka
289072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka        {
290072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            final LocaleList preferredLocales = LocaleList.forLanguageTags("sr-RS");
291072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            final ArrayList<Locale> availableLocales = new ArrayList<>();
292072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            availableLocales.add(Locale.forLanguageTag("sr"));
293072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            availableLocales.add(Locale.forLanguageTag("sr-RS"));
294072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            availableLocales.add(Locale.forLanguageTag("sr-Latn"));
295072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            final ArrayList<Locale> dest = new ArrayList<>();
296072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            LocaleUtils.filterByLanguage(availableLocales, sIdentityMapper, preferredLocales, dest);
297072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            assertEquals(1, dest.size());
298072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            assertEquals(availableLocales.get(0), dest.get(0));  // "sr"
299072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka        }
300072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka
301072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka        {
302072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            final LocaleList preferredLocales = LocaleList.forLanguageTags("sr-Latn");
303072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            final ArrayList<Locale> availableLocales = new ArrayList<>();
304072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            availableLocales.add(Locale.forLanguageTag("sr"));
305072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            availableLocales.add(Locale.forLanguageTag("sr-RS"));
306072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            availableLocales.add(Locale.forLanguageTag("sr-Latn"));
307072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            final ArrayList<Locale> dest = new ArrayList<>();
308072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            LocaleUtils.filterByLanguage(availableLocales, sIdentityMapper, preferredLocales, dest);
309072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            assertEquals(1, dest.size());
310072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            assertEquals(availableLocales.get(2), dest.get(0));  // "sr-Latn"
311072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka        }
312072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka
313072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka        {
314072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            final LocaleList preferredLocales = LocaleList.forLanguageTags("sr");
315072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            final ArrayList<Locale> availableLocales = new ArrayList<>();
316072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            availableLocales.add(Locale.forLanguageTag("sr"));
317072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            availableLocales.add(Locale.forLanguageTag("sr-RS"));
318072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            availableLocales.add(Locale.forLanguageTag("sr-Latn"));
319072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            final ArrayList<Locale> dest = new ArrayList<>();
320072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            LocaleUtils.filterByLanguage(availableLocales, sIdentityMapper, preferredLocales, dest);
321072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            assertEquals(1, dest.size());
322072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            assertEquals(availableLocales.get(0), dest.get(0));  // "sr"
323072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka        }
324072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka        {
325072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            final LocaleList preferredLocales = LocaleList.forLanguageTags("sr");
326072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            final ArrayList<Locale> availableLocales = new ArrayList<>();
327072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            availableLocales.add(Locale.forLanguageTag("sr-Latn"));
328072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            availableLocales.add(Locale.forLanguageTag("sr-RS"));
329072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            availableLocales.add(Locale.forLanguageTag("sr"));
330072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            final ArrayList<Locale> dest = new ArrayList<>();
331072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            LocaleUtils.filterByLanguage(availableLocales, sIdentityMapper, preferredLocales, dest);
332072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            assertEquals(1, dest.size());
333072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            assertEquals(availableLocales.get(1), dest.get(0));  // "sr-RS"
334072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka        }
335072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka
336072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka        {
337072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            final LocaleList preferredLocales = LocaleList.forLanguageTags("sr");
338072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            final ArrayList<Locale> availableLocales = new ArrayList<>();
339072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            availableLocales.add(Locale.forLanguageTag("sr-Cyrl-RS"));
340072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            availableLocales.add(Locale.forLanguageTag("sr-Latn-RS"));
341072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            final ArrayList<Locale> dest = new ArrayList<>();
342072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            LocaleUtils.filterByLanguage(availableLocales, sIdentityMapper, preferredLocales, dest);
343072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            assertEquals(1, dest.size());
344072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            assertEquals(availableLocales.get(0), dest.get(0));  // "sr-Cyrl-RS"
345072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka        }
346072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka        {
347072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            final LocaleList preferredLocales = LocaleList.forLanguageTags("sr-Latn");
348072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            final ArrayList<Locale> availableLocales = new ArrayList<>();
349072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            availableLocales.add(Locale.forLanguageTag("sr-Latn-RS"));
350072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            availableLocales.add(Locale.forLanguageTag("sr-Cyrl-RS"));
351072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            final ArrayList<Locale> dest = new ArrayList<>();
352072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            LocaleUtils.filterByLanguage(availableLocales, sIdentityMapper, preferredLocales, dest);
353072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            assertEquals(1, dest.size());
354072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            assertEquals(availableLocales.get(0), dest.get(0));  // "sr-Latn-RS"
355072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka        }
356072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka    }
357072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka
358072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka    public void testFilterKnownLimitation() throws Exception {
359072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka        // Following test cases are not for intentional behavior but checks for preventing the
360072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka        // behavior from becoming worse.
361072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka        {
362072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            final LocaleList preferredLocales = LocaleList.forLanguageTags("ja-Hrkt");
363072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            final ArrayList<Locale> availableLocales = new ArrayList<>();
364072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            availableLocales.add(Locale.forLanguageTag("ja-Jpan"));
365072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            availableLocales.add(Locale.forLanguageTag("ja-Hrkt"));
366072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            final ArrayList<Locale> dest = new ArrayList<>();
367072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            LocaleUtils.filterByLanguage(availableLocales, sIdentityMapper, preferredLocales, dest);
368072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            assertEquals(1, dest.size());
369072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            // Should be ja-Jpan since it supports ja-Hrkt and listed before ja-Hrkt.
370072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            assertEquals(availableLocales.get(1), dest.get(0));
371072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka        }
372072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka        {
373072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            final LocaleList preferredLocales = LocaleList.forLanguageTags("zh-Hani");
374072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            final ArrayList<Locale> availableLocales = new ArrayList<>();
375072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            availableLocales.add(Locale.forLanguageTag("zh-Hans"));
376072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            availableLocales.add(Locale.forLanguageTag("zh-Hant"));
377072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            availableLocales.add(Locale.forLanguageTag("zh-Hanb"));
378072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            availableLocales.add(Locale.forLanguageTag("zh-Hani"));
379072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            final ArrayList<Locale> dest = new ArrayList<>();
380072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            LocaleUtils.filterByLanguage(availableLocales, sIdentityMapper, preferredLocales, dest);
381072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            assertEquals(1, dest.size());
382072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            // Should be zh-Hans since it supports zh-Hani. Also zh-Hant, zh-Hanb supports zh-Hani.
383072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka            assertEquals(availableLocales.get(3), dest.get(0));
384072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka        }
385072a95a3094af2ced4f009ad62c4553c28e3f830Seigo Nonaka    }
386102ff0726dad764df741e41766d78fcfb829184aYohei Yukawa}
387