/** * 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. */ package org.python.pydev.parser; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import org.eclipse.jface.text.BadLocationException; import org.python.pydev.core.IPythonNature; import org.python.pydev.core.TestDependent; import org.python.pydev.parser.jython.SimpleNode; import org.python.pydev.parser.jython.ast.Assign; import org.python.pydev.parser.jython.ast.ClassDef; import org.python.pydev.parser.jython.ast.Dict; import org.python.pydev.parser.jython.ast.DictComp; import org.python.pydev.parser.jython.ast.Module; import org.python.pydev.parser.jython.ast.Pass; import org.python.pydev.parser.jython.ast.Set; import org.python.pydev.parser.jython.ast.SetComp; import org.python.pydev.parser.visitors.NodeUtils; import com.aptana.shared_core.io.FileUtils; /** * References: * http://docs.python.org/whatsnew/2.7.html * http://docs.python.org/2.7/reference/grammar.html?highlight=set%20grammar * http://docs.python.org/2.6/reference/grammar.html?highlight=set%20grammar */ public class PyParser27Test extends PyParserTestBase { public static void main(String[] args) { try { PyParser27Test test = new PyParser27Test(); test.setUp(); test.testBom(); test.tearDown(); System.out.println("Finished"); junit.textui.TestRunner.run(PyParser27Test.class); } catch (Exception e) { e.printStackTrace(); } } @Override protected void setUp() throws Exception { super.setUp(); setDefaultVersion(IPythonNature.GRAMMAR_PYTHON_VERSION_2_7); } public void testWith() { String str = "def m1():\n" + " with a, b, c:\n" + " print a, b, c\n" + "\n" + ""; parseLegalDocStr(str); } public void testExceptAs() { String str = "" + "try:\n" + " a = 10\n" + "except RuntimeError as x:\n" + " print x\n" + ""; parseLegalDocStr(str); } public void testBinaryObj() { String str = "" + "b'foo'\n" + ""; parseLegalDocStr(str); } public void testOctal() { String str = "" + "0o700\n" + "0700\n" + ""; assertEquals( "Module[body=[Expr[value=Num[n=448, type=Int, num=0o700]], Expr[value=Num[n=448, type=Int, num=0700]]]]", parseLegalDocStr(str).toString()); } public void testFunctionCall() { String str = "" + "Call(1,2,3, *(4,5,6), keyword=13, **kwargs)\n" + ""; parseLegalDocStr(str); } public void testFunctionCallWithListComp() { String str = "" + "any(cls.__subclasscheck__(c) for c in [subclass, subtype])\n" + ""; parseLegalDocStr(str); } public void testClassDecorator() { String s = "" + "@classdec\n" + "@classdec2\n" + "class A:\n" + " pass\n" + ""; SimpleNode ast = parseLegalDocStr(s); Module m = (Module) ast; ClassDef d = (ClassDef) m.body[0]; assertEquals(2, d.decs.length); assertEquals("classdec", NodeUtils.getRepresentationString(d.decs[0].func)); assertEquals("classdec2", NodeUtils.getRepresentationString(d.decs[1].func)); } public void testCall() { String s = "fubar(*list, x=4)"; parseLegalDocStr(s); } public void testCall2() { String s = "fubar(1, *list, x=4)"; parseLegalDocStr(s); } public void testFuturePrintFunction() { String s = "" + "from __future__ import print_function\n" + "print('test', 'print function', sep=' - ')\n" + ""; parseLegalDocStr(s); } public void testBinNumber() { String s = "" + "0b00010\n" + "0B00010\n" + "0b00010L\n" + "0B00010l\n" + ""; parseLegalDocStr(s); } public void testSet() { String s = "" + "mutable_set = {1,2,3,4,5}\n" + ""; SimpleNode ast = parseLegalDocStr(s); Module m = (Module) ast; Assign assign = (Assign) m.body[0]; Set set = (Set) assign.value; assertEquals( "Set[elts=[Num[n=1, type=Int, num=1], Num[n=2, type=Int, num=2], Num[n=3, type=Int, num=3], Num[n=4, type=Int, num=4], Num[n=5, type=Int, num=5]]]", set.toString()); } public void testSetComp() { String s = "" + "mutable_set = {x for x in xrange(10)}\n" + ""; SimpleNode ast = parseLegalDocStr(s); Module m = (Module) ast; Assign assign = (Assign) m.body[0]; assertTrue(assign.value instanceof SetComp); } public void testDictKept() { String s = "" + "d = {}\n" + ""; SimpleNode ast = parseLegalDocStr(s); Module m = (Module) ast; Assign assign = (Assign) m.body[0]; assertTrue(assign.value instanceof Dict); } public void testDictComp() { String s = "" + "d = {i: i*2 for i in range(3)}\n" + ""; SimpleNode ast = parseLegalDocStr(s); Module m = (Module) ast; Assign assign = (Assign) m.body[0]; assertTrue(assign.value instanceof DictComp); } public void testBom() throws BadLocationException, IOException { String base = "#comment\npass\n"; String s = FileUtils.BOM_UTF8 + base; File file = new File(TestDependent.TEST_PYDEV_PARSER_PLUGIN_LOC + "/tests/org/python/pydev/parser/generated_data_test_utf8_with_bom.py"); FileOutputStream out = new FileOutputStream(file); out.write(new String(FileUtils.BOM_UTF8).getBytes()); out.write(base.getBytes()); out.close(); s = FileUtils.getFileContents(file); assertTrue(s.endsWith(base)); assertTrue(s.startsWith(FileUtils.BOM_UTF8)); assertEquals("utf-8", FileUtils.getPythonFileEncoding(file)); SimpleNode ast = parseLegalDocStr(s); Module m = (Module) ast; Pass p = (Pass) m.body[0]; assertTrue(s.startsWith(FileUtils.BOM_UTF8)); ast = parseLegalDocStr(s); m = (Module) ast; p = (Pass) m.body[0]; } @Override public void testEmpty() throws Throwable { String s = ""; parseLegalDocStr(s); } }