/* * Copyright (C) 2020 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.android.internal.app import android.os.SystemProperties import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry import com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn import com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession import com.android.internal.R import com.android.internal.app.LocalePicker import com.google.common.truth.Truth.assertThat import org.junit.Before import org.junit.After import org.junit.Test import org.junit.runner.RunWith import org.mockito.ArgumentMatchers.eq import org.mockito.MockitoSession @RunWith(AndroidJUnit4::class) class LocalizationTest { private val mContext = InstrumentationRegistry.getInstrumentation().context private val mUnfilteredLocales = mContext.getResources().getStringArray(R.array.supported_locales) private lateinit var mMockitoSession: MockitoSession @Before fun setUp() { mMockitoSession = mockitoSession() .initMocks(this) .spyStatic(SystemProperties::class.java) .startMocking() } @After fun tearDown() { mMockitoSession.finishMocking() } @Test fun testGetSupportedLocales_noFilter() { // Filter not set. setTestLocaleFilter(null) val locales1 = LocalePicker.getSupportedLocales(mContext) assertThat(locales1).isEqualTo(mUnfilteredLocales) // Empty filter. setTestLocaleFilter("") val locales2 = LocalePicker.getSupportedLocales(mContext) assertThat(locales2).isEqualTo(mUnfilteredLocales) } @Test fun testGetSupportedLocales_invalidFilter() { setTestLocaleFilter("**") val locales = LocalePicker.getSupportedLocales(mContext) assertThat(locales).isEqualTo(mUnfilteredLocales) } @Test fun testGetSupportedLocales_inclusiveFilter() { setTestLocaleFilter("^(de-AT|de-DE|en|ru).*") val locales = LocalePicker.getSupportedLocales(mContext) assertThat(locales).isEqualTo( mUnfilteredLocales .filter { it.startsWithAnyOf("de-AT", "de-DE", "en", "ru") } .toTypedArray() ) } @Test fun testGetSupportedLocales_exclusiveFilter() { setTestLocaleFilter("^(?!de-IT|es|fr).*") val locales = LocalePicker.getSupportedLocales(mContext) assertThat(locales).isEqualTo( mUnfilteredLocales .filter { !it.startsWithAnyOf("de-IT", "es", "fr") } .toTypedArray() ) } private fun setTestLocaleFilter(localeFilter: String?) { doReturn(localeFilter).`when` { SystemProperties.get(eq("ro.localization.locale_filter")) } } private fun String.startsWithAnyOf(vararg prefixes: String): Boolean { prefixes.forEach { if (startsWith(it)) return true } return false } }