package org.eclipse.dltk.xotcl.core.tests.parser; import java.util.ArrayList; import java.util.List; import junit.framework.TestCase; import org.eclipse.dltk.ast.ASTNode; import org.eclipse.dltk.ast.ASTVisitor; import org.eclipse.dltk.ast.declarations.MethodDeclaration; import org.eclipse.dltk.ast.declarations.ModuleDeclaration; import org.eclipse.dltk.ast.declarations.TypeDeclaration; import org.eclipse.dltk.compiler.env.ModuleSource; import org.eclipse.dltk.tcl.core.ITclSourceParser; import org.eclipse.dltk.tcl.core.TclParseUtil; import org.eclipse.dltk.tcl.internal.parser.TclSourceParserFactory; import org.eclipse.dltk.utils.TextUtils; public class XOTclParserUtilTests extends TestCase { public void testParseUtil001() throws Throwable { String[] content = { "namespace eval c {", "}", "namespace eval a {", " namespace eval b {", " proc ::c::d { } {", " }", " }", "}" }; ModuleDeclaration module = this.parser(content); ASTNode nodes[] = findNodeByName(module, "::c::d"); assertEquals(1, nodes.length); ASTNode node = nodes[0]; TypeDeclaration type = TclParseUtil.findTclTypeDeclarationFrom(module, node); assertNotNull(type); assertEquals("c", type.getName()); List levelsTo = TclParseUtil.findLevelsTo(module, type); assertEquals(2, levelsTo.size()); } public void testParseUtil002() throws Throwable { String[] content = { "namespace eval c {", "}", "namespace eval a {", " namespace eval b {", " proc ::c::d { } {", " }", " }", "}" }; ModuleDeclaration module = this.parser(content); ASTNode nodes[] = findNodeByName(module, "::c::d"); assertEquals(1, nodes.length); ASTNode node = nodes[0]; TypeDeclaration type = TclParseUtil.findTclTypeDeclarationFrom(module, node); assertNotNull(type); assertEquals("c", type.getName()); List levelsTo = TclParseUtil.findLevelsTo(module, type); assertEquals(2, levelsTo.size()); } public void testParseUtil003() throws Throwable { String[] content = { "namespace eval c {", " namespace eval d {", " }", "}", "namespace eval a {", " namespace eval b {", " proc ::c::d::q { } {", " }", " }", "}" }; ModuleDeclaration module = this.parser(content); ASTNode nodes[] = findNodeByName(module, "::c::d::q"); assertEquals(1, nodes.length); ASTNode node = nodes[0]; TypeDeclaration type = TclParseUtil.findTclTypeDeclarationFrom(module, node); assertNotNull(type); assertEquals("d", type.getName()); List levelsTo = TclParseUtil.findLevelsTo(module, type); assertEquals(3, levelsTo.size()); } public void testParseUtil004() throws Throwable { String[] content = { "namespace eval c {", " namespace eval d {", " }", "}", "namespace eval a {", " namespace eval b {", " proc ::c::d::q { } {", " }", " }", "}" }; ModuleDeclaration module = this.parser(content); ASTNode nodes[] = findNodeByName(module, "::c::d::q"); assertEquals(1, nodes.length); ASTNode node = nodes[0]; TypeDeclaration type = TclParseUtil.findTclTypeDeclarationFrom(module, node); assertNotNull(type); assertEquals("d", type.getName()); List levelsTo = TclParseUtil.findLevelsTo(module, type); assertEquals(3, levelsTo.size()); } public void testParseUtil005() throws Throwable { String[] content = { "namespace eval c {", " namespace eval d {", " }", "}", "namespace eval a {", " namespace eval c {", " }", " namespace eval b {", " proc ::c::d::q { } {", " }", " }", "}" }; ModuleDeclaration module = this.parser(content); ASTNode nodes[] = findNodeByName(module, "::c::d::q"); assertEquals(1, nodes.length); ASTNode node = nodes[0]; TypeDeclaration type = TclParseUtil.findTclTypeDeclarationFrom(module, node); assertNotNull(type); assertEquals("d", type.getName()); List levelsTo = TclParseUtil.findLevelsTo(module, type); assertEquals(3, levelsTo.size()); } public void testParseUtil006() throws Throwable { String[] content = { "namespace eval c {", " namespace eval d {", " }", "}", "namespace eval a {", " namespace eval c {", " namespace eval d {", " }", " }", " namespace eval b {", " proc ::c::d::q { } {", " }", " }", "}" }; ModuleDeclaration module = this.parser(content); ASTNode nodes[] = findNodeByName(module, "::c::d::q"); assertEquals(1, nodes.length); ASTNode node = nodes[0]; TypeDeclaration type = TclParseUtil.findTclTypeDeclarationFrom(module, node); assertNotNull(type); assertEquals("d", type.getName()); List levelsTo = TclParseUtil.findLevelsTo(module, type); assertEquals(3, levelsTo.size()); } public void testParseUtil007() throws Throwable { String[] content = { "namespace eval c::d {", "}", "namespace eval a {", " namespace eval b {", " proc ::c::d::q { } {", " }", " }", "}" }; ModuleDeclaration module = this.parser(content); ASTNode nodes[] = findNodeByName(module, "::c::d::q"); assertEquals(1, nodes.length); ASTNode node = nodes[0]; TypeDeclaration type = TclParseUtil.findTclTypeDeclarationFrom(module, node); assertNotNull(type); assertEquals("c::d", type.getName()); List levelsTo = TclParseUtil.findLevelsTo(module, type); assertEquals(2, levelsTo.size()); } public void testParseUtil008() throws Throwable { String[] content = { "namespace eval c::d {", "}", "namespace eval a {", " namespace eval b {", " namespace eval c::d {", " }", " proc c::d::q { } {", " }", " }", "}" }; ModuleDeclaration module = this.parser(content); ASTNode nodes[] = findNodeByName(module, "c::d::q"); assertEquals(1, nodes.length); ASTNode node = nodes[0]; TypeDeclaration type = TclParseUtil.findTclTypeDeclarationFrom(module, node); assertNotNull(type); assertEquals("c::d", type.getName()); List levelsTo = TclParseUtil.findLevelsTo(module, type); assertEquals(4, levelsTo.size()); } public void testParseUtil009() throws Throwable { String[] content = { "namespace eval c::d {", "}", "namespace eval a {", " namespace eval c::d {", " }", " namespace eval b {", " namespace eval c::d {", " }", " proc c::d::q { } {", " }", " }", "}" }; ModuleDeclaration module = this.parser(content); ASTNode nodes[] = findNodeByName(module, "c::d::q"); assertEquals(1, nodes.length); ASTNode node = nodes[0]; TypeDeclaration type = TclParseUtil.findTclTypeDeclarationFrom(module, node); assertNotNull(type); assertEquals("c::d", type.getName()); List levelsTo = TclParseUtil.findLevelsTo(module, type); assertEquals(4, levelsTo.size()); } public void testParseUtil010() throws Throwable { String[] content = { "namespace eval c::d {", "}", "namespace eval a {", " namespace eval c {", " namespace eval d {", " }", " }", " namespace eval c::d {", " }", " namespace eval b {", " namespace eval c::d {", " }", " proc c::d::q { } {", " }", " }", "}" }; ModuleDeclaration module = this.parser(content); ASTNode nodes[] = findNodeByName(module, "c::d::q"); assertEquals(1, nodes.length); ASTNode node = nodes[0]; TypeDeclaration type = TclParseUtil.findTclTypeDeclarationFrom(module, node); assertNotNull(type); assertEquals("c::d", type.getName()); List levelsTo = TclParseUtil.findLevelsTo(module, type); assertEquals(4, levelsTo.size()); } public void testParseUtil011() throws Throwable { String[] content = { "namespace eval c::d {" + "}", "namespace eval a {", " namespace eval c {", " namespace eval d {", " }", " }", " namespace eval c::d {", " }", " namespace eval b {", " namespace eval c::d {", " }", " proc ::c::d::q { } {", " }", " }", "}" }; ModuleDeclaration module = this.parser(content); ASTNode nodes[] = findNodeByName(module, "::c::d::q"); assertEquals(1, nodes.length); ASTNode node = nodes[0]; TypeDeclaration type = TclParseUtil.findTclTypeDeclarationFrom(module, node); assertNotNull(type); assertEquals("c::d", type.getName()); List levelsTo = TclParseUtil.findLevelsTo(module, type); assertEquals(2, levelsTo.size()); } /** * @throws Throwable */ public void testParseUtil012() throws Throwable { String[] content = { "namespace eval c::d {", "}", "namespace eval a {", " namespace eval c {", " namespace eval d {", " }", " }", " namespace eval c::d {", " }", " namespace eval b {", " namespace eval c::d {", " }", " proc ::a::c::d::q { } {", " }", " }", "}" }; ModuleDeclaration module = this.parser(content); ASTNode nodes[] = findNodeByName(module, "::a::c::d::q"); assertEquals(1, nodes.length); ASTNode node = nodes[0]; TypeDeclaration type = TclParseUtil.findTclTypeDeclarationFrom(module, node); assertNotNull(type); assertEquals("d", type.getName()); List levelsTo = TclParseUtil.findLevelsTo(module, type); assertEquals(4, levelsTo.size()); } public void testParseUtil013() throws Throwable { String[] content = { "namespace eval c::d {", "}", "namespace eval a {", " namespace eval c {", " namespace eval d {", " }", " }", " namespace eval c::d {", " }", " namespace eval b {", " namespace eval c::d {", " }", " proc ::a::b::c::d::q { } {", " }", " }" + "}" }; ModuleDeclaration module = this.parser(content); ASTNode nodes[] = findNodeByName(module, "::a::b::c::d::q"); assertEquals(1, nodes.length); ASTNode node = nodes[0]; TypeDeclaration type = TclParseUtil.findTclTypeDeclarationFrom(module, node); assertNotNull(type); assertEquals("c::d", type.getName()); List levelsTo = TclParseUtil.findLevelsTo(module, type); assertEquals(4, levelsTo.size()); } public void testParseUtil014() throws Throwable { String[] content = { "namespace eval c::d {", " namespace eval a {", " namespace eval gamma::delta {", " }", " }", "}", "namespace eval a {", " proc ::c::d::a::gamma::delta::q { } {", " }", " }", "}" }; ModuleDeclaration module = this.parser(content); ASTNode nodes[] = findNodeByName(module, "::c::d::a::gamma::delta::q"); assertEquals(1, nodes.length); ASTNode node = nodes[0]; TypeDeclaration type = TclParseUtil.findTclTypeDeclarationFrom(module, node); assertNotNull(type); assertEquals("gamma::delta", type.getName()); List levelsTo = TclParseUtil.findLevelsTo(module, type); assertEquals(4, levelsTo.size()); } private ASTNode[] findNodeByName(ModuleDeclaration module, final String name) throws Exception { final List results = new ArrayList(); module.traverse(new ASTVisitor() { public boolean endvisit(TypeDeclaration s) throws Exception { if (s.getName().equals(name)) { return results.add(s); } return super.endvisit(s); } public boolean visit(MethodDeclaration s) throws Exception { if (s.getName().equals(name)) { return results.add(s); } return super.visit(s); } }); return (ASTNode[]) results.toArray(new ASTNode[results.size()]); } private ModuleDeclaration parser(String[] content) { ITclSourceParser parser = new TclSourceParserFactory() .createSourceParser(); ModuleDeclaration module = parser.parse(new ModuleSource(join(content)), null); assertNotNull(module); return module; } public static String join(String[] content) { return TextUtils.join(content, '\n') + '\n'; } }