package com.python.pydev.refactoring.wizards.rename; import org.eclipse.jface.text.Document; import org.python.pydev.core.IPythonNature; import org.python.pydev.editor.codecompletion.revisited.modules.AbstractModule; import org.python.pydev.editor.codecompletion.revisited.modules.SourceModule; import org.python.pydev.parser.PyParser; import org.python.pydev.parser.PythonNatureStub; import org.python.pydev.parser.jython.SimpleNode; import org.python.pydev.shared_core.parsing.BaseParser.ParseOutput; import junit.framework.TestCase; public class MatchImportsVisitorTest extends TestCase { public void testMatchImports() throws Exception { Document doc = new Document("" + "from a.b.c.d import e\n" //rename a.b.c + "from a.b.c import d\n" //rename a.b.c + "from a.b import c\n" //rename a.b.c + "from a.b import g, c, f\n" //rename a.b.c (but not g nor f) + "from a import b\n" + "from a import *\n" + "from a.b.c import *\n" //rename a.b.c with wild import + "from a.b.c.d import *\n" //rename a.b.c with wild import + ""); IPythonNature nature = new PythonNatureStub(); ParseOutput obj = PyParser.reparseDocument(new PyParser.ParserInfo(doc, nature)); SourceModule module = (SourceModule) AbstractModule.createModule((SimpleNode) obj.ast, null, "z", null); MatchImportsVisitor visitor = new MatchImportsVisitor(nature, "a.b.c", module, null); module.getAst().accept(visitor); assertEquals(visitor.importFromsMatchingOnAliasPart.size(), 2); assertEquals(visitor.importFromsMatchingOnModulePart.size(), 4); assertEquals(visitor.occurrences.size(), 6); } public void testMatchImports2() throws Exception { Document doc = new Document("" + "import a.b.c.d\n" //rename a.b.c + "import a.b.c\n" //rename a.b.c + "import a.b\n" + ""); IPythonNature nature = new PythonNatureStub(); ParseOutput obj = PyParser.reparseDocument(new PyParser.ParserInfo(doc, nature)); SourceModule module = (SourceModule) AbstractModule.createModule((SimpleNode) obj.ast, null, "z", null); MatchImportsVisitor visitor = new MatchImportsVisitor(nature, "a.b.c", module, null); module.getAst().accept(visitor); assertEquals(visitor.importsMatchingOnAliasPart.size(), 2); assertEquals(visitor.occurrences.size(), 2); } public void testMatchRelativeImports() throws Exception { //Note: on Python 2.x, we should get the from b import c unless from __future__ import absolute_import is used. //In Python 3.x, we'll only get it when actually marked as a relative import (with leading dots). Document doc = new Document("" + "from __future__ import absolute_import\n" + "from b import c\n" + "from .b import c\n" //rename a.b.c + "from ..a.b import c\n" //rename a.b.c + ""); IPythonNature nature = new PythonNatureStub() { @Override public int getGrammarVersion() { return IPythonNature.GRAMMAR_PYTHON_VERSION_2_7; } }; ParseOutput obj = PyParser.reparseDocument(new PyParser.ParserInfo(doc, nature)); SourceModule module = (SourceModule) AbstractModule.createModule((SimpleNode) obj.ast, null, "a.g", null); MatchImportsVisitor visitor = new MatchImportsVisitor(nature, "a.b.c", module, null); module.getAst().accept(visitor); assertEquals(2, visitor.importFromsMatchingOnAliasPart.size()); assertEquals(2, visitor.occurrences.size()); } }