package bluej.parser;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import bluej.JavaFXThreadingRule;
import bluej.editor.moe.ScopeColors;
import junit.framework.TestCase;
import bluej.debugger.gentype.GenTypeClass;
import bluej.debugger.gentype.GenTypeParameter;
import bluej.debugger.gentype.GenTypeWildcard;
import bluej.debugger.gentype.JavaPrimitiveType;
import bluej.debugger.gentype.JavaType;
import bluej.editor.moe.MoeSyntaxDocument;
import bluej.parser.TextAnalyzer.MethodCallDesc;
import bluej.parser.entity.ClassLoaderResolver;
import bluej.parser.entity.EntityResolver;
import bluej.parser.entity.PackageOrClass;
import bluej.parser.entity.PackageResolver;
import bluej.parser.entity.TypeEntity;
import bluej.parser.nodes.ParsedCUNode;
import bluej.utility.JavaReflective;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Rule;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
public class TextAnalyserTest
{
@Rule
public JavaFXThreadingRule javafxRule = new JavaFXThreadingRule();
@BeforeClass
public static void initConfig()
{
InitConfig.init();
}
private TestEntityResolver resolver;
@Before
public void setUp() throws Exception
{
resolver = new TestEntityResolver(new ClassLoaderResolver(this.getClass().getClassLoader()));
}
| Generate a compilation unit node based on some source code.
|
private ParsedCUNode cuForSource(String sourceCode, String pkg)
{
EntityResolver resolver = new PackageResolver(this.resolver, pkg);
MoeSyntaxDocument document = new MoeSyntaxDocument(resolver, ScopeColors.dummy());
document.enableParser(true);
document.insertString(0, sourceCode);
return document.getParser();
}
@Test
public void test1() throws Exception
{
List<GenTypeParameter> tpars = new ArrayList<GenTypeParameter>();
tpars.add(new GenTypeWildcard(null, new GenTypeClass(new JavaReflective(String.class))));
GenTypeClass listClass = new GenTypeClass(new JavaReflective(List.class), tpars);
JavaType argType = JavaPrimitiveType.getInt();
List<MethodCallDesc> choices = TextAnalyzer.getSuitableMethods("get", listClass.getCapture(),
new JavaType[] {argType
},
Collections.<GenTypeParameter>emptyList(), new JavaReflective(Object.class));
assertEquals(1, choices.size());
MethodCallDesc mcd = choices.get(0);
assertEquals("java.lang.Object", mcd.retType.getErasedType().toString());
}
@Test
public void test2() throws Exception
{
String aClassSrc = "import java.util.List;\n" +
"abstract class Test1 {\n" +
" abstract <T> T foo(List<List<? extends T>> f);\n" +
"}\n";
ParsedCUNode aNode = cuForSource(aClassSrc, "");
resolver.addCompilationUnit("", aNode);
PackageOrClass poc = aNode.resolvePackageOrClass("Test1", null);
TypeEntity tent = poc.resolveAsType();
GenTypeClass test1class = tent.getClassType();
GenTypeClass stringClass = new GenTypeClass(new JavaReflective(String.class));
GenTypeParameter extendsString = new GenTypeWildcard(stringClass, null);
List<GenTypeParameter> params = new ArrayList<GenTypeParameter>();
params.add(extendsString);
GenTypeClass listExtendsString = new GenTypeClass(new JavaReflective(List.class), params);
params = new ArrayList<GenTypeParameter>();
params.add(listExtendsString);
GenTypeClass listListExtendsString = new GenTypeClass(new JavaReflective(List.class), params);
List<MethodCallDesc> choices = TextAnalyzer.getSuitableMethods("foo", test1class,
new JavaType[] {listListExtendsString
},
Collections.<GenTypeParameter>emptyList(), test1class.getReflective());
assertEquals(1, choices.size());
MethodCallDesc mcd = choices.get(0);
assertEquals("java.lang.String", mcd.retType.toString());
}
@Test
public void test3() throws Exception
{
String aClassSrc = "import java.util.List;\n" +
"abstract class Test1 {\n" +
" abstract <T> T foo(List<List<? super T>> f);\n" +
"}\n";
ParsedCUNode aNode = cuForSource(aClassSrc, "");
resolver.addCompilationUnit("", aNode);
PackageOrClass poc = aNode.resolvePackageOrClass("Test1", null);
TypeEntity tent = poc.resolveAsType();
GenTypeClass test1class = tent.getClassType();
GenTypeClass stringClass = new GenTypeClass(new JavaReflective(String.class));
GenTypeParameter extendsString = new GenTypeWildcard(null, stringClass);
List<GenTypeParameter> params = new ArrayList<GenTypeParameter>();
params.add(extendsString);
GenTypeClass listExtendsString = new GenTypeClass(new JavaReflective(List.class), params);
params = new ArrayList<GenTypeParameter>();
params.add(listExtendsString);
GenTypeClass listListExtendsString = new GenTypeClass(new JavaReflective(List.class), params);
List<MethodCallDesc> choices = TextAnalyzer.getSuitableMethods("foo", test1class,
new JavaType[] {listListExtendsString
},
Collections.<GenTypeParameter>emptyList(), test1class.getReflective());
assertEquals(1, choices.size());
MethodCallDesc mcd = choices.get(0);
assertEquals("java.lang.String", mcd.retType.toString());
}
@Test
public void testEagerReturnTypeResolutionA1() throws Exception
{
String aClassSrc = "class Test1<T> {\n" +
" <S> S foo(S x, S y) { return x; }\n" +
" <S extends Number & Comparable<? extends Number>> S baz(Test1<S> a) { return null; }\n" +
" void bar(Test1<Long> x, Test1<Integer> y) {\n" +
" baz(foo(x, y));\n" +
" }\n" +
"}\n";
ParsedCUNode aNode = cuForSource(aClassSrc, "");
resolver.addCompilationUnit("", aNode);
PackageOrClass poc = aNode.resolvePackageOrClass("Test1", null);
TypeEntity tent = poc.resolveAsType();
GenTypeClass test1class = tent.getClassType();
HashMap<String,GenTypeParameter> targMap = new HashMap<String,GenTypeParameter>();
targMap.put("T", new GenTypeClass(new JavaReflective(Long.class)));
GenTypeClass arg1 = new GenTypeClass(test1class.getReflective(), targMap);
targMap.clear();
targMap.put("T", new GenTypeClass(new JavaReflective(Integer.class)));
GenTypeClass arg2 = new GenTypeClass(test1class.getReflective(), targMap);
List<MethodCallDesc> choices = TextAnalyzer.getSuitableMethods("foo", test1class,
new JavaType[] {arg1, arg2
},
Collections.<GenTypeParameter>emptyList(), test1class.getReflective());
assertEquals(1, choices.size());
MethodCallDesc mcd = choices.get(0);
assertEquals("java.lang.Object", mcd.retType.toString());
targMap.clear();
targMap.put("T", new GenTypeClass(new JavaReflective(String.class)));
GenTypeClass test1classNotRaw = new GenTypeClass(test1class.getReflective(), targMap);
choices = TextAnalyzer.getSuitableMethods("foo", test1classNotRaw.getCapture(),
new JavaType[] {arg1, arg2
},
Collections.<GenTypeParameter>emptyList(), test1class.getReflective());
assertEquals(1, choices.size());
mcd = choices.get(0);
assertEquals("Test1", mcd.retType.asClass().getErasedType().toString());
List<? extends GenTypeParameter> tparams = mcd.retType.asClass().getTypeParamList();
assertEquals(1, tparams.size());
GenTypeClass[] superTypes = tparams.get(0).asSolid().getReferenceSupertypes();
assertEquals(2, superTypes.length);
List<GenTypeClass> superTypesList = new ArrayList<GenTypeClass>(superTypes.length);
Collections.addAll(superTypesList, superTypes);
GenTypeClass numberClass = new GenTypeClass(new JavaReflective(Number.class));
assertTrue(superTypesList.contains(numberClass));
List<GenTypeParameter> ctparams = new ArrayList<GenTypeParameter>(1);
ctparams.add(new GenTypeWildcard(numberClass, null));
GenTypeClass comparable = new GenTypeClass(new JavaReflective(Comparable.class), ctparams);
boolean foundComparable = false;
for (GenTypeClass possible : superTypes) {
foundComparable = comparable.isAssignableFrom(possible);
if (foundComparable) break;
}
assertTrue(foundComparable);
}
}
top,
use,
map,
class TextAnalyserTest
. initConfig
. setUp
. cuForSource
. test1
. test2
. test3
. testEagerReturnTypeResolutionA1
288 neLoCode
+ 1 LoComm