/*
* Copyright 2012 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Eclipse Public License version 1.0, available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.jboss.forge.test.roaster.model;
import java.util.List;
import java.util.Map;
import org.jboss.forge.roaster.Roaster;
import org.jboss.forge.roaster.model.Type;
import org.jboss.forge.roaster.model.source.FieldSource;
import org.jboss.forge.roaster.model.source.JavaClassSource;
import org.junit.Assert;
import org.junit.Test;
/**
* @author <a href="mailto:lincolnbaxter@gmail.com">Lincoln Baxter, III</a>
*/
public class FieldTypeTest
{
@Test
public void testGetReturnTypeReturnsFullTypeForJavaLang() throws Exception
{
FieldSource<JavaClassSource> field = Roaster.create(JavaClassSource.class).addField("public Long l;");
Assert.assertEquals("java.lang.Long", field.getType().getQualifiedName());
Assert.assertEquals("Long", field.getType().getName());
}
@Test
public void testGetReturnTypeReturnsFullTypeForJavaLangGeneric() throws Exception
{
FieldSource<JavaClassSource> field = Roaster.create(JavaClassSource.class)
.addField("public List<Long> list;");
field.getOrigin().addImport(List.class);
Assert.assertEquals("java.util.List", field.getType().getQualifiedName());
Assert.assertEquals("List", field.getType().getName());
}
@Test
public void testGetReturnTypeObjectArray() throws Exception
{
FieldSource<JavaClassSource> field = Roaster.create(JavaClassSource.class)
.addField("public List[] field;");
field.getOrigin().addImport(List.class);
Type<JavaClassSource> type = field.getType();
Assert.assertEquals("java.util.List", type.getQualifiedName());
Assert.assertFalse(type.isParameterized());
Assert.assertFalse(type.isWildcard());
Assert.assertFalse(type.isPrimitive());
Assert.assertFalse(type.isQualified());
Assert.assertTrue(type.isArray());
List<Type<JavaClassSource>> arguments = type.getTypeArguments();
Assert.assertEquals(0, arguments.size());
}
@Test
public void testGetReturnTypeObjectArrayParameterized() throws Exception
{
FieldSource<JavaClassSource> field = Roaster.create(JavaClassSource.class)
.addField("public List<Long>[] list;");
field.getOrigin().addImport(List.class);
Type<JavaClassSource> type = field.getType();
Assert.assertEquals("java.util.List", type.getQualifiedName());
Assert.assertTrue(type.isParameterized());
Assert.assertFalse(type.isWildcard());
Assert.assertFalse(type.isPrimitive());
Assert.assertFalse(type.isQualified());
Assert.assertTrue(type.isArray());
List<Type<JavaClassSource>> arguments = type.getTypeArguments();
Assert.assertEquals(1, arguments.size());
}
@Test
public void testGetReturnTypeObjectUnparameterized() throws Exception
{
FieldSource<JavaClassSource> field = Roaster.create(JavaClassSource.class)
.addField("public List list;");
field.getOrigin().addImport(List.class);
Assert.assertEquals("java.util.List", field.getType().getQualifiedName());
Assert.assertFalse(field.getType().isParameterized());
}
@Test
public void testGetReturnTypeObjectParameterized() throws Exception
{
FieldSource<JavaClassSource> field = Roaster.create(JavaClassSource.class)
.addField("public List<Long> list;");
field.getOrigin().addImport(List.class);
Type<JavaClassSource> type = field.getType();
Assert.assertEquals("java.util.List", type.getQualifiedName());
Assert.assertTrue(type.isParameterized());
List<Type<JavaClassSource>> arguments = type.getTypeArguments();
Assert.assertEquals(1, arguments.size());
Assert.assertEquals("Long", arguments.get(0).getName());
Assert.assertEquals("java.lang.Long", arguments.get(0).getQualifiedName());
}
@Test
public void testGetReturnTypeObjectWildcard() throws Exception
{
FieldSource<JavaClassSource> field = Roaster.create(JavaClassSource.class)
.addField("public List<?> list;");
field.getOrigin().addImport(List.class);
Type<JavaClassSource> type = field.getType();
Assert.assertEquals("java.util.List", type.getQualifiedName());
Assert.assertTrue(type.isParameterized());
List<Type<JavaClassSource>> arguments = type.getTypeArguments();
Assert.assertEquals(1, arguments.size());
Assert.assertEquals("?", arguments.get(0).getName());
Assert.assertEquals("?", arguments.get(0).getQualifiedName());
}
@Test
public void testGetReturnTypeObjectParameterizedMultiple() throws Exception
{
FieldSource<JavaClassSource> field = Roaster.create(JavaClassSource.class)
.addField("public Map<String, Long> map;");
field.getOrigin().addImport(Map.class);
Type<JavaClassSource> type = field.getType();
Assert.assertEquals("java.util.Map", type.getQualifiedName());
Assert.assertTrue(type.isParameterized());
List<Type<JavaClassSource>> arguments = type.getTypeArguments();
Assert.assertEquals(2, arguments.size());
Assert.assertEquals("String", arguments.get(0).getName());
Assert.assertEquals("java.lang.String", arguments.get(0).getQualifiedName());
Assert.assertEquals("Long", arguments.get(1).getName());
Assert.assertEquals("java.lang.Long", arguments.get(1).getQualifiedName());
}
@Test
public void testGetReturnTypeObjectParameterizedNested() throws Exception
{
FieldSource<JavaClassSource> field = Roaster.create(JavaClassSource.class)
.addField("public List<List<Long>> map;");
field.getOrigin().addImport(List.class);
Type<JavaClassSource> type = field.getType();
Assert.assertEquals("java.util.List", type.getQualifiedName());
Assert.assertTrue(type.isParameterized());
List<Type<JavaClassSource>> arguments = type.getTypeArguments();
Assert.assertEquals(1, arguments.size());
Assert.assertEquals("List", arguments.get(0).getName());
Assert.assertEquals("java.util.List", arguments.get(0).getQualifiedName());
Assert.assertEquals(1, arguments.size());
Assert.assertEquals("Long", arguments.get(0).getTypeArguments().get(0).getName());
Assert.assertEquals("java.lang.Long", arguments.get(0).getTypeArguments().get(0).getQualifiedName());
}
@Test
public void testGetReturnTypeObjectParameterizedMultipleNested() throws Exception
{
FieldSource<JavaClassSource> field = Roaster.create(JavaClassSource.class)
.addField("public Map<String, List<Long>> map;");
field.getOrigin().addImport(List.class);
field.getOrigin().addImport(Map.class);
Type<JavaClassSource> type = field.getType();
Assert.assertEquals("java.util.Map", type.getQualifiedName());
Assert.assertTrue(type.isParameterized());
List<Type<JavaClassSource>> arguments = type.getTypeArguments();
Assert.assertEquals(2, arguments.size());
Assert.assertEquals("String", arguments.get(0).getName());
Assert.assertEquals("java.lang.String", arguments.get(0).getQualifiedName());
Assert.assertEquals("List", arguments.get(1).getName());
Assert.assertEquals("java.util.List", arguments.get(1).getQualifiedName());
}
@Test
public void testGetReturnTypeObjectParameterizedArrayMultipleNested() throws Exception
{
FieldSource<JavaClassSource> field = Roaster.create(JavaClassSource.class)
.addField("public Map<String, List<Long>>[] maps;");
field.getOrigin().addImport(List.class);
field.getOrigin().addImport(Map.class);
Type<JavaClassSource> type = field.getType();
Assert.assertEquals("java.util.Map", type.getQualifiedName());
Assert.assertTrue(type.isParameterized());
List<Type<JavaClassSource>> arguments = type.getTypeArguments();
Assert.assertEquals(2, arguments.size());
Assert.assertEquals("String", arguments.get(0).getName());
Assert.assertEquals("java.lang.String", arguments.get(0).getQualifiedName());
Assert.assertEquals("List", arguments.get(1).getName());
Assert.assertEquals("java.util.List", arguments.get(1).getQualifiedName());
}
@Test
public void testFieldTypeByteArrayTest()
{
final JavaClassSource javaClass = Roaster.create(JavaClassSource.class);
final FieldSource<JavaClassSource> field = javaClass.addField();
field.setName("content");
field.setType(byte[].class);
Assert.assertEquals("byte", field.getType().getQualifiedName());
Assert.assertTrue(field.getType().isArray());
Assert.assertEquals(1, field.getType().getArrayDimensions());
}
@Test
public void testFieldMultidimensionalArray()
{
final JavaClassSource javaClass = Roaster.create(JavaClassSource.class);
final FieldSource<JavaClassSource> field = javaClass.addField();
field.setName("content");
field.setType(byte[][][].class);
Assert.assertEquals("byte", field.getType().getQualifiedName());
Type<JavaClassSource> type = field.getType();
Assert.assertTrue(type.isArray());
Assert.assertEquals(3, type.getArrayDimensions());
}
@Test
public void testFieldMultidimensionalArray2()
{
final JavaClassSource javaClass = Roaster.create(JavaClassSource.class);
final FieldSource<JavaClassSource> field = javaClass.addField();
field.setName("content");
field.setType(java.util.Vector[][][].class);
Assert.assertEquals("java.util.Vector", field.getType().getQualifiedName());
Type<JavaClassSource> type = field.getType();
Assert.assertTrue(type.isArray());
Assert.assertEquals(3, type.getArrayDimensions());
Assert.assertEquals("Vector[][][]", field.getType().getName());
}
@Test
public void testFieldTypeByteArrayAlternativeDeclarationTest()
{
final JavaClassSource javaClass = Roaster.create(JavaClassSource.class);
final FieldSource<JavaClassSource> field = javaClass.addField("public byte content[];");
Assert.assertEquals("byte[]", field.getType().getName());
Assert.assertEquals("byte", field.getType().getQualifiedName());
Assert.assertTrue(field.getType().isArray());
Assert.assertEquals(1, field.getType().getArrayDimensions());
}
@Test
public void testFieldTypeObjectArrayAlternativeDeclarationTest()
{
final JavaClassSource javaClass = Roaster.create(JavaClassSource.class);
final FieldSource<JavaClassSource> field = javaClass.addField("public Long content[];");
Assert.assertEquals("Long[]", field.getType().getName());
Assert.assertEquals("java.lang.Long", field.getType().getQualifiedName());
Assert.assertTrue(field.getType().isArray());
Assert.assertEquals(1, field.getType().getArrayDimensions());
}
@Test
public void testFieldTypeObjectArrayMixedDimensionTest()
{
final JavaClassSource javaClass = Roaster.create(JavaClassSource.class);
final FieldSource<JavaClassSource> field = javaClass.addField("public Long[] content[];");
Assert.assertEquals("Long[][]", field.getType().getName());
Assert.assertEquals("java.lang.Long", field.getType().getQualifiedName());
Assert.assertTrue(field.getType().isArray());
Assert.assertEquals(2, field.getType().getArrayDimensions());
}
@Test
public void testGenericFieldType() throws Exception
{
JavaClassSource javaClass = Roaster.create(JavaClassSource.class);
FieldSource<JavaClassSource> field = javaClass.addField();
field.setPrivate().setName("email").setType("java.util.List<String>")
.setLiteralInitializer("new java.util.ArrayList<String>()");
Assert.assertTrue(javaClass.hasImport(List.class));
Assert.assertEquals("List<String>", field.getType().toString());
Assert.assertEquals("new java.util.ArrayList<String>()", field.getLiteralInitializer());
}
@Test
public void testComplexFieldType() throws Exception
{
JavaClassSource clazz = Roaster.create(JavaClassSource.class).setName("MyClass<T>");
String type = "java.util.Map<org.foo.MyEnum<T>,java.lang.Object>";
FieldSource<JavaClassSource> field = clazz.addField().setName("field").setType(type);
Assert.assertEquals(type, field.getType().getQualifiedNameWithGenerics());
}
@Test
public void testComplexFieldTypeArray() throws Exception
{
JavaClassSource clazz = Roaster.create(JavaClassSource.class).setName("MyClass<T>");
String type = "java.util.Map<org.Foo.MyEnum<T>,java.lang.Object>[][]";
FieldSource<JavaClassSource> field = clazz.addField().setName("field").setType(type);
Assert.assertEquals(type, field.getType().getQualifiedNameWithGenerics());
}
@Test
public void testImportImpliedGenerics()
{
JavaClassSource clazz = Roaster.create(JavaClassSource.class).setName("MyClass");
String type = "org.foo.Code<org.foo.Condition>";
FieldSource<JavaClassSource> field = clazz.addField().setName("param").setType(type);
Assert.assertEquals(2, clazz.getImports().size());
}
@Test
public void testNestedGenerics()
{
JavaClassSource clazz = Roaster.create(JavaClassSource.class).setName("MyClass");
String type = "java.util.List<java.util.List<java.util.List<String>>>";
FieldSource<JavaClassSource> field = clazz.addField().setName("param").setType(type);
Assert.assertEquals(type, field.getType().getQualifiedNameWithGenerics());
}
}