/** * Copyright (c) 2005-2011 by Appcelerator, Inc. All Rights Reserved. * Licensed under the terms of the Eclipse Public License (EPL). * Please see the license.txt included with this distribution for details. * Any modifications to this file must keep this entire header intact. */ /* * Created on 12/06/2005 */ package org.python.pydev.parser.visitors.scope; import java.util.Iterator; import junit.framework.TestCase; import org.eclipse.jface.text.Document; import org.python.pydev.core.IPythonNature; import org.python.pydev.parser.PyParser; import org.python.pydev.parser.jython.SimpleNode; import org.python.pydev.parser.jython.ast.ClassDef; import org.python.pydev.parser.jython.ast.FunctionDef; import com.aptana.shared_core.structure.Tuple; /** * @author Fabio */ public class EasyASTIteratorTest extends TestCase { public static void main(String[] args) { EasyASTIteratorTest test = new EasyASTIteratorTest(); try { test.setUp(); test.testDecorator(); test.tearDown(); junit.textui.TestRunner.run(EasyASTIteratorTest.class); } catch (Throwable e) { e.printStackTrace(); } } /* * @see TestCase#setUp() */ protected void setUp() throws Exception { super.setUp(); } /* * @see TestCase#tearDown() */ protected void tearDown() throws Exception { super.tearDown(); } /** * @throws Exception * */ public void testClassesMethods() throws Exception { EasyASTIteratorVisitor visitor = new EasyASTIteratorVisitor(); String str = "" + "class C:\n" + " def met1(self):pass\n" + "\n" + "if True:\n" + " print 't'\n" + "\n" + "class D:\n" + " pass\n" + "class E:\n" + " '''t1\n" + " t2\n" + " '''\n" + "c = C()\n" + ""; Tuple<SimpleNode, Throwable> objects = PyParser.reparseDocument(new PyParser.ParserInfo(new Document(str), IPythonNature.GRAMMAR_PYTHON_VERSION_2_4)); SimpleNode root = objects.o1; root.accept(visitor); Iterator<ASTEntry> iterator = visitor.getIterator(); check((ASTEntry) iterator.next(), "C", 1, 1, 2); check((ASTEntry) iterator.next(), "met1", 5, 2, 2); check((ASTEntry) iterator.next(), "D", 1, 7, 8); check((ASTEntry) iterator.next(), "E", 1, 9, 12); assertFalse(iterator.hasNext()); } /** * @throws Exception * */ public void testMultiline() throws Exception { EasyASTIteratorVisitor visitor = new EasyASTIteratorVisitor(); String str = "" + "class C: \n" + " def d(self):\n" + " c = \\\n" + "''' \n" + "a \n" + "b \n" + "c \n" + "''' \n"; Tuple<SimpleNode, Throwable> objects = PyParser.reparseDocument(new PyParser.ParserInfo(new Document(str), IPythonNature.GRAMMAR_PYTHON_VERSION_2_4)); SimpleNode root = objects.o1; root.accept(visitor); Iterator<ASTEntry> iterator = visitor.getIterator(); check((ASTEntry) iterator.next(), "C", 1, 1, 8); check((ASTEntry) iterator.next(), "d", 5, 2, 8); assertFalse(iterator.hasNext()); } /** * @throws Exception * */ public void testMultiline2() throws Exception { EasyASTIteratorVisitor visitor = new EasyASTIteratorVisitor(); String str = "" + "class C: \n" + " def d(self): \n" + " c = ''' \n" + " \n" + "c \n" + "''' \n" + " \n" + "class E: \n" + " '''t1 \n" + " t2 \n" + " ''' \n"; Tuple<SimpleNode, Throwable> objects = PyParser.reparseDocument(new PyParser.ParserInfo(new Document(str), IPythonNature.GRAMMAR_PYTHON_VERSION_2_4)); SimpleNode root = objects.o1; root.accept(visitor); Iterator<ASTEntry> iterator = visitor.getIterator(); check((ASTEntry) iterator.next(), "C", 1, 1, 6); check((ASTEntry) iterator.next(), "d", 5, 2, 6); check((ASTEntry) iterator.next(), "E", 1, 8, 11); assertFalse(iterator.hasNext()); } /** * @throws Exception * */ public void testImports() throws Exception { EasyASTIteratorVisitor visitor = new EasyASTIteratorVisitor(); String str = "" + "import test.lib\n" + "from test.lib import test\n" + "from test.lib import *\n" + "from test.lib import test as alias\n" + ""; Tuple<SimpleNode, Throwable> objects = PyParser.reparseDocument(new PyParser.ParserInfo(new Document(str), IPythonNature.GRAMMAR_PYTHON_VERSION_2_4)); SimpleNode root = objects.o1; root.accept(visitor); Iterator<ASTEntry> iterator = visitor.getIterator(); check((ASTEntry) iterator.next(), "import test.lib", 8, 1, 1); check((ASTEntry) iterator.next(), "from test.lib import test", 6, 2, 2); check((ASTEntry) iterator.next(), "from test.lib import *", 6, 3, 3); check((ASTEntry) iterator.next(), "from test.lib import test as alias", 6, 4, 4); assertFalse(iterator.hasNext()); } public void testDecorator() throws Exception { EasyASTIteratorVisitor visitor = new EasyASTIteratorVisitor(); String str = "" + "class D:\n" + " @foo\n" + " def mmm(self):\n" + " pass\n" + "\n" + "\n"; Tuple<SimpleNode, Throwable> objects = PyParser.reparseDocument(new PyParser.ParserInfo(new Document(str), IPythonNature.GRAMMAR_PYTHON_VERSION_2_4)); if (objects.o2 != null) { throw new RuntimeException(objects.o2); } SimpleNode root = objects.o1; root.accept(visitor); Iterator<ASTEntry> iterator = visitor.getIterator(); check((ASTEntry) iterator.next(), "D", 1, 1, 4); check((ASTEntry) iterator.next(), "mmm", 5, 2, 4); assertFalse(iterator.hasNext()); } /** * @throws Exception * */ public void testAttributes() throws Exception { EasyASTIteratorVisitor visitor = new EasyASTIteratorVisitor(); String str = "" + "class C:\n" + " def met1(self):\n" + " self.attr1=1\n" + " self.attr2=2\n" + "\n" + " classAttr = 10\n" + "pass"; Tuple<SimpleNode, Throwable> objects = PyParser.reparseDocument(new PyParser.ParserInfo(new Document(str), IPythonNature.GRAMMAR_PYTHON_VERSION_2_4)); SimpleNode root = objects.o1; root.accept(visitor); Iterator<ASTEntry> iterator = visitor.getIterator(); check((ASTEntry) iterator.next(), "C", 1, 1, 6); check((ASTEntry) iterator.next(), "met1", 5, 2, 4); check((ASTEntry) iterator.next(), "attr1", 14, 3, 3); check((ASTEntry) iterator.next(), "attr2", 14, 4, 4); check((ASTEntry) iterator.next(), "classAttr", 5, 6, 6); assertFalse(iterator.hasNext()); iterator = visitor.getClassesIterator(); check((ASTEntry) iterator.next(), "C", 1, 1, 6); assertFalse(iterator.hasNext()); iterator = visitor.getClassesAndMethodsIterator(); check((ASTEntry) iterator.next(), "C", 1, 1, 6); check((ASTEntry) iterator.next(), "met1", 5, 2, 4); assertFalse(iterator.hasNext()); iterator = visitor.getIterator(ClassDef.class); check((ASTEntry) iterator.next(), "C", 1, 1, 6); assertFalse(iterator.hasNext()); iterator = visitor.getIterator(new Class[] { ClassDef.class, FunctionDef.class }); check((ASTEntry) iterator.next(), "C", 1, 1, 6); check((ASTEntry) iterator.next(), "met1", 5, 2, 4); assertFalse(iterator.hasNext()); } private void check(ASTEntry entry, String name, int col, int begLine, int endLine) { assertEquals(name, entry.getName()); assertEquals(col, entry.node.beginColumn); assertEquals(begLine, entry.node.beginLine); assertEquals(endLine, entry.endLine); } }