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 junit.framework.Assert;
import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.container.test.api.OverProtocol;
import org.jboss.arquillian.junit.Arquillian;
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.JUnitSeamTest;
import org.jboss.seam.test.integration.Deployments;
import org.jboss.shrinkwrap.api.Archive;
import org.junit.Test;
import org.junit.runner.RunWith;
@RunWith(Arquillian.class)
public class LocaleTest extends JUnitSeamTest
{
@Deployment(name="LocaleTest")
@OverProtocol("Servlet 3.0")
public static Archive<?> createDeployment()
{
return Deployments.defaultSeamDeployment();
}
@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.assertEquals(3, supportedLocales.size());
Assert.assertTrue( supportedLocales.contains(Locale.CANADA_FRENCH) );
Assert.assertTrue( supportedLocales.contains(Locale.ENGLISH) );
Assert.assertTrue( supportedLocales.contains(Locale.FRANCE) );
Assert.assertEquals(Locale.CANADA_FRENCH, getFacesContext().getApplication().getDefaultLocale());
// 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.assertEquals(Locale.getDefault(), org.jboss.seam.international.Locale.instance());
LocaleSelector.instance().setLocale(Locale.UK);
Assert.assertEquals(Locale.UK, org.jboss.seam.international.Locale.instance());
LocaleSelector.instance().setLocaleString(Locale.FRANCE.toString());
Assert.assertEquals(Locale.FRANCE.getLanguage(), LocaleSelector.instance().getLanguage());
Assert.assertEquals(Locale.FRANCE.getCountry(), LocaleSelector.instance().getCountry());
Assert.assertEquals(Locale.FRANCE.getVariant(), LocaleSelector.instance().getVariant());
Assert.assertEquals(Locale.FRANCE, org.jboss.seam.international.Locale.instance());
Assert.assertEquals(Locale.FRANCE.toString(), LocaleSelector.instance().getLocaleString());
LocaleSelector.instance().select();
Assert.assertEquals(Locale.FRANCE, org.jboss.seam.international.Locale.instance());
LocaleSelector.instance().selectLanguage(Locale.JAPANESE.getLanguage());
Assert.assertEquals(Locale.JAPANESE.getLanguage(), org.jboss.seam.international.Locale.instance().getLanguage());
ValueChangeEvent valueChangeEvent = new ValueChangeEvent(new UIOutput(), Locale.JAPANESE.toString(), Locale.TAIWAN.toString());
LocaleSelector.instance().select(valueChangeEvent);
Assert.assertEquals(Locale.TAIWAN, LocaleSelector.instance().getLocale());
Locale uk_posix = new Locale(Locale.UK.getLanguage(), Locale.UK.getCountry(), "POSIX");
LocaleSelector.instance().setLocale(uk_posix);
Assert.assertEquals(uk_posix, org.jboss.seam.international.Locale.instance());
Assert.assertEquals(uk_posix.getLanguage(), LocaleSelector.instance().getLanguage());
Assert.assertEquals(uk_posix.getCountry(), LocaleSelector.instance().getCountry());
Assert.assertEquals(uk_posix.getVariant(), LocaleSelector.instance().getVariant());
LocaleSelector.instance().setLanguage(Locale.CHINA.getLanguage());
LocaleSelector.instance().setCountry(Locale.CHINA.getCountry());
LocaleSelector.instance().setVariant(null);
Assert.assertEquals(Locale.CHINA, org.jboss.seam.international.Locale.instance());
LocaleSelector.instance().setLanguage(Locale.ITALIAN.getLanguage());
LocaleSelector.instance().setCountry(null);
LocaleSelector.instance().setVariant(null);
Assert.assertEquals(Locale.ITALIAN, org.jboss.seam.international.Locale.instance());
Assert.assertEquals(3, LocaleSelector.instance().getSupportedLocales().size());
Assert.assertEquals(Locale.ENGLISH.toString(), LocaleSelector.instance().getSupportedLocales().get(2).getValue() );
Assert.assertEquals(Locale.ENGLISH.getDisplayName(), LocaleSelector.instance().getSupportedLocales().get(2).getLabel() );
boolean failed = false;
try
{
LocaleSelector.instance().setLocale(null);
}
catch (NullPointerException e)
{
failed = true;
}
Assert.assertEquals(true, failed);
// TODO Test cookie stuff (need to extend Mocks for this)
}
}.run();
}
}