package org.jboss.seam.test.integration.i8ln;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import javax.faces.component.UIOutput;
import javax.faces.event.ValueChangeEvent;
import org.jboss.seam.international.LocaleConfig;
import org.jboss.seam.international.LocaleSelector;
import org.jboss.seam.Seam;
import org.jboss.seam.contexts.Contexts;
import org.jboss.seam.mock.SeamTest;
import org.testng.annotations.Test;
public class LocaleTest extends SeamTest
{
@Test
public void localeTest() throws Exception
{
new NonFacesRequest()
{
@Override
protected void renderResponse() throws Exception
{
// it's necessary to emulate the startup behavior of LocaleConfig since it alters the JSF Application
// and we cannot be sure that the JSF Application wasn't cleared by an earlier class
// NOTE: I wish this test suite had some better place of initializing the application context
Contexts.getApplicationContext().remove(Seam.getComponentName(LocaleConfig.class));
LocaleConfig.instance();
}
}.run();
new FacesRequest()
{
@Override
protected void invokeApplication() throws Exception
{
// <i18:locale-config default-locale="fr_CA" supported-locales="fr_CA fr_FR en"/>
List<Locale> supportedLocales = new ArrayList<Locale>();
for (Iterator<Locale> iter = getFacesContext().getApplication().getSupportedLocales(); iter.hasNext();)
{
supportedLocales.add(iter.next());
}
assert supportedLocales.size() == 3;
assert supportedLocales.contains(Locale.CANADA_FRENCH);
assert supportedLocales.contains(Locale.ENGLISH);
assert supportedLocales.contains(Locale.FRANCE);
assert getFacesContext().getApplication().getDefaultLocale().equals(Locale.CANADA_FRENCH);
// why not? I guess be default locale means different things in different contexts (server vs user)
//assert org.jboss.seam.international.Locale.instance().equals(Locale.CANADA_FRENCH);
// reset the locale configuration (as it would be w/o <i18n:locale-config>)
getFacesContext().getApplication().setDefaultLocale(Locale.ENGLISH);
getFacesContext().getApplication().setSupportedLocales(null);
assert org.jboss.seam.international.Locale.instance().equals(Locale.getDefault());
LocaleSelector.instance().setLocale(Locale.UK);
assert org.jboss.seam.international.Locale.instance().equals(Locale.UK);
LocaleSelector.instance().setLocaleString(Locale.FRANCE.toString());
assert LocaleSelector.instance().getLanguage().equals(Locale.FRANCE.getLanguage());
assert LocaleSelector.instance().getCountry().equals(Locale.FRANCE.getCountry());
assert LocaleSelector.instance().getVariant().equals(Locale.FRANCE.getVariant());
assert org.jboss.seam.international.Locale.instance().equals(Locale.FRANCE);
assert LocaleSelector.instance().getLocaleString().equals(Locale.FRANCE.toString());
LocaleSelector.instance().select();
assert org.jboss.seam.international.Locale.instance().equals(Locale.FRANCE);
LocaleSelector.instance().selectLanguage(Locale.JAPANESE.getLanguage());
assert org.jboss.seam.international.Locale.instance().getLanguage().equals(Locale.JAPANESE.getLanguage());
ValueChangeEvent valueChangeEvent = new ValueChangeEvent(new UIOutput(), Locale.JAPANESE.toString(), Locale.TAIWAN.toString());
LocaleSelector.instance().select(valueChangeEvent);
assert org.jboss.seam.international.Locale.instance().equals(Locale.TAIWAN);
Locale uk_posix = new Locale(Locale.UK.getLanguage(), Locale.UK.getCountry(), "POSIX");
LocaleSelector.instance().setLocale(uk_posix);
assert org.jboss.seam.international.Locale.instance().equals(uk_posix);
assert LocaleSelector.instance().getLanguage().equals(uk_posix.getLanguage());
assert LocaleSelector.instance().getCountry().equals(uk_posix.getCountry());
assert LocaleSelector.instance().getVariant().equals(uk_posix.getVariant());
LocaleSelector.instance().setLanguage(Locale.CHINA.getLanguage());
LocaleSelector.instance().setCountry(Locale.CHINA.getCountry());
LocaleSelector.instance().setVariant(null);
assert org.jboss.seam.international.Locale.instance().equals(Locale.CHINA);
LocaleSelector.instance().setLanguage(Locale.ITALIAN.getLanguage());
LocaleSelector.instance().setCountry(null);
LocaleSelector.instance().setVariant(null);
assert org.jboss.seam.international.Locale.instance().equals(Locale.ITALIAN);
assert LocaleSelector.instance().getSupportedLocales().size() == 1;
assert LocaleSelector.instance().getSupportedLocales().get(0).getValue().equals(Locale.ENGLISH.toString());
assert LocaleSelector.instance().getSupportedLocales().get(0).getLabel().equals(Locale.ENGLISH.getDisplayName());
boolean failed = false;
try
{
LocaleSelector.instance().setLocale(null);
}
catch (NullPointerException e)
{
failed = true;
}
assert failed;
// TODO Test cookie stuff (need to extend Mocks for this)
}
}.run();
}
}