mirror of
https://github.com/python/cpython.git
synced 2025-07-29 06:05:00 +00:00

Printing to stdout, doesn't mean the data was actually written. It depends on the buffering, so we need to flush. This will hopefully really fix the buildbots getting killed due to no output on the slow bots.
130 lines
4.1 KiB
Python
130 lines
4.1 KiB
Python
import compiler
|
|
from compiler.ast import flatten
|
|
import os, sys, time, unittest
|
|
import test.test_support
|
|
from random import random
|
|
|
|
# How much time in seconds can pass before we print a 'Still working' message.
|
|
_PRINT_WORKING_MSG_INTERVAL = 5 * 60
|
|
|
|
class CompilerTest(unittest.TestCase):
|
|
|
|
def testCompileLibrary(self):
|
|
# A simple but large test. Compile all the code in the
|
|
# standard library and its test suite. This doesn't verify
|
|
# that any of the code is correct, merely the compiler is able
|
|
# to generate some kind of code for it.
|
|
|
|
next_time = time.time() + _PRINT_WORKING_MSG_INTERVAL
|
|
libdir = os.path.dirname(unittest.__file__)
|
|
testdir = os.path.dirname(test.test_support.__file__)
|
|
|
|
for dir in [libdir, testdir]:
|
|
for basename in os.listdir(dir):
|
|
# Print still working message since this test can be really slow
|
|
if next_time <= time.time():
|
|
next_time = time.time() + _PRINT_WORKING_MSG_INTERVAL
|
|
print >>sys.__stdout__, \
|
|
' testCompileLibrary still working, be patient...'
|
|
sys.__stdout__.flush()
|
|
|
|
if not basename.endswith(".py"):
|
|
continue
|
|
if not TEST_ALL and random() < 0.98:
|
|
continue
|
|
path = os.path.join(dir, basename)
|
|
if test.test_support.verbose:
|
|
print "compiling", path
|
|
f = open(path, "U")
|
|
buf = f.read()
|
|
f.close()
|
|
if "badsyntax" in basename or "bad_coding" in basename:
|
|
self.assertRaises(SyntaxError, compiler.compile,
|
|
buf, basename, "exec")
|
|
else:
|
|
try:
|
|
compiler.compile(buf, basename, "exec")
|
|
except Exception, e:
|
|
args = list(e.args)
|
|
args[0] += "[in file %s]" % basename
|
|
e.args = tuple(args)
|
|
raise
|
|
|
|
def testNewClassSyntax(self):
|
|
compiler.compile("class foo():pass\n\n","<string>","exec")
|
|
|
|
def testYieldExpr(self):
|
|
compiler.compile("def g(): yield\n\n", "<string>", "exec")
|
|
|
|
def testLineNo(self):
|
|
# Test that all nodes except Module have a correct lineno attribute.
|
|
filename = __file__
|
|
if filename.endswith(".pyc") or filename.endswith(".pyo"):
|
|
filename = filename[:-1]
|
|
tree = compiler.parseFile(filename)
|
|
self.check_lineno(tree)
|
|
|
|
def check_lineno(self, node):
|
|
try:
|
|
self._check_lineno(node)
|
|
except AssertionError:
|
|
print node.__class__, node.lineno
|
|
raise
|
|
|
|
def _check_lineno(self, node):
|
|
if not node.__class__ in NOLINENO:
|
|
self.assert_(isinstance(node.lineno, int),
|
|
"lineno=%s on %s" % (node.lineno, node.__class__))
|
|
self.assert_(node.lineno > 0,
|
|
"lineno=%s on %s" % (node.lineno, node.__class__))
|
|
for child in node.getChildNodes():
|
|
self.check_lineno(child)
|
|
|
|
def testFlatten(self):
|
|
self.assertEquals(flatten([1, [2]]), [1, 2])
|
|
self.assertEquals(flatten((1, (2,))), [1, 2])
|
|
|
|
NOLINENO = (compiler.ast.Module, compiler.ast.Stmt, compiler.ast.Discard)
|
|
|
|
###############################################################################
|
|
# code below is just used to trigger some possible errors, for the benefit of
|
|
# testLineNo
|
|
###############################################################################
|
|
|
|
class Toto:
|
|
"""docstring"""
|
|
pass
|
|
|
|
a, b = 2, 3
|
|
[c, d] = 5, 6
|
|
l = [(x, y) for x, y in zip(range(5), range(5,10))]
|
|
l[0]
|
|
l[3:4]
|
|
if l:
|
|
pass
|
|
else:
|
|
a, b = b, a
|
|
|
|
try:
|
|
print yo
|
|
except:
|
|
yo = 3
|
|
else:
|
|
yo += 3
|
|
|
|
try:
|
|
a += b
|
|
finally:
|
|
b = 0
|
|
|
|
from math import *
|
|
|
|
###############################################################################
|
|
|
|
def test_main():
|
|
global TEST_ALL
|
|
TEST_ALL = test.test_support.is_resource_enabled("compiler")
|
|
test.test_support.run_unittest(CompilerTest)
|
|
|
|
if __name__ == "__main__":
|
|
test_main()
|