package org.marketcetera.util.l10n;
import java.util.Iterator;
import java.util.Locale;
import org.apache.log4j.Level;
import org.apache.log4j.spi.LoggingEvent;
import org.junit.Test;
import org.marketcetera.util.except.I18NException;
import org.marketcetera.util.log.ActiveLocale;
import org.marketcetera.util.log.I18NBoundMessage1P;
import org.marketcetera.util.log.I18NBoundMessage3P;
import org.marketcetera.util.log.I18NLoggerProxy;
import org.marketcetera.util.log.I18NMessage0P;
import org.marketcetera.util.log.I18NMessage1P;
import org.marketcetera.util.log.I18NMessageProvider;
import org.marketcetera.util.test.TestCaseBase;
import static org.junit.Assert.*;
import static org.marketcetera.util.test.CollectionAssert.*;
/**
* @author tlerios@marketcetera.com
* @since 0.6.0
* @version $Id: ContainerClassInfoTest.java 16154 2012-07-14 16:34:05Z colin $
*/
/* $License$ */
public class ContainerClassInfoTest
extends TestCaseBase
{
private static interface EmptyNoProvider {}
private static interface EmptyWithProvider
{
static final I18NMessageProvider PROVIDER=
TestMessages.PROVIDER;
}
private static interface MultipleProviders
{
static final I18NMessageProvider PROVIDER1=
Messages.PROVIDER;
static final I18NMessageProvider PROVIDER2=
TestMessages.PROVIDER;
}
private static class NonstandardFields
{
static final I18NMessageProvider PROVIDER=
TestMessages.PROVIDER;
static I18NLoggerProxy LOGGER=
new I18NLoggerProxy(PROVIDER);
@SuppressWarnings("unused")
static final int INTEGER_FIELD=
1;
protected static I18NMessage0P M0_MSG=
new I18NMessage0P(LOGGER,"m0");
@SuppressWarnings("unused")
I18NMessage1P M1_MSG=
new I18NMessage1P(LOGGER,"m1");
@SuppressWarnings("unused")
static I18NMessage1P M2_MSG;
}
@Test
public void all()
throws Exception
{
ContainerClassInfo info=new ContainerClassInfo(TestMessages.class);
assertEquals(TestMessages.class,info.getContainer());
assertEquals(TestMessages.PROVIDER,info.getProvider());
assertArrayPermutation
(new I18NMessageInfo[] {
new I18NMessageInfo("m0.msg",0,TestMessages.M0_MSG),
new I18NMessageInfo("m1.msg",1,TestMessages.M1_MSG),
new I18NMessageInfo("m2.msg",2,TestMessages.M2_MSG),
new I18NMessageInfo("m3.msg",3,TestMessages.M3_MSG),
new I18NMessageInfo("m4.msg",4,TestMessages.M4_MSG),
new I18NMessageInfo("m5.msg",5,TestMessages.M5_MSG),
new I18NMessageInfo("m6.msg",6,TestMessages.M6_MSG),
new I18NMessageInfo("m7.msg",-1,TestMessages.M7_MSG),
new I18NMessageInfo("m8.msg",-1,TestMessages.M8_MSG),
},info.getMessageInfo().toArray(I18NMessageInfo.EMPTY_ARRAY));
}
@Test
public void emptyWithProvider()
throws Exception
{
ContainerClassInfo info=new ContainerClassInfo(EmptyWithProvider.class);
assertEquals(EmptyWithProvider.class,info.getContainer());
assertEquals(EmptyWithProvider.PROVIDER,info.getProvider());
assertArrayEquals(I18NMessageInfo.EMPTY_ARRAY,
info.getMessageInfo().toArray
(I18NMessageInfo.EMPTY_ARRAY));
}
@Test
public void nonstandardFields()
throws Exception
{
ActiveLocale.setProcessLocale(Locale.ROOT);
ContainerClassInfo info=new ContainerClassInfo(NonstandardFields.class);
String category=info.getClass().getName();
setLevel(category,Level.INFO);
assertEquals(NonstandardFields.class,info.getContainer());
assertEquals(NonstandardFields.PROVIDER,info.getProvider());
assertArrayPermutation
(new I18NMessageInfo[] {
new I18NMessageInfo("m0.msg",0,NonstandardFields.M0_MSG)
},info.getMessageInfo().toArray(I18NMessageInfo.EMPTY_ARRAY));
Iterator<LoggingEvent> events=getAppender().getEvents().iterator();
assertEvent
(events.next(),Level.INFO,category,
"Non-static field 'M1_MSG' is ignored",category);
assertEvent
(events.next(),Level.INFO,category,
"Null field 'M2_MSG' is ignored",category);
assertFalse(events.hasNext());
getAppender().clear();
}
@Test
public void missingProvider()
{
try {
new ContainerClassInfo(EmptyNoProvider.class);
fail();
} catch (I18NException ex) {
assertEquals
(ex.getDetail(),
new I18NBoundMessage1P(Messages.MISSING_PROVIDER,
EmptyNoProvider.class.getName()),
ex.getI18NBoundMessage());
}
}
@Test
public void multipleProviders()
{
try {
new ContainerClassInfo(MultipleProviders.class);
fail();
} catch (I18NException ex) {
assertEquals
(ex.getDetail(),
new I18NBoundMessage3P
(Messages.MULTIPLE_PROVIDERS,
MultipleProviders.class.getName(),
MultipleProviders.PROVIDER2.getProviderId(),
MultipleProviders.PROVIDER1.getProviderId()),
ex.getI18NBoundMessage());
}
}
}