package xapi.test.model;
import org.junit.Assert;
import org.junit.Test;
import xapi.annotation.model.IsModel;
import xapi.annotation.model.Key;
import xapi.collect.api.IntTo;
import xapi.collect.api.ObjectTo;
import xapi.dev.model.HasModelFields;
import xapi.dev.model.ModelField;
import xapi.inject.X_Inject;
import xapi.model.api.Model;
import xapi.model.api.ModelManifest;
import xapi.model.api.ModelManifest.MethodData;
import xapi.model.impl.ModelNameUtil;
import xapi.model.impl.ModelUtil;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import java.io.Serializable;
import java.util.AbstractSet;
import java.util.Collection;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.Callable;
public class ModelTester {
interface IsSerializable extends Serializable, Comparable<Double> {}
@IsModel(key=@Key("id"), modelType="test")
public interface TestModel <E extends Exception, I extends IntTo<E>> extends Model {
String id();
String getItem();
TestModel setItem(String item);
void deleteItem();
<T extends Runnable> IntTo<T> getParameterizedTypeVariableWithExtendsOnMethod();
<T extends Map> IntTo<? extends T> getParameterizedTypeVariableWithWildcardOnMethod();
<T extends AbstractSet & Set> IntTo<? extends T> getWideTypeVariablesWithConcreteType();
<T extends Double & IsSerializable> IntTo<? extends T> getWideTypeVariablesWithMultipleMatches();
<T extends IntTo<Callable>> T getTypeVariableWithExtendsOnMethod();
IntTo<E> getParameterizedTypeVariableWithExtendsOnClass();
I getTypeVariableWithExtendsOnClass();
<T extends Iterator<E>> ObjectTo<T, I> getMapTypes();
}
@Test
public void testModelManifest() {
final ModelManifest manifest = ModelUtil.createManifest(TestModel.class);
assertNotNull(manifest);
MethodData method = manifest.getMethodData("getParameterizedTypeVariableWithExtendsOnMethod");
assertArrayEquals(new Class[]{Runnable.class}, method.getTypeParams());
assertEquals(IntTo.class, method.getType());
method = manifest.getMethodData("getParameterizedTypeVariableWithWildcardOnMethod");
assertArrayEquals(new Class[]{Map.class}, method.getTypeParams());
assertEquals(IntTo.class, method.getType());
method = manifest.getMethodData("getWideTypeVariablesWithConcreteType");
assertArrayEquals(new Class[]{Collection.class}, method.getTypeParams());
assertEquals(IntTo.class, method.getType());
method = manifest.getMethodData("getWideTypeVariablesWithMultipleMatches");
assertArrayEquals(new Class[]{Object.class}, method.getTypeParams());
assertEquals(IntTo.class, method.getType());
method = manifest.getMethodData("getTypeVariableWithExtendsOnMethod");
assertArrayEquals(new Class[]{Callable.class}, method.getTypeParams());
assertEquals(IntTo.class, method.getType());
method = manifest.getMethodData("getParameterizedTypeVariableWithExtendsOnClass");
assertArrayEquals(new Class[]{Exception.class}, method.getTypeParams());
assertEquals(IntTo.class, method.getType());
method = manifest.getMethodData("getTypeVariableWithExtendsOnClass");
assertArrayEquals(new Class[]{Exception.class}, method.getTypeParams());
assertEquals(IntTo.class, method.getType());
method = manifest.getMethodData("getMapTypes");
assertArrayEquals(new Class[]{Iterator.class, IntTo.class}, method.getTypeParams());
assertEquals(ObjectTo.class, method.getType());
}
@Test
public void testStringManipulation() throws Exception {
String item = ModelNameUtil.stripGetter("getItem");
Assert.assertTrue(item, "item".equals(item));
item = ModelNameUtil.stripGetter("item");
Assert.assertTrue(item, "item".equals(item));
item = ModelNameUtil.stripGetter("isItem");
Assert.assertTrue(item, "item".equals(item));
item = ModelNameUtil.stripGetter("hasItem");
Assert.assertTrue(item, "item".equals(item));
item = ModelNameUtil.stripSetter("setItem");
Assert.assertTrue(item, "item".equals(item));
item = ModelNameUtil.stripSetter("putItem");
Assert.assertTrue(item, "item".equals(item));
item = ModelNameUtil.stripSetter("putAllItem");
Assert.assertTrue(item, "item".equals(item));
item = ModelNameUtil.stripSetter("setAllItem");
Assert.assertTrue(item, "item".equals(item));
}
@Test
public void testModel() throws Exception {
final HasModelFields model = generateModel();
System.out.println(model);
}
private HasModelFields generateModel() throws Exception {
final HasModelFields fields = X_Inject.instance(HasModelFields.class);
final ModelField id = fields.getOrMakeField("id");
id.setKey(TestModel.class.getMethod("id").getAnnotation(Key.class));
return fields;
}
}