package org.wikipedia.language;
import android.os.Build;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.annotation.RequiresApi;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.ParameterizedRobolectricTestRunner;
import org.robolectric.ParameterizedRobolectricTestRunner.Parameters;
import java.util.Arrays;
import java.util.Locale;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;
public class LanguageUtilTest {
private static final String CHINESE_LANG = "zh";
private static final String SIMPLIFIED_WIKI_LANG = AppLanguageLookUpTable.SIMPLIFIED_CHINESE_LANGUAGE_CODE;
private static final String TRADITIONAL_WIKI_LANG = AppLanguageLookUpTable.TRADITIONAL_CHINESE_LANGUAGE_CODE;
public static class LanguageCodeToWikiLanguageCodeChineseScript extends LanguageCodeToWikiLanguageCodeChinese<String> {
@Parameters(name = "{0}") public static Iterable<Object[]> data() {
return Arrays.asList(new Object[][] {
{CHINESE_LANG, SIMPLIFIED_WIKI_LANG},
{"zh-Hans", SIMPLIFIED_WIKI_LANG},
{"zh-Hant", TRADITIONAL_WIKI_LANG},
{"zh-cmn-Hans", SIMPLIFIED_WIKI_LANG},
{"zh-cmn-Hant", TRADITIONAL_WIKI_LANG},
{"zh-Hans-HK", SIMPLIFIED_WIKI_LANG},
{"zh-Hant-HK", TRADITIONAL_WIKI_LANG}
});
}
public LanguageCodeToWikiLanguageCodeChineseScript(@NonNull String input,
@NonNull String expected) {
super(input, expected);
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) @Test public void test() {
Locale locale = Locale.forLanguageTag(input());
test(locale, expected());
}
}
public static class LanguageCodeToWikiLanguageCodeChineseCountry extends LanguageCodeToWikiLanguageCodeChinese<Locale> {
@Parameters(name = "{0}") public static Iterable<Object[]> data() {
return Arrays.asList(new Object[][] {
{Locale.CHINESE, SIMPLIFIED_WIKI_LANG},
{Locale.CHINA, SIMPLIFIED_WIKI_LANG},
{Locale.TAIWAN, TRADITIONAL_WIKI_LANG}
});
}
public LanguageCodeToWikiLanguageCodeChineseCountry(@NonNull Locale input,
@NonNull String expected) {
super(input, expected);
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) @Test public void test() {
test(input(), expected());
}
}
// these tests could be much simpler with junit theories but the subject has a dependency on api
// level which requires robolectric to change
@RunWith(ParameterizedRobolectricTestRunner.class)
public abstract static class LanguageCodeToWikiLanguageCodeChinese<T> {
private static Locale PREV_DEFAULT_LOCALE;
@NonNull private final T input;
@NonNull private final String expected;
@BeforeClass public static void setUpClass() {
PREV_DEFAULT_LOCALE = Locale.getDefault();
}
@AfterClass public static void tearDownClass() {
Locale.setDefault(PREV_DEFAULT_LOCALE);
}
LanguageCodeToWikiLanguageCodeChinese(@NonNull T input, @NonNull String expected) {
this.input = input;
this.expected = expected;
}
@NonNull T input() {
return input;
}
@NonNull String expected() {
return expected;
}
void test(@NonNull Locale defaultLocale, @Nullable String expected) {
Locale.setDefault(defaultLocale);
String wikiLang = LanguageUtil.languageCodeToWikiLanguageCode(CHINESE_LANG);
assertThat(wikiLang, is(expected));
}
}
}