1package io.flutter.plugin.localization;
3import static io.flutter.Build.API_LEVELS;
4import static org.junit.Assert.assertEquals;
5import static org.mockito.Mockito.any;
6import static org.mockito.Mockito.mock;
7import static org.mockito.Mockito.verify;
8import static org.mockito.Mockito.when;
10import android.annotation.TargetApi;
12import android.content.res.Configuration;
13import android.content.res.Resources;
15import androidx.test.core.app.ApplicationProvider;
16import androidx.test.ext.junit.runners.AndroidJUnit4;
17import io.flutter.embedding.engine.FlutterJNI;
18import io.flutter.embedding.engine.dart.DartExecutor;
19import io.flutter.embedding.engine.systemchannels.LocalizationChannel;
20import io.flutter.plugin.common.MethodCall;
21import io.flutter.plugin.common.MethodChannel;
22import java.util.Locale;
23import org.json.JSONException;
24import org.json.JSONObject;
26import org.junit.runner.RunWith;
27import org.robolectric.annotation.Config;
30@RunWith(AndroidJUnit4.class)
31@TargetApi(API_LEVELS.API_24)
33 private final Context ctx = ApplicationProvider.getApplicationContext();
37 @Config(sdk = API_LEVELS.API_26)
38 public
void computePlatformResolvedLocaleAPI26() {
40 FlutterJNI flutterJNI =
new FlutterJNI();
43 Resources resources = mock(Resources.class);
44 Configuration config = mock(Configuration.class);
45 DartExecutor dartExecutor = mock(DartExecutor.class);
46 LocaleList localeList =
47 new LocaleList(
new Locale(
"es",
"MX"),
new Locale(
"zh",
"CN"),
new Locale(
"en",
"US"));
48 when(context.getResources()).thenReturn(resources);
49 when(resources.getConfiguration()).thenReturn(config);
50 when(config.getLocales()).thenReturn(localeList);
52 flutterJNI.setLocalizationPlugin(
56 String[] supportedLocales =
new String[] {};
57 String[]
result = flutterJNI.computePlatformResolvedLocale(supportedLocales);
58 assertEquals(
result.length, 0);
67 localeList =
new LocaleList();
68 when(config.getLocales()).thenReturn(localeList);
69 result = flutterJNI.computePlatformResolvedLocale(supportedLocales);
71 assertEquals(
result.length, 3);
72 assertEquals(
result[0],
"fr");
73 assertEquals(
result[1],
"FR");
74 assertEquals(
result[2],
"");
85 localeList =
new LocaleList(
new Locale(
"fr",
"CH"));
86 when(config.getLocales()).thenReturn(localeList);
87 result = flutterJNI.computePlatformResolvedLocale(supportedLocales);
89 assertEquals(
result.length, 3);
90 assertEquals(
result[0],
"fr");
91 assertEquals(
result[1],
"FR");
92 assertEquals(
result[2],
"");
103 localeList =
new LocaleList(
new Locale(
"fr",
"CH"));
104 when(config.getLocales()).thenReturn(localeList);
105 result = flutterJNI.computePlatformResolvedLocale(supportedLocales);
107 assertEquals(
result.length, 3);
108 assertEquals(
result[0],
"fr");
109 assertEquals(
result[1],
"");
110 assertEquals(
result[2],
"");
120 localeList =
new LocaleList(
new Locale(
"fr",
"CH"),
new Locale(
"it",
"CH"));
121 when(config.getLocales()).thenReturn(localeList);
122 result = flutterJNI.computePlatformResolvedLocale(supportedLocales);
124 assertEquals(
result.length, 3);
125 assertEquals(
result[0],
"it");
126 assertEquals(
result[1],
"IT");
127 assertEquals(
result[2],
"");
134 localeList =
new LocaleList(
new Locale(
"zh",
"CN"));
135 when(config.getLocales()).thenReturn(localeList);
136 result = flutterJNI.computePlatformResolvedLocale(supportedLocales);
137 assertEquals(
result.length, 3);
138 assertEquals(
result[0],
"zh");
139 assertEquals(
result[1],
"CN");
140 assertEquals(
result[2],
"Hans");
145 @Config(minSdk = API_LEVELS.API_24)
146 public
void computePlatformResolvedLocale_fromAndroidN() {
148 FlutterJNI flutterJNI =
new FlutterJNI();
151 Resources resources = mock(Resources.class);
152 Configuration config = mock(Configuration.class);
153 DartExecutor dartExecutor = mock(DartExecutor.class);
154 LocaleList localeList =
155 new LocaleList(
new Locale(
"es",
"MX"),
new Locale(
"zh",
"CN"),
new Locale(
"en",
"US"));
156 when(context.getResources()).thenReturn(resources);
157 when(resources.getConfiguration()).thenReturn(config);
158 when(config.getLocales()).thenReturn(localeList);
160 flutterJNI.setLocalizationPlugin(
164 String[] supportedLocales =
new String[] {};
165 String[]
result = flutterJNI.computePlatformResolvedLocale(supportedLocales);
166 assertEquals(
result.length, 0);
175 localeList =
new LocaleList();
176 when(config.getLocales()).thenReturn(localeList);
177 result = flutterJNI.computePlatformResolvedLocale(supportedLocales);
179 assertEquals(
result.length, 3);
180 assertEquals(
result[0],
"fr");
181 assertEquals(
result[1],
"FR");
182 assertEquals(
result[2],
"");
193 localeList =
new LocaleList(
new Locale(
"fr",
"CH"));
194 when(config.getLocales()).thenReturn(localeList);
195 result = flutterJNI.computePlatformResolvedLocale(supportedLocales);
197 assertEquals(
result.length, 3);
198 assertEquals(
result[0],
"fr");
199 assertEquals(
result[1],
"FR");
200 assertEquals(
result[2],
"");
211 localeList =
new LocaleList(
new Locale(
"fr",
"CH"));
212 when(config.getLocales()).thenReturn(localeList);
213 result = flutterJNI.computePlatformResolvedLocale(supportedLocales);
215 assertEquals(
result.length, 3);
216 assertEquals(
result[0],
"fr");
217 assertEquals(
result[1],
"");
218 assertEquals(
result[2],
"");
228 localeList =
new LocaleList(
new Locale(
"fr",
"CH"),
new Locale(
"it",
"CH"));
229 when(config.getLocales()).thenReturn(localeList);
230 result = flutterJNI.computePlatformResolvedLocale(supportedLocales);
232 assertEquals(
result.length, 3);
233 assertEquals(
result[0],
"it");
234 assertEquals(
result[1],
"IT");
235 assertEquals(
result[2],
"");
240 @Config(minSdk = API_LEVELS.API_21, maxSdk = API_LEVELS.API_23, qualifiers =
"es-rMX")
241 public
void computePlatformResolvedLocale_emptySupportedLocales_beforeAndroidN() {
242 FlutterJNI flutterJNI =
new FlutterJNI();
243 DartExecutor dartExecutor = mock(DartExecutor.class);
244 flutterJNI.setLocalizationPlugin(
246 String[] supportedLocales =
new String[] {};
247 String[]
result = flutterJNI.computePlatformResolvedLocale(supportedLocales);
248 assertEquals(
result.length, 0);
252 @Config(minSdk = API_LEVELS.API_21, maxSdk = API_LEVELS.API_23, qualifiers =
"")
253 public
void computePlatformResolvedLocale_selectFirstLocaleWhenNoUserSetting_beforeAndroidN() {
254 FlutterJNI flutterJNI =
new FlutterJNI();
255 DartExecutor dartExecutor = mock(DartExecutor.class);
256 flutterJNI.setLocalizationPlugin(
258 String[] supportedLocales =
264 String[]
result = flutterJNI.computePlatformResolvedLocale(supportedLocales);
265 assertEquals(
result.length, 3);
266 assertEquals(
result[0],
"fr");
267 assertEquals(
result[1],
"FR");
268 assertEquals(
result[2],
"");
272 @Config(minSdk = API_LEVELS.API_21, maxSdk = API_LEVELS.API_23, qualifiers =
"fr-rCH")
273 public
void computePlatformResolvedLocale_selectFirstLocaleWhenNoExactMatch_beforeAndroidN() {
274 FlutterJNI flutterJNI =
new FlutterJNI();
275 DartExecutor dartExecutor = mock(DartExecutor.class);
276 flutterJNI.setLocalizationPlugin(
279 String[] supportedLocales =
287 String[]
result = flutterJNI.computePlatformResolvedLocale(supportedLocales);
288 assertEquals(
result.length, 3);
289 assertEquals(
result[0],
"en");
290 assertEquals(
result[1],
"");
291 assertEquals(
result[2],
"");
295 @Config(minSdk = API_LEVELS.API_21, maxSdk = API_LEVELS.API_23, qualifiers =
"it-rIT")
296 public
void computePlatformResolvedLocale_selectExactMatchLocale_beforeAndroidN() {
297 FlutterJNI flutterJNI =
new FlutterJNI();
298 DartExecutor dartExecutor = mock(DartExecutor.class);
299 flutterJNI.setLocalizationPlugin(
302 String[] supportedLocales =
310 String[]
result = flutterJNI.computePlatformResolvedLocale(supportedLocales);
311 assertEquals(
result.length, 3);
312 assertEquals(
result[0],
"it");
313 assertEquals(
result[1],
"IT");
314 assertEquals(
result[2],
"");
318 @Config(minSdk = API_LEVELS.API_21, maxSdk = API_LEVELS.API_23, qualifiers =
"fr-rCH")
319 public
void computePlatformResolvedLocale_selectOnlyLanguageLocale_beforeAndroidN() {
320 FlutterJNI flutterJNI =
new FlutterJNI();
321 DartExecutor dartExecutor = mock(DartExecutor.class);
322 flutterJNI.setLocalizationPlugin(
325 String[] supportedLocales =
334 String[]
result = flutterJNI.computePlatformResolvedLocale(supportedLocales);
335 assertEquals(
result.length, 3);
336 assertEquals(
result[0],
"fr");
337 assertEquals(
result[1],
"");
338 assertEquals(
result[2],
"");
344 assertEquals(locale,
new Locale(
"en"));
350 assertEquals(locale,
new Locale(
"en",
"US"));
356 assertEquals(locale,
new Locale(
"zh",
"CN",
"Hans"));
362 assertEquals(locale,
new Locale(
"zh",
"CN",
"Hans"));
368 assertEquals(locale,
new Locale(
"de",
"DE"));
374 Resources resources = mock(Resources.class);
375 DartExecutor dartExecutor = mock(DartExecutor.class);
376 LocalizationChannel localizationChannel =
new LocalizationChannel(dartExecutor);
379 MethodChannel.Result mockResult = mock(MethodChannel.Result.class);
381 String fakePackageName =
"package_name";
382 String fakeKey =
"test_key";
385 when(context.getPackageName()).thenReturn(fakePackageName);
386 when(context.getResources()).thenReturn(resources);
387 when(resources.getIdentifier(fakeKey,
"string", fakePackageName)).thenReturn(fakeId);
388 when(resources.getString(fakeId)).thenReturn(
"test_value");
390 JSONObject param =
new JSONObject();
391 param.put(
"key", fakeKey);
393 localizationChannel.handler.onMethodCall(
394 new MethodCall(
"Localization.getStringResource", param), mockResult);
396 verify(mockResult).success(
"test_value");
403 Resources resources = mock(Resources.class);
404 Resources localResources = mock(Resources.class);
405 Configuration configuration =
new Configuration();
406 DartExecutor dartExecutor = mock(DartExecutor.class);
407 LocalizationChannel localizationChannel =
new LocalizationChannel(dartExecutor);
410 MethodChannel.Result mockResult = mock(MethodChannel.Result.class);
412 String fakePackageName =
"package_name";
413 String fakeKey =
"test_key";
416 when(context.getPackageName()).thenReturn(fakePackageName);
417 when(context.createConfigurationContext(any())).thenReturn(localContext);
418 when(context.getResources()).thenReturn(resources);
419 when(localContext.getResources()).thenReturn(localResources);
420 when(resources.getConfiguration()).thenReturn(configuration);
421 when(localResources.getIdentifier(fakeKey,
"string", fakePackageName)).thenReturn(fakeId);
422 when(localResources.getString(fakeId)).thenReturn(
"test_value");
424 JSONObject param =
new JSONObject();
425 param.put(
"key", fakeKey);
426 param.put(
"locale",
"en-US");
428 localizationChannel.handler.onMethodCall(
429 new MethodCall(
"Localization.getStringResource", param), mockResult);
431 verify(mockResult).success(
"test_value");
437 Resources resources = mock(Resources.class);
438 DartExecutor dartExecutor = mock(DartExecutor.class);
439 LocalizationChannel localizationChannel =
new LocalizationChannel(dartExecutor);
442 MethodChannel.Result mockResult = mock(MethodChannel.Result.class);
444 String fakePackageName =
"package_name";
445 String fakeKey =
"test_key";
447 when(context.getPackageName()).thenReturn(fakePackageName);
448 when(context.getResources()).thenReturn(resources);
449 when(resources.getIdentifier(fakeKey,
"string", fakePackageName))
452 JSONObject param =
new JSONObject();
453 param.put(
"key", fakeKey);
455 localizationChannel.handler.onMethodCall(
456 new MethodCall(
"Localization.getStringResource", param), mockResult);
458 verify(mockResult).success(
null);
void getStringResource_nonExistentKey()
void getStringResource_withoutLocale()
void localeFromString_languageOnly()
void localeFromString_underscore()
void getStringResource_withLocale()
void localeFromString_additionalVariantsAreIgnored()
void localeFromString_languageCountryAndVariant()
void localeFromString_languageAndCountry()
static Locale localeFromString(@NonNull String localeString)