1 /*
2  * Copyright (C) 2018 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.server.textservices;
18 
19 import static org.junit.Assert.assertEquals;
20 import static org.junit.Assert.assertFalse;
21 
22 import androidx.test.filters.SmallTest;
23 import androidx.test.runner.AndroidJUnit4;
24 
25 import org.junit.Test;
26 import org.junit.runner.RunWith;
27 
28 import java.util.ArrayList;
29 import java.util.Locale;
30 
31 @SmallTest
32 @RunWith(AndroidJUnit4.class)
33 public class LocaleUtilsTest {
34     private static final Locale LOCALE_EN = new Locale("en");
35     private static final Locale LOCALE_EN_US = new Locale("en", "US");
36     private static final Locale LOCALE_EN_GB = new Locale("en", "GB");
37     private static final Locale LOCALE_EN_IN = new Locale("en", "IN");
38     private static final Locale LOCALE_FIL = new Locale("fil");
39     private static final Locale LOCALE_FIL_PH = new Locale("fil", "PH");
40     private static final Locale LOCALE_JA = new Locale("ja");
41     private static final Locale LOCALE_JA_JP = new Locale("ja", "JP");
42     private static final Locale LOCALE_TH = new Locale("ht");
43     private static final Locale LOCALE_TH_TH = new Locale("ht", "TH");
44     private static final Locale LOCALE_TH_TH_TH = new Locale("ht", "TH", "TH");
45 
46     @Test
testGetSuitableLocalesForSpellChecker()47     public void testGetSuitableLocalesForSpellChecker() throws Exception {
48         {
49             final ArrayList<Locale> locales =
50                     LocaleUtils.getSuitableLocalesForSpellChecker(LOCALE_EN_US);
51             assertEquals(3, locales.size());
52             assertEquals(LOCALE_EN_US, locales.get(0));
53             assertEquals(LOCALE_EN_GB, locales.get(1));
54             assertEquals(LOCALE_EN, locales.get(2));
55         }
56 
57         {
58             final ArrayList<Locale> locales =
59                     LocaleUtils.getSuitableLocalesForSpellChecker(LOCALE_EN_GB);
60             assertEquals(3, locales.size());
61             assertEquals(LOCALE_EN_GB, locales.get(0));
62             assertEquals(LOCALE_EN_US, locales.get(1));
63             assertEquals(LOCALE_EN, locales.get(2));
64         }
65 
66         {
67             final ArrayList<Locale> locales =
68                     LocaleUtils.getSuitableLocalesForSpellChecker(LOCALE_EN);
69             assertEquals(3, locales.size());
70             assertEquals(LOCALE_EN, locales.get(0));
71             assertEquals(LOCALE_EN_US, locales.get(1));
72             assertEquals(LOCALE_EN_GB, locales.get(2));
73         }
74 
75         {
76             final ArrayList<Locale> locales =
77                     LocaleUtils.getSuitableLocalesForSpellChecker(LOCALE_EN_IN);
78             assertEquals(4, locales.size());
79             assertEquals(LOCALE_EN_IN, locales.get(0));
80             assertEquals(LOCALE_EN_US, locales.get(1));
81             assertEquals(LOCALE_EN_GB, locales.get(2));
82             assertEquals(LOCALE_EN, locales.get(3));
83         }
84 
85         {
86             final ArrayList<Locale> locales =
87                     LocaleUtils.getSuitableLocalesForSpellChecker(LOCALE_JA_JP);
88             assertEquals(5, locales.size());
89             assertEquals(LOCALE_JA_JP, locales.get(0));
90             assertEquals(LOCALE_JA, locales.get(1));
91             assertEquals(LOCALE_EN_US, locales.get(2));
92             assertEquals(LOCALE_EN_GB, locales.get(3));
93             assertEquals(Locale.ENGLISH, locales.get(4));
94         }
95 
96         // Test 3-letter language code.
97         {
98             final ArrayList<Locale> locales =
99                     LocaleUtils.getSuitableLocalesForSpellChecker(LOCALE_FIL_PH);
100             assertEquals(5, locales.size());
101             assertEquals(LOCALE_FIL_PH, locales.get(0));
102             assertEquals(LOCALE_FIL, locales.get(1));
103             assertEquals(LOCALE_EN_US, locales.get(2));
104             assertEquals(LOCALE_EN_GB, locales.get(3));
105             assertEquals(Locale.ENGLISH, locales.get(4));
106         }
107 
108         // Test variant.
109         {
110             final ArrayList<Locale> locales =
111                     LocaleUtils.getSuitableLocalesForSpellChecker(LOCALE_TH_TH_TH);
112             assertEquals(6, locales.size());
113             assertEquals(LOCALE_TH_TH_TH, locales.get(0));
114             assertEquals(LOCALE_TH_TH, locales.get(1));
115             assertEquals(LOCALE_TH, locales.get(2));
116             assertEquals(LOCALE_EN_US, locales.get(3));
117             assertEquals(LOCALE_EN_GB, locales.get(4));
118             assertEquals(Locale.ENGLISH, locales.get(5));
119         }
120 
121         // Test Locale extension.
122         {
123             final Locale localeWithoutVariant = LOCALE_JA_JP;
124             final Locale localeWithVariant = new Locale.Builder()
125                     .setLocale(LOCALE_JA_JP)
126                     .setExtension('x', "android")
127                     .build();
128             assertFalse(localeWithoutVariant.equals(localeWithVariant));
129 
130             final ArrayList<Locale> locales =
131                     LocaleUtils.getSuitableLocalesForSpellChecker(localeWithVariant);
132             assertEquals(5, locales.size());
133             assertEquals(LOCALE_JA_JP, locales.get(0));
134             assertEquals(LOCALE_JA, locales.get(1));
135             assertEquals(LOCALE_EN_US, locales.get(2));
136             assertEquals(LOCALE_EN_GB, locales.get(3));
137             assertEquals(Locale.ENGLISH, locales.get(4));
138         }
139     }
140 }
141