package org.python.pydev.refactoring.tests.ast.factory; import org.python.pydev.core.IGrammarVersionProvider; import org.python.pydev.core.MisconfigurationException; import org.python.pydev.parser.PyParserTestBase; import org.python.pydev.parser.jython.SimpleNode; import org.python.pydev.parser.jython.ast.Attribute; import org.python.pydev.parser.jython.ast.FunctionDef; import org.python.pydev.parser.jython.ast.Module; import org.python.pydev.parser.jython.ast.Name; import org.python.pydev.parser.jython.ast.factory.AdapterPrefs; import org.python.pydev.parser.jython.ast.factory.PyAstFactory; import org.python.pydev.parser.prettyprinterv2.MakeAstValidForPrettyPrintingVisitor; import org.python.pydev.parser.prettyprinterv2.PrettyPrinterPrefsV2; import org.python.pydev.parser.prettyprinterv2.PrettyPrinterV2; public class PyAstFactoryTest extends PyParserTestBase { public static void main(String[] args) { try { PyAstFactoryTest test = new PyAstFactoryTest(); test.setUp(); test.testCreateOverrideBody5(); test.tearDown(); System.out.println("Finished"); junit.textui.TestRunner.run(PyAstFactoryTest.class); } catch (Throwable e) { e.printStackTrace(); } } PyAstFactory astFactory; @Override protected void setUp() throws Exception { super.setUp(); astFactory = new PyAstFactory(new AdapterPrefs("\n", new IGrammarVersionProvider() { public int getGrammarVersion() throws MisconfigurationException { return IGrammarVersionProvider.GRAMMAR_PYTHON_VERSION_2_7; } })); } public void testPyAstFactory() throws Exception { FunctionDef functionDef = astFactory.createFunctionDef("MyMethod"); String expected = "" + "def MyMethod():\n" + " pass\n" + ""; checkExpected(functionDef, expected); } public void testCreateSetter() throws Exception { String expected = "" + "def setFoo(self,value):\n" + " self.__foo = value\n" + ""; checkExpected(astFactory.createSetterFunctionDef("setFoo", "foo"), expected); } public void testCreateAttribute() throws Exception { Attribute attribute = astFactory.createAttribute("a.b.c.d.e"); checkExpected(attribute, "a.b.c.d.e\n"); } public void testCreateConstructor() throws Exception { String expected = "" + "def __init__(self,arg,attribute):\n" + " A.__init__(self,arg)\n" + " self.attribute = attribute\n" + ""; FunctionDef functionDef = astFactory.createFunctionDef("__init__"); functionDef.args = astFactory.createArguments(true, "arg", "attribute"); astFactory.setBody(functionDef, astFactory.createCall("A.__init__", "self", "arg"), astFactory.createAssign( astFactory.createAttribute("self.attribute"), new Name("attribute", Name.Load, false))); checkExpected(functionDef, expected); } public void testCreateOverrideBody() throws Exception { String expected = "" + "def test(self,arg,attribute):\n" + " Parent.test(self,arg,attribute)\n" + ""; FunctionDef functionDef = astFactory.createFunctionDef("test"); functionDef.args = astFactory.createArguments(true, "arg", "attribute"); astFactory.setBody(functionDef, astFactory.createOverrideBody(functionDef, "Parent", "Current")); checkExpected(functionDef, expected); } public void testCreateOverrideBody2() throws Exception { String expected = "" + "def test(arg,attribute,*args,**kwargs):\n" + " return Parent.test(arg,attribute,*args,**kwargs)\n" + ""; Module module = (Module) parseLegalDocStr(expected); FunctionDef functionDef = (FunctionDef) module.body[0]; FunctionDef createdFunctionDef = astFactory.createFunctionDef("test"); createdFunctionDef.args = functionDef.args.createCopy(); astFactory.setBody(createdFunctionDef, astFactory.createOverrideBody(functionDef, "Parent", "Current")); checkExpected(createdFunctionDef, expected); } public void testCreateOverrideBody3() throws Exception { String base = "" + "def test(arg,attribute,a=10,b=20,*args,**kwargs):\n" + " pass\n" + ""; String expected = "" + "def test(arg,attribute,a=10,b=20,*args,**kwargs):\n" + " Parent.test(arg,attribute,a=a,b=b,*args,**kwargs)\n" + ""; Module module = (Module) parseLegalDocStr(base); FunctionDef functionDef = (FunctionDef) module.body[0]; FunctionDef createdFunctionDef = astFactory.createFunctionDef("test"); createdFunctionDef.args = functionDef.args.createCopy(); astFactory.setBody(createdFunctionDef, astFactory.createOverrideBody(functionDef, "Parent", "Current")); checkExpected(createdFunctionDef, expected); } public void testCreateOverrideBody4() throws Exception { String base = "" + "@classmethod\n" + "def test(cls):\n" + " pass\n" + ""; String expected = "" + "@classmethod\n" + "def test(cls):\n" + " super(Current,cls).test()\n" + ""; // Module m = (Module) parseLegalDocStr(expected); // FunctionDef func = (FunctionDef) m.body[0]; // System.out.println(func.body[0]); Module module = (Module) parseLegalDocStr(base); FunctionDef functionDef = (FunctionDef) module.body[0]; FunctionDef createdFunctionDef = functionDef.createCopy(); astFactory.setBody(createdFunctionDef, astFactory.createOverrideBody(functionDef, "Parent", "Current")); checkExpected(createdFunctionDef, expected); } public void testCreateOverrideBody5() throws Exception { String base = "" + "@classmethod\n" + "def test(cls):\n" + " #comment\n" + " pass\n" + ""; String expected = "" + "@classmethod\n" + "def test(cls):\n" + " super(Current,cls).test()\n" + ""; Module module = (Module) parseLegalDocStr(base); FunctionDef functionDef = (FunctionDef) module.body[0]; FunctionDef createdFunctionDef = functionDef.createCopy(false); astFactory.setBody(createdFunctionDef, astFactory.createOverrideBody(functionDef, "Parent", "Current")); checkExpected(createdFunctionDef, expected); } private void checkExpected(SimpleNode functionDef, String expected) throws Exception { MakeAstValidForPrettyPrintingVisitor.makeValid(functionDef); PrettyPrinterV2 printer = new PrettyPrinterV2(new PrettyPrinterPrefsV2("\n", " ", new IGrammarVersionProvider() { public int getGrammarVersion() throws MisconfigurationException { return IGrammarVersionProvider.GRAMMAR_PYTHON_VERSION_2_7; } })); String result = printer.print(functionDef); System.out.println("Result: >>" + result + "<<"); assertEquals(expected, result); } }