package org.fusesource.restygwt.rebind;
import java.beans.Introspector;
import java.util.Collection;
import java.util.List;
import junit.framework.TestCase;
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo.Id;
import org.fusesource.restygwt.rebind.JsonEncoderDecoderClassCreator.Subtype;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import com.google.gwt.core.ext.GeneratorContext;
import com.google.gwt.core.ext.TreeLogger;
import com.google.gwt.core.ext.UnableToCompleteException;
import com.google.gwt.core.ext.typeinfo.JClassType;
import static org.fusesource.restygwt.rebind.JsonEncoderDecoderClassCreator.getMiddleNameForPrefixingAsAccessorMutatorJavaBeansSpecCompliance;
@RunWith(JUnit4.class)
public class JsonEncoderDecoderClassCreatorTestCase extends TestCase
{
@Rule
public ExpectedException exception = ExpectedException.none();
private static class MyPossibleTypesVisitor extends PossibleTypesVisitor {
boolean hasEnteredGetPossibleTypesForClass;
boolean hasEnteredGetPossibleTypesForOther;
public MyPossibleTypesVisitor(GeneratorContext context, JClassType classType, boolean isLeaf,
TreeLogger logger, Collection<JsonSubTypes.Type> types)
{
super(context, classType, isLeaf, logger, types);
}
@Override
protected List<Subtype> getPossibleTypesForClass(GeneratorContext context, JClassType classType, Id id,
boolean isLeaf, TreeLogger logger, Collection<JsonSubTypes.Type> types) throws UnableToCompleteException
{
hasEnteredGetPossibleTypesForClass = true;
return null;
}
@Override
protected List<Subtype> getPossibleTypesForOther(GeneratorContext context, JClassType classType,
boolean isLeaf, TreeLogger logger, Collection<JsonSubTypes.Type> types) throws UnableToCompleteException
{
hasEnteredGetPossibleTypesForOther = true;
return null;
}
}
@Test
public void testGetPossibleTypesForClass() throws Throwable {
check(Id.CLASS, true, false);
check(Id.MINIMAL_CLASS, true, false);
check(Id.CUSTOM, false, true);
check(Id.NAME, false, true);
}
@Test(expected=UnableToCompleteException.class)
public void testGetPossibleTypesForClass2() throws Throwable {
check(Id.NONE, false, true);
}
private void check(final Id id, final boolean classMethodVisited, final boolean otherMethodVisited)
throws Throwable
{
MyPossibleTypesVisitor v = new MyPossibleTypesVisitor(null, null, true, new TreeLogger(){
@Override
public void log(Type type, String msg, Throwable caught, HelpInfo helpInfo){
}
@Override
public boolean isLoggable(Type type){
return false;
}
@Override
public TreeLogger branch(Type type, String msg, Throwable caught, HelpInfo helpInfo){
return null;
}
}, null);
v.visit(id);
assertEquals(v.hasEnteredGetPossibleTypesForClass, classMethodVisited);
assertEquals(v.hasEnteredGetPossibleTypesForOther, otherMethodVisited);
}
@Test
public void testNamingConventions() {
String name = "a";
assertEquals("A", getMiddleNameForPrefixingAsAccessorMutatorJavaBeansSpecCompliance(name));
assertEquals(name, Introspector.decapitalize(getMiddleNameForPrefixingAsAccessorMutatorJavaBeansSpecCompliance(name)));
name = "foo";
assertEquals("Foo", getMiddleNameForPrefixingAsAccessorMutatorJavaBeansSpecCompliance(name));
assertEquals(name, Introspector.decapitalize(getMiddleNameForPrefixingAsAccessorMutatorJavaBeansSpecCompliance(name)));
name = "URL";
assertEquals("URL", getMiddleNameForPrefixingAsAccessorMutatorJavaBeansSpecCompliance(name));
assertEquals(name, Introspector.decapitalize(getMiddleNameForPrefixingAsAccessorMutatorJavaBeansSpecCompliance(name)));
name = "xValue";
assertEquals("xValue", getMiddleNameForPrefixingAsAccessorMutatorJavaBeansSpecCompliance(name));
assertEquals(name, Introspector.decapitalize(getMiddleNameForPrefixingAsAccessorMutatorJavaBeansSpecCompliance(name)));
name = "myValue";
assertEquals("MyValue", getMiddleNameForPrefixingAsAccessorMutatorJavaBeansSpecCompliance(name));
assertEquals(name, Introspector.decapitalize(getMiddleNameForPrefixingAsAccessorMutatorJavaBeansSpecCompliance(name)));
name = "MYTestValue";
assertEquals("MYTestValue", getMiddleNameForPrefixingAsAccessorMutatorJavaBeansSpecCompliance(name));
assertEquals(name, Introspector.decapitalize(getMiddleNameForPrefixingAsAccessorMutatorJavaBeansSpecCompliance(name)));
}
}