"""
test compile. derived from test_codeop
"""
import codeop
import unittest
from test import test_support
from test.test_support import run_unittest
def compile_(source,name="",symbol="single"):
return compile(source,name,symbol)
class CompileTests(unittest.TestCase):
def assertValid(self, str, symbol='single',values=None,value=None):
'''succeed iff str is a valid piece of code'''
code = compile_(str, "", symbol)
if values:
d = {}
exec code in d
self.assertEquals(d,values)
elif value is not None:
self.assertEquals(eval(code,self.eval_d),value)
else:
self.assert_(code)
def assertInvalid(self, str, symbol='single', is_syntax=1):
'''succeed iff str is the start of an invalid piece of code'''
try:
compile_(str,symbol=symbol)
self.fail("No exception thrown for invalid code")
except SyntaxError:
self.assert_(is_syntax)
except OverflowError:
self.assert_(not is_syntax)
def test_valid(self):
av = self.assertValid
# Failed for Jython 2.5a2. See http://bugs.jython.org/issue1116.
# For some reason this tests fails when run from test_codeops#test_valid
# when run from Jython (works in CPython).
av("@a.b.c\ndef f():\n pass")
# These tests pass on Jython, but fail on CPython. Will need to investigate
# to decide if we need to match CPython.
av("\n\n")
av("# a\n")
av("\n\na = 1\n\n",values={'a':1})
av("\n\nif 1: a=1\n\n",values={'a':1})
av("def x():\n pass\n ")
av("def x():\n pass\n ")
av("#a\n\n \na=3\n",values={'a':3})
av("def f():\n pass\n#foo")
# these tests fail in Jython in test_codeop.py because PythonPartial.g
# erroneously allows them through. Once that is fixed, these tests
# can be deleted.
def test_invalid(self):
ai = self.assertInvalid
ai("del 1")
ai("del ()")
ai("del (1,)")
ai("del [1]")
ai("del '1'")
ai("[i for i in range(10)] = (1, 2, 3)")
def test_main():
run_unittest(CompileTests)
if __name__ == "__main__":
test_main()