• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2020 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.android.internal.app
18 
19 import android.os.SystemProperties
20 import androidx.test.ext.junit.runners.AndroidJUnit4
21 import androidx.test.platform.app.InstrumentationRegistry
22 import com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn
23 import com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession
24 import com.android.internal.R
25 import com.android.internal.app.LocalePicker
26 import com.google.common.truth.Truth.assertThat
27 import org.junit.Before
28 import org.junit.After
29 import org.junit.Test
30 import org.junit.runner.RunWith
31 import org.mockito.ArgumentMatchers.eq
32 import org.mockito.MockitoSession
33 
34 @RunWith(AndroidJUnit4::class)
35 class LocalizationTest {
36     private val mContext = InstrumentationRegistry.getInstrumentation().context
37     private val mUnfilteredLocales =
38             mContext.getResources().getStringArray(R.array.supported_locales)
39 
40     private lateinit var mMockitoSession: MockitoSession
41 
42     @Before
setUpnull43     fun setUp() {
44         mMockitoSession = mockitoSession()
45                 .initMocks(this)
46                 .spyStatic(SystemProperties::class.java)
47                 .startMocking()
48     }
49 
50     @After
tearDownnull51     fun tearDown() {
52         mMockitoSession.finishMocking()
53     }
54 
55     @Test
testGetSupportedLocales_noFilternull56     fun testGetSupportedLocales_noFilter() {
57         // Filter not set.
58         setTestLocaleFilter(null)
59 
60         val locales1 = LocalePicker.getSupportedLocales(mContext)
61 
62         assertThat(locales1).isEqualTo(mUnfilteredLocales)
63 
64         // Empty filter.
65         setTestLocaleFilter("")
66 
67         val locales2 = LocalePicker.getSupportedLocales(mContext)
68 
69         assertThat(locales2).isEqualTo(mUnfilteredLocales)
70     }
71 
72     @Test
testGetSupportedLocales_invalidFilternull73     fun testGetSupportedLocales_invalidFilter() {
74         setTestLocaleFilter("**")
75 
76         val locales = LocalePicker.getSupportedLocales(mContext)
77 
78         assertThat(locales).isEqualTo(mUnfilteredLocales)
79     }
80 
81     @Test
testGetSupportedLocales_inclusiveFilternull82     fun testGetSupportedLocales_inclusiveFilter() {
83         setTestLocaleFilter("^(de-AT|de-DE|en|ru).*")
84 
85         val locales = LocalePicker.getSupportedLocales(mContext)
86 
87         assertThat(locales).isEqualTo(
88                 mUnfilteredLocales
89                         .filter { it.startsWithAnyOf("de-AT", "de-DE", "en", "ru") }
90                         .toTypedArray()
91         )
92     }
93 
94     @Test
testGetSupportedLocales_exclusiveFilternull95     fun testGetSupportedLocales_exclusiveFilter() {
96         setTestLocaleFilter("^(?!de-IT|es|fr).*")
97 
98         val locales = LocalePicker.getSupportedLocales(mContext)
99 
100         assertThat(locales).isEqualTo(
101                 mUnfilteredLocales
102                         .filter { !it.startsWithAnyOf("de-IT", "es", "fr") }
103                         .toTypedArray()
104         )
105     }
106 
setTestLocaleFilternull107     private fun setTestLocaleFilter(localeFilter: String?) {
108         doReturn(localeFilter).`when` { SystemProperties.get(eq("ro.localization.locale_filter")) }
109     }
110 
startsWithAnyOfnull111     private fun String.startsWithAnyOf(vararg prefixes: String): Boolean {
112         prefixes.forEach {
113             if (startsWith(it)) return true
114         }
115 
116         return false
117     }
118 }
119