package bluej.parser;
import java.io.StringReader;
import java.util.List;
import java.util.Map;
import java.util.Set;
import bluej.JavaFXThreadingRule;
import bluej.editor.moe.ScopeColors;
import junit.framework.TestCase;
import bluej.debugger.gentype.GenTypeClass;
import bluej.debugger.gentype.MethodReflective;
import bluej.editor.moe.MoeSyntaxDocument;
import bluej.parser.entity.ClassLoaderResolver;
import bluej.parser.entity.EntityResolver;
import bluej.parser.entity.JavaEntity;
import bluej.parser.entity.PackageOrClass;
import bluej.parser.entity.PackageResolver;
import bluej.parser.entity.TypeEntity;
import bluej.parser.nodes.ParsedCUNode;
import bluej.parser.nodes.ParsedNode;
import bluej.parser.nodes.NodeTree.NodeAndPosition;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Rule;
import org.junit.Test;
import static org.junit.Assert.*;
public class EditorParserTest
{
@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()
{
String sourceCode = ""
+ "class A\n"
+ "{\n"
+ " class B\n"
+ " {\n"
+ " }\n"
+ "}\n";
ParsedCUNode pcuNode = cuForSource(sourceCode, "");
NodeAndPosition<ParsedNode> classNP = pcuNode.findNodeAtOrAfter(0, 0);
assertEquals(ParsedNode.NODETYPE_TYPEDEF, classNP.getNode().getNodeType());
assertEquals(0, classNP.getPosition());
NodeAndPosition<ParsedNode> innerNP = classNP.getNode().findNodeAtOrAfter(9, 0);
NodeAndPosition<ParsedNode> classBNP = innerNP.getNode().findNodeAtOrAfter(innerNP.getPosition(),
innerNP.getPosition());
assertEquals(ParsedNode.NODETYPE_TYPEDEF, classBNP.getNode().getNodeType());
assertEquals(13, classBNP.getPosition());
}
@Test
public void test1a()
{
String sourceCode = ""
+ "class A\n"
+ "{\n"
+ " class B\n"
+ " {\n"
+ " }\n"
+ "}\n";
ParsedCUNode pcuNode = cuForSource(sourceCode, "");
resolver.addCompilationUnit("", pcuNode);
TypeEntity aEntity = pcuNode.resolvePackageOrClass("A", null).resolveAsType();
assertNotNull(aEntity);
TypeEntity bEntity = aEntity.getPackageOrClassMember("B");
assertNotNull(bEntity);
}
| Test that a method defined inside a class is recognized properly.
|
@Test
public void test2()
{
String aClassSrc = "class A {\n" +
" public String someMethod() {\n" +
" return \"hello\";\n" +
" }\n" +
"}\n";
ParsedCUNode aNode = cuForSource(aClassSrc, "");
resolver.addCompilationUnit("", aNode);
EntityResolver resolver = new PackageResolver(this.resolver, "");
TypeEntity aClassEnt = resolver.resolvePackageOrClass("A", null).resolveAsType();
GenTypeClass aClass = aClassEnt.getType().asClass();
Map<String,Set<MethodReflective>> methods = aClass.getReflective().getDeclaredMethods();
Set<MethodReflective> mset = methods.get("someMethod");
assertEquals(1, mset.size());
MethodReflective method = mset.iterator().next();
assertEquals("java.lang.String", method.getReturnType().toString(false));
}
| Test that a broken method call doesn't interfere with containing method position/size
|
@Test
public void test3()
{
String aClassSrc = "class A {\n" +
" public void someMethod() {\n" +
" methodCall(\n" +
" }\n" +
"}\n";
ParsedCUNode aNode = cuForSource(aClassSrc, "");
NodeAndPosition<ParsedNode> classNP = aNode.findNodeAtOrAfter(0, 0);
assertEquals(ParsedNode.NODETYPE_TYPEDEF, classNP.getNode().getNodeType());
assertEquals(0, classNP.getPosition());
NodeAndPosition<ParsedNode> innerNP = classNP.getNode().findNodeAtOrAfter(9, 0);
NodeAndPosition<ParsedNode> methodNP = innerNP.getNode().findNodeAtOrAfter(
innerNP.getPosition(), innerNP.getPosition());
assertEquals(12, methodNP.getPosition());
assertEquals(58, methodNP.getPosition() + methodNP.getSize());
}
| Test parsing a broken source doesn't break the parser...
|
@Test
public void testBroken()
{
String sourceCode = ""
+ "class A\n"
+ "{\n"
+ " A() {\n"
+ " int\n"
+ " }"
+ "}\n";
ParsedCUNode pcuNode = cuForSource(sourceCode, "");
assertNotNull(pcuNode);
}
@Test
public void testSuperclass()
{
String sourceCode = ""
+ "class A { }\n";
ParsedCUNode aNode = cuForSource(sourceCode, "");
PackageOrClass apoc = aNode.resolvePackageOrClass("A", null);
assertNotNull(apoc);
TypeEntity aTyent = apoc.resolveAsType();
assertNotNull(aTyent);
GenTypeClass aClass = aTyent.getType().asClass();
assertNotNull(aClass);
List<GenTypeClass> supers = aClass.getReflective().getSuperTypes();
assertEquals(1, supers.size());
assertEquals("java.lang.Object", supers.get(0).toString());
resolver.addCompilationUnit("", aNode);
sourceCode = "class B extends A {}\n";
ParsedCUNode bNode = cuForSource(sourceCode, "");
PackageOrClass bpoc = bNode.resolvePackageOrClass("B", null);
assertNotNull(bpoc);
TypeEntity bTyent = bpoc.resolveAsType();
assertNotNull(bTyent);
GenTypeClass bClass = bTyent.getType().asClass();
assertNotNull(bClass);
supers = bClass.getReflective().getSuperTypes();
assertEquals(1, supers.size());
assertEquals("A", supers.get(0).toString());
}
@Test
public void testImport()
{
String abcSrc = "package xyz; public class abc { public static class def { }}";
ParsedCUNode abcNode = cuForSource(abcSrc, "xyz");
resolver.addCompilationUnit("xyz", abcNode);
String defSrc = "package abc; public class def { }";
ParsedCUNode defNode = cuForSource(defSrc, "abc");
resolver.addCompilationUnit("abc", defNode);
String tSrc = "package xyz; import abc.def; class T { public static def field; }";
ParsedCUNode tNode = cuForSource(tSrc, "xyz");
resolver.addCompilationUnit("xyz", tNode);
TypeEntity tent = resolver.resolveQualifiedClass("xyz.T");
assertNotNull(tent);
JavaEntity fEnt = tent.getSubentity("field", null);
assertNotNull(fEnt);
JavaEntity fVal = fEnt.resolveAsValue();
assertNotNull(fVal);
assertEquals("abc.def", fVal.getType().toString());
}
@Test
public void testSLComment()
{
String sourceCode = ""
+ "class A\n"
+ "{\n"
+ " A() {\n"
+ " int a; // comment\n"
+ " }"
+ "}\n";
ParsedCUNode pcuNode = cuForSource(sourceCode, "");
assertNotNull(pcuNode);
NodeAndPosition<ParsedNode> top = new NodeAndPosition<ParsedNode>(pcuNode, 0, pcuNode.getSize());
NodeAndPosition<ParsedNode> nap = top.getNode().findNodeAt(29, top.getPosition());
while (nap != null){
top = nap;
nap = top.getNode().findNodeAt(29, top.getPosition());
}
assertEquals(29, top.getPosition());
assertEquals(39, top.getEnd());
}
@Test
public void testRecursiveTypedef()
{
String sourceCode = "interface Sort<T extends Comparable<T>> { }\n";
ParsedCUNode pcuNode = cuForSource(sourceCode, "");
assertNotNull(pcuNode);
PackageOrClass poc = pcuNode.resolvePackageOrClass("Sort", null);
assertNotNull(poc);
TypeEntity tent = poc.resolveAsType();
assertNotNull(tent);
InfoParser.parse(new StringReader(sourceCode), resolver, "");
}
@Test
public void testClassModifiers()
{
String sourceCode = ""
+ "interface A\n"
+ "{\n"
+ "}\n";
ParsedCUNode pcuNode = cuForSource(sourceCode, "");
resolver.addCompilationUnit("", pcuNode);
TypeEntity aTent = resolver.resolveQualifiedClass("A");
GenTypeClass aClass = aTent.getClassType();
assertFalse(aClass.getReflective().isPublic());
assertFalse(aClass.getReflective().isStatic());
assertTrue(aClass.isInterface());
sourceCode = ""
+ "public static class B\n"
+ "{\n"
+ "}\n";
pcuNode = cuForSource(sourceCode, "");
this.resolver.addCompilationUnit("", pcuNode);
TypeEntity bTent = resolver.resolveQualifiedClass("B");
GenTypeClass bClass = bTent.getClassType();
assertTrue(bClass.getReflective().isPublic());
assertTrue(bClass.getReflective().isStatic());
assertFalse(bClass.isInterface());
}
@Test
public void testIfNesting()
{
String sourceCode = ""
+ "class A\n"
+ "{\n"
+ " void method() {\n"
+ " if (true)\n"
+ " if (true)\n"
+ " hashCode();\n"
+ " else\n"
+ " hashCode();\n"
+ " else\n"
+ " hashCode();\n"
+ " }\n"
+ "}\n";
ParsedCUNode pcuNode = cuForSource(sourceCode, "");
resolver.addCompilationUnit("", pcuNode);
NodeAndPosition<ParsedNode> nap = pcuNode.findNodeAt(0, 0);
nap = nap.getNode().findNodeAt(9, nap.getPosition());
nap = nap.getNode().findNodeAt(12, nap.getPosition());
nap = nap.getNode().findNodeAt(27, nap.getPosition());
nap = nap.getNode().findNodeAt(32, nap.getPosition());
assertEquals(32, nap.getPosition());
assertEquals(135, nap.getEnd());
nap = nap.getNode().findNodeAt(48, nap.getPosition());
assertEquals(48, nap.getPosition());
assertEquals(108, nap.getEnd());
}
@Test
public void testTicket467()
{
String sourceCode = ""
+ "class A\n"
+ "{\n"
+ " void method() {\n"
+ " while (true)\n"
+ " if (true) {\n"
+ " }\n"
+ " }\n"
+ "}\n";
ParsedCUNode pcuNode = cuForSource(sourceCode, "");
resolver.addCompilationUnit("", pcuNode);
NodeAndPosition<ParsedNode> nap = pcuNode.findNodeAt(0, 0);
nap = nap.getNode().findNodeAt(9, nap.getPosition());
nap = nap.getNode().findNodeAt(12, nap.getPosition());
nap = nap.getNode().findNodeAt(27, nap.getPosition());
nap = nap.getNode().findNodeAt(32, nap.getPosition());
assertEquals(32, nap.getPosition());
assertEquals(70, nap.getEnd());
nap = nap.getNode().findNodeAt(51, nap.getPosition());
assertEquals(51, nap.getPosition());
assertEquals(70, nap.getEnd());
}
@Test
public void testTryCatch()
{
String sourceCode = ""
+ "class A\n"
+ "{\n"
+ " void method() {\n"
+ " try {\n"
+ " }\n"
+ " catch(E e) { }\n"
+ " }\n"
+ "}\n";
ParsedCUNode pcuNode = cuForSource(sourceCode, "");
resolver.addCompilationUnit("", pcuNode);
NodeAndPosition<ParsedNode> nap = pcuNode.findNodeAt(0, 0);
nap = nap.getNode().findNodeAt(9, nap.getPosition());
nap = nap.getNode().findNodeAt(12, nap.getPosition());
nap = nap.getNode().findNodeAt(27, nap.getPosition());
NodeAndPosition<ParsedNode> tryCatch = nap.getNode().findNodeAt(32, nap.getPosition());
assertEquals(32, tryCatch.getPosition());
assertEquals(63, tryCatch.getEnd());
nap = tryCatch.getNode().findNodeAt(37, tryCatch.getPosition());
assertEquals(37, nap.getPosition());
assertEquals(42, nap.getEnd());
nap = tryCatch.getNode().findNodeAt(60, tryCatch.getPosition());
assertEquals(60, nap.getPosition());
assertEquals(62, nap.getEnd());
}
@Test
public void testWhile()
{
String sourceCode = ""
+ "class A\n"
+ "{\n"
+ " void method() {\n"
+ " while(true) {\n"
+ " // nothing\n"
+ " }\n"
+ " }\n"
+ "}\n";
ParsedCUNode pcuNode = cuForSource(sourceCode, "");
resolver.addCompilationUnit("", pcuNode);
NodeAndPosition<ParsedNode> nap = pcuNode.findNodeAt(0, 0);
nap = nap.getNode().findNodeAt(9, nap.getPosition());
nap = nap.getNode().findNodeAt(12, nap.getPosition());
nap = nap.getNode().findNodeAt(27, nap.getPosition());
nap = nap.getNode().findNodeAt(32, nap.getPosition());
assertEquals(32, nap.getPosition());
assertEquals(68, nap.getEnd());
nap = nap.getNode().findNodeAt(45, nap.getPosition());
assertEquals(45, nap.getPosition());
assertEquals(67, nap.getEnd());
}
@Test
public void testLambda()
{
String sourceCode = ""
+ "class A\n"
+ "{\n"
+ " void method() {\n"
+ " Arrays.asList(\"A\", \"B\", \"C\").stream().map(s ->{/n"
+ " return s.toLowerCase();\n"
+ " }).collect(Collectors.joining(\",\"));\n"
+ " }\n"
+ "}\n";
ParsedCUNode pcuNode = cuForSource(sourceCode, "");
resolver.addCompilationUnit("", pcuNode);
NodeAndPosition<ParsedNode> nap = pcuNode.findNodeAt(0, 0);
nap = nap.getNode().findNodeAt(9, nap.getPosition());
nap = nap.getNode().findNodeAt(12, nap.getPosition());
nap = nap.getNode().findNodeAt(27, nap.getPosition());
nap = nap.getNode().findNodeAt(32, nap.getPosition());
nap = nap.getNode().findNodeAt(74, nap.getPosition());
nap = nap.getNode().findNodeAt(78, nap.getPosition());
nap = nap.getNode().findNodeAt(79, nap.getPosition());
assertEquals(79, nap.getPosition());
assertEquals(117, nap.getEnd());
}
}
top,
use,
map,
class EditorParserTest
. initConfig
. setUp
. cuForSource
. test1
. test1a
. test2
. test3
. testBroken
. testSuperclass
. testImport
. testSLComment
. testRecursiveTypedef
. testClassModifiers
. testIfNesting
. testTicket467
. testTryCatch
. testWhile
. testLambda
499 neLoCode
+ 4 LoComm