/**
* Copyright (c) 2012-2016 André Bargull
* Alle Rechte vorbehalten / All Rights Reserved. Use is subject to license terms.
*
* <https://github.com/anba/es6draft>
*/
package com.github.anba.es6draft;
import static org.junit.Assert.assertEquals;
import java.util.Locale;
import org.junit.Test;
import com.github.anba.es6draft.runtime.Realm;
import com.github.anba.es6draft.runtime.World;
import com.github.anba.es6draft.runtime.internal.RuntimeContext;
import com.github.anba.es6draft.runtime.internal.Source;
/**
*
*/
public final class LocaleTest {
private static World newWorld(Locale locale) {
/* @formatter:off */
RuntimeContext context = new RuntimeContext.Builder()
.setLocale(locale)
.build();
/* @formatter:on */
return new World(context);
}
private static Realm newRealm(String languageTag) throws Exception {
Locale locale = new Locale.Builder().setLanguageTag(languageTag).build();
return newWorld(locale).newInitializedRealm();
}
private static Object eval(Realm realm, String sourceCode) {
Source source = new Source("eval-locale-test", 1);
return realm.getScriptLoader().script(source, sourceCode).evaluate(realm);
}
private enum Intl {
Collator, DateTimeFormat, NumberFormat
}
private static String resolvedLocale(Realm realm, Intl constructor) {
String sourceCode = String.format("new Intl.%s().resolvedOptions().locale", constructor);
return (String) eval(realm, sourceCode);
}
private static String resolvedLocaleLookup(Realm realm, Intl constructor) {
String sourceCode = String.format("new Intl.%s({localeMatcher: 'lookup'}).resolvedOptions().locale",
constructor);
return (String) eval(realm, sourceCode);
}
@Test
public void testLocaleWithScript() throws Exception {
String languageTag = "de-Latn";
Realm realm = newRealm(languageTag);
assertEquals(languageTag, realm.getLocale().toLanguageTag());
assertEquals("de", resolvedLocale(realm, Intl.Collator));
assertEquals("de", resolvedLocale(realm, Intl.DateTimeFormat));
assertEquals("de", resolvedLocale(realm, Intl.NumberFormat));
}
@Test
public void testLocaleWithRegion() throws Exception {
String languageTag = "de-AT";
Realm realm = newRealm(languageTag);
assertEquals(languageTag, realm.getLocale().toLanguageTag());
assertEquals("de-AT", resolvedLocale(realm, Intl.Collator));
assertEquals("de-AT", resolvedLocale(realm, Intl.DateTimeFormat));
assertEquals("de-AT", resolvedLocale(realm, Intl.NumberFormat));
}
@Test
public void testLocaleWithVariant() throws Exception {
String languageTag = "de-1996";
Realm realm = newRealm(languageTag);
assertEquals(languageTag, realm.getLocale().toLanguageTag());
assertEquals("de", resolvedLocale(realm, Intl.Collator));
assertEquals("de", resolvedLocale(realm, Intl.DateTimeFormat));
assertEquals("de", resolvedLocale(realm, Intl.NumberFormat));
}
@Test
public void testLocaleWithScriptAndRegion() throws Exception {
String languageTag = "de-Latn-AT";
Realm realm = newRealm(languageTag);
assertEquals(languageTag, realm.getLocale().toLanguageTag());
assertEquals("de-AT", resolvedLocale(realm, Intl.Collator));
assertEquals("de-AT", resolvedLocale(realm, Intl.DateTimeFormat));
assertEquals("de-AT", resolvedLocale(realm, Intl.NumberFormat));
}
@Test
public void testLocaleWithScriptAndRegionAndVariant() throws Exception {
String languageTag = "de-Latn-AT-1996";
Realm realm = newRealm(languageTag);
assertEquals(languageTag, realm.getLocale().toLanguageTag());
assertEquals("de-AT", resolvedLocale(realm, Intl.Collator));
assertEquals("de-AT", resolvedLocale(realm, Intl.DateTimeFormat));
assertEquals("de-AT", resolvedLocale(realm, Intl.NumberFormat));
}
@Test
public void testLocaleWithUnicodeExtension() throws Exception {
String languageTag = "de-u-co-phonebk";
Realm realm = newRealm(languageTag);
assertEquals(languageTag, realm.getLocale().toLanguageTag());
assertEquals("de", resolvedLocale(realm, Intl.Collator));
assertEquals("de", resolvedLocale(realm, Intl.DateTimeFormat));
assertEquals("de", resolvedLocale(realm, Intl.NumberFormat));
}
@Test
public void testLocaleWithRegionAndUnicodeExtension() throws Exception {
String languageTag = "de-AT-u-co-phonebk";
Realm realm = newRealm(languageTag);
assertEquals(languageTag, realm.getLocale().toLanguageTag());
assertEquals("de-AT", resolvedLocale(realm, Intl.Collator));
assertEquals("de-AT", resolvedLocale(realm, Intl.DateTimeFormat));
assertEquals("de-AT", resolvedLocale(realm, Intl.NumberFormat));
}
@Test
public void testLocaleWithPrivateExtension() throws Exception {
String languageTag = "de-x-private";
Realm realm = newRealm(languageTag);
assertEquals(languageTag, realm.getLocale().toLanguageTag());
assertEquals("de", resolvedLocale(realm, Intl.Collator));
assertEquals("de", resolvedLocale(realm, Intl.DateTimeFormat));
assertEquals("de", resolvedLocale(realm, Intl.NumberFormat));
}
@Test
public void testUnsupportedLocale() throws Exception {
String languageTag = "tlh"; // = i-klingon
Realm realm = newRealm(languageTag);
assertEquals(languageTag, realm.getLocale().toLanguageTag());
assertEquals("en", resolvedLocale(realm, Intl.Collator));
assertEquals("en", resolvedLocale(realm, Intl.DateTimeFormat));
assertEquals("en", resolvedLocale(realm, Intl.NumberFormat));
}
@Test
public void testOnlyPrivateExtension() throws Exception {
String languageTag = "x-private";
Realm realm = newRealm(languageTag);
assertEquals(languageTag, realm.getLocale().toLanguageTag());
assertEquals("en", resolvedLocale(realm, Intl.Collator));
assertEquals("en", resolvedLocale(realm, Intl.DateTimeFormat));
assertEquals("en", resolvedLocale(realm, Intl.NumberFormat));
}
@Test
public void test_en_GB() throws Exception {
String languageTag = "en-GB";
Realm realm = newRealm(languageTag);
assertEquals(languageTag, realm.getLocale().toLanguageTag());
assertEquals("en-GB", resolvedLocale(realm, Intl.Collator));
assertEquals("en-GB", resolvedLocale(realm, Intl.DateTimeFormat));
assertEquals("en-GB", resolvedLocale(realm, Intl.NumberFormat));
}
@Test
public void testLookup_en_GB() throws Exception {
String languageTag = "en-GB";
Realm realm = newRealm(languageTag);
assertEquals(languageTag, realm.getLocale().toLanguageTag());
assertEquals("en-GB", resolvedLocaleLookup(realm, Intl.Collator));
assertEquals("en-GB", resolvedLocaleLookup(realm, Intl.DateTimeFormat));
assertEquals("en-GB", resolvedLocaleLookup(realm, Intl.NumberFormat));
}
@Test
public void test_de_CH() throws Exception {
String languageTag = "de-CH";
Realm realm = newRealm(languageTag);
assertEquals(languageTag, realm.getLocale().toLanguageTag());
assertEquals("de-CH", resolvedLocale(realm, Intl.Collator));
assertEquals("de-CH", resolvedLocale(realm, Intl.DateTimeFormat));
assertEquals("de-CH", resolvedLocale(realm, Intl.NumberFormat));
}
@Test
public void testLookup_de_CH() throws Exception {
String languageTag = "de-CH";
Realm realm = newRealm(languageTag);
assertEquals(languageTag, realm.getLocale().toLanguageTag());
assertEquals("de-CH", resolvedLocaleLookup(realm, Intl.Collator));
assertEquals("de-CH", resolvedLocaleLookup(realm, Intl.DateTimeFormat));
assertEquals("de-CH", resolvedLocaleLookup(realm, Intl.NumberFormat));
}
}