mirror of
https://github.com/python/cpython.git
synced 2025-08-03 16:39:00 +00:00
Merged revisions 63829-63831,63858,63865,63879,63882,63948,63970-63972,63976,63989,64014-64015,64021-64022,64063-64065,64067 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk ........ r63829 | mark.summerfield | 2008-05-31 15:05:34 +0200 (Sat, 31 May 2008) | 4 lines Added a note to [] that special forms & special chars lose their meaning and backrefs can't be used inside [] ........ r63830 | georg.brandl | 2008-05-31 16:40:09 +0200 (Sat, 31 May 2008) | 2 lines #3010: clarification about stdin/use_rawinput. ........ r63831 | georg.brandl | 2008-05-31 16:45:55 +0200 (Sat, 31 May 2008) | 2 lines #3005: add explaining sentence to easydialogs docs. ........ r63858 | georg.brandl | 2008-06-01 18:41:31 +0200 (Sun, 01 Jun 2008) | 2 lines Add plain text make target. ........ r63865 | georg.brandl | 2008-06-01 21:24:36 +0200 (Sun, 01 Jun 2008) | 2 lines Spaces vs. tabs. ........ r63879 | gregory.p.smith | 2008-06-02 00:57:47 +0200 (Mon, 02 Jun 2008) | 3 lines Make the _H #define's match the header file names. Fix comments to mention the correct type names. ........ r63882 | gregory.p.smith | 2008-06-02 01:48:47 +0200 (Mon, 02 Jun 2008) | 3 lines Adds a Thread.getIdent() method to provide the _get_ident() value for any given threading.Thread object. feature request issue 2871. ........ r63948 | alexandre.vassalotti | 2008-06-04 22:41:44 +0200 (Wed, 04 Jun 2008) | 2 lines Fixed complex.__getnewargs__() to not emit another complex object. ........ r63970 | andrew.kuchling | 2008-06-06 01:33:54 +0200 (Fri, 06 Jun 2008) | 1 line Document 'utc' parameter ........ r63971 | andrew.kuchling | 2008-06-06 01:35:31 +0200 (Fri, 06 Jun 2008) | 1 line Add various items ........ r63972 | andrew.kuchling | 2008-06-06 01:35:48 +0200 (Fri, 06 Jun 2008) | 1 line Grammar fix ........ r63976 | georg.brandl | 2008-06-06 09:34:50 +0200 (Fri, 06 Jun 2008) | 2 lines Markup fix. ........ r63989 | thomas.heller | 2008-06-06 20:42:11 +0200 (Fri, 06 Jun 2008) | 2 lines Add a reminder for the maintainer of whatsnew. ........ r64014 | georg.brandl | 2008-06-07 17:59:10 +0200 (Sat, 07 Jun 2008) | 3 lines Factor out docstring dedenting from inspect.getdoc() into inspect.cleandoc() to ease standalone use of the algorithm. ........ r64015 | georg.brandl | 2008-06-07 18:04:01 +0200 (Sat, 07 Jun 2008) | 2 lines Revert unwanted changes. ........ r64021 | georg.brandl | 2008-06-07 20:16:12 +0200 (Sat, 07 Jun 2008) | 2 lines X-ref to numbers module. ........ r64022 | georg.brandl | 2008-06-07 20:17:37 +0200 (Sat, 07 Jun 2008) | 3 lines Document the "st" API, to avoid confusion with the "new" AST. Add a note about using the new AST module. ........ r64063 | martin.v.loewis | 2008-06-10 07:03:35 +0200 (Tue, 10 Jun 2008) | 2 lines Add Gregor Lingl. ........ r64064 | georg.brandl | 2008-06-10 09:45:28 +0200 (Tue, 10 Jun 2008) | 2 lines Add the "ast" module, containing helpers to ease use of the "_ast" classes. ........ r64065 | raymond.hettinger | 2008-06-10 09:57:15 +0200 (Tue, 10 Jun 2008) | 1 line Add Arnaud for his efforts on multi-arg set operations. ........ r64067 | georg.brandl | 2008-06-10 14:46:39 +0200 (Tue, 10 Jun 2008) | 2 lines #2536: fix itertools.permutations and itertools.combinations docstrings. ........
This commit is contained in:
parent
0312494665
commit
0c77a82c3d
27 changed files with 931 additions and 212 deletions
|
@ -1,6 +1,6 @@
|
|||
import sys, unittest
|
||||
from test import support
|
||||
import _ast
|
||||
import ast
|
||||
|
||||
def to_tuple(t):
|
||||
if t is None or isinstance(t, (str, int, complex)):
|
||||
|
@ -117,9 +117,9 @@ eval_tests = [
|
|||
class AST_Tests(unittest.TestCase):
|
||||
|
||||
def _assert_order(self, ast_node, parent_pos):
|
||||
if not isinstance(ast_node, _ast.AST) or ast_node._fields is None:
|
||||
if not isinstance(ast_node, ast.AST) or ast_node._fields is None:
|
||||
return
|
||||
if isinstance(ast_node, (_ast.expr, _ast.stmt, _ast.excepthandler)):
|
||||
if isinstance(ast_node, (ast.expr, ast.stmt, ast.excepthandler)):
|
||||
node_pos = (ast_node.lineno, ast_node.col_offset)
|
||||
self.assert_(node_pos >= parent_pos)
|
||||
parent_pos = (ast_node.lineno, ast_node.col_offset)
|
||||
|
@ -136,29 +136,29 @@ class AST_Tests(unittest.TestCase):
|
|||
(single_tests, single_results, "single"),
|
||||
(eval_tests, eval_results, "eval")):
|
||||
for i, o in zip(input, output):
|
||||
ast_tree = compile(i, "?", kind, _ast.PyCF_ONLY_AST)
|
||||
ast_tree = compile(i, "?", kind, ast.PyCF_ONLY_AST)
|
||||
self.assertEquals(to_tuple(ast_tree), o)
|
||||
self._assert_order(ast_tree, (0, 0))
|
||||
|
||||
def test_nodeclasses(self):
|
||||
x = _ast.BinOp(1, 2, 3, lineno=0)
|
||||
x = ast.BinOp(1, 2, 3, lineno=0)
|
||||
self.assertEquals(x.left, 1)
|
||||
self.assertEquals(x.op, 2)
|
||||
self.assertEquals(x.right, 3)
|
||||
self.assertEquals(x.lineno, 0)
|
||||
|
||||
# node raises exception when not given enough arguments
|
||||
self.assertRaises(TypeError, _ast.BinOp, 1, 2)
|
||||
self.assertRaises(TypeError, ast.BinOp, 1, 2)
|
||||
|
||||
# can set attributes through kwargs too
|
||||
x = _ast.BinOp(left=1, op=2, right=3, lineno=0)
|
||||
x = ast.BinOp(left=1, op=2, right=3, lineno=0)
|
||||
self.assertEquals(x.left, 1)
|
||||
self.assertEquals(x.op, 2)
|
||||
self.assertEquals(x.right, 3)
|
||||
self.assertEquals(x.lineno, 0)
|
||||
|
||||
# this used to fail because Sub._fields was None
|
||||
x = _ast.Sub()
|
||||
x = ast.Sub()
|
||||
|
||||
def test_pickling(self):
|
||||
import pickle
|
||||
|
@ -175,8 +175,99 @@ class AST_Tests(unittest.TestCase):
|
|||
ast2 = mod.loads(mod.dumps(ast, protocol))
|
||||
self.assertEquals(to_tuple(ast2), to_tuple(ast))
|
||||
|
||||
|
||||
class ASTHelpers_Test(unittest.TestCase):
|
||||
|
||||
def test_parse(self):
|
||||
a = ast.parse('foo(1 + 1)')
|
||||
b = compile('foo(1 + 1)', '<unknown>', 'exec', ast.PyCF_ONLY_AST)
|
||||
self.assertEqual(ast.dump(a), ast.dump(b))
|
||||
|
||||
def test_dump(self):
|
||||
node = ast.parse('spam(eggs, "and cheese")')
|
||||
self.assertEqual(ast.dump(node),
|
||||
"Module(body=[Expr(value=Call(func=Name(id='spam', ctx=Load()), "
|
||||
"args=[Name(id='eggs', ctx=Load()), Str(s='and cheese')], "
|
||||
"keywords=[], starargs=None, kwargs=None))])"
|
||||
)
|
||||
self.assertEqual(ast.dump(node, annotate_fields=False),
|
||||
"Module([Expr(Call(Name('spam', Load()), [Name('eggs', Load()), "
|
||||
"Str('and cheese')], [], None, None))])"
|
||||
)
|
||||
self.assertEqual(ast.dump(node, include_attributes=True),
|
||||
"Module(body=[Expr(value=Call(func=Name(id='spam', ctx=Load(), "
|
||||
"lineno=1, col_offset=0), args=[Name(id='eggs', ctx=Load(), "
|
||||
"lineno=1, col_offset=5), Str(s='and cheese', lineno=1, "
|
||||
"col_offset=11)], keywords=[], starargs=None, kwargs=None, "
|
||||
"lineno=1, col_offset=0), lineno=1, col_offset=0)])"
|
||||
)
|
||||
|
||||
def test_copy_location(self):
|
||||
src = ast.parse('1 + 1', mode='eval')
|
||||
src.body.right = ast.copy_location(ast.Num(2), src.body.right)
|
||||
self.assertEqual(ast.dump(src, include_attributes=True),
|
||||
'Expression(body=BinOp(left=Num(n=1, lineno=1, col_offset=0), '
|
||||
'op=Add(), right=Num(n=2, lineno=1, col_offset=4), lineno=1, '
|
||||
'col_offset=0))'
|
||||
)
|
||||
|
||||
def test_fix_missing_locations(self):
|
||||
src = ast.parse('write("spam")')
|
||||
src.body.append(ast.Expr(ast.Call(ast.Name('spam', ast.Load()),
|
||||
[ast.Str('eggs')], [], None, None)))
|
||||
self.assertEqual(src, ast.fix_missing_locations(src))
|
||||
self.assertEqual(ast.dump(src, include_attributes=True),
|
||||
"Module(body=[Expr(value=Call(func=Name(id='write', ctx=Load(), "
|
||||
"lineno=1, col_offset=0), args=[Str(s='spam', lineno=1, "
|
||||
"col_offset=6)], keywords=[], starargs=None, kwargs=None, "
|
||||
"lineno=1, col_offset=0), lineno=1, col_offset=0), "
|
||||
"Expr(value=Call(func=Name(id='spam', ctx=Load(), lineno=1, "
|
||||
"col_offset=0), args=[Str(s='eggs', lineno=1, col_offset=0)], "
|
||||
"keywords=[], starargs=None, kwargs=None, lineno=1, "
|
||||
"col_offset=0), lineno=1, col_offset=0)])"
|
||||
)
|
||||
|
||||
def test_increment_lineno(self):
|
||||
src = ast.parse('1 + 1', mode='eval')
|
||||
self.assertEqual(ast.increment_lineno(src, n=3), src)
|
||||
self.assertEqual(ast.dump(src, include_attributes=True),
|
||||
'Expression(body=BinOp(left=Num(n=1, lineno=4, col_offset=0), '
|
||||
'op=Add(), right=Num(n=1, lineno=4, col_offset=4), lineno=4, '
|
||||
'col_offset=0))'
|
||||
)
|
||||
|
||||
def test_iter_fields(self):
|
||||
node = ast.parse('foo()', mode='eval')
|
||||
d = dict(ast.iter_fields(node.body))
|
||||
self.assertEqual(d.pop('func').id, 'foo')
|
||||
self.assertEqual(d, {'keywords': [], 'kwargs': None,
|
||||
'args': [], 'starargs': None})
|
||||
|
||||
def test_iter_child_nodes(self):
|
||||
node = ast.parse("spam(23, 42, eggs='leek')", mode='eval')
|
||||
self.assertEqual(len(list(ast.iter_child_nodes(node.body))), 4)
|
||||
iterator = ast.iter_child_nodes(node.body)
|
||||
self.assertEqual(next(iterator).id, 'spam')
|
||||
self.assertEqual(next(iterator).n, 23)
|
||||
self.assertEqual(next(iterator).n, 42)
|
||||
self.assertEqual(ast.dump(next(iterator)),
|
||||
"keyword(arg='eggs', value=Str(s='leek'))"
|
||||
)
|
||||
|
||||
def test_get_docstring(self):
|
||||
node = ast.parse('def foo():\n """line one\n line two"""')
|
||||
self.assertEqual(ast.get_docstring(node.body[0]),
|
||||
'line one\nline two')
|
||||
|
||||
def test_literal_eval(self):
|
||||
self.assertEqual(ast.literal_eval('[1, 2, 3]'), [1, 2, 3])
|
||||
self.assertEqual(ast.literal_eval('{"foo": 42}'), {"foo": 42})
|
||||
self.assertEqual(ast.literal_eval('(True, False, None)'), (True, False, None))
|
||||
self.assertRaises(ValueError, ast.literal_eval, 'foo()')
|
||||
|
||||
|
||||
def test_main():
|
||||
support.run_unittest(AST_Tests)
|
||||
support.run_unittest(AST_Tests, ASTHelpers_Test)
|
||||
|
||||
def main():
|
||||
if __name__ != '__main__':
|
||||
|
|
|
@ -352,6 +352,14 @@ class ComplexTest(unittest.TestCase):
|
|||
except (OSError, IOError):
|
||||
pass
|
||||
|
||||
def test_getnewargs(self):
|
||||
self.assertEqual((1+2j).__getnewargs__(), (1.0, 2.0))
|
||||
self.assertEqual((1-2j).__getnewargs__(), (1.0, -2.0))
|
||||
self.assertEqual((2j).__getnewargs__(), (0.0, 2.0))
|
||||
self.assertEqual((-0j).__getnewargs__(), (0.0, -0.0))
|
||||
self.assertEqual(complex(0, INF).__getnewargs__(), (0.0, INF))
|
||||
self.assertEqual(complex(INF, 0).__getnewargs__(), (INF, 0.0))
|
||||
|
||||
if float.__getformat__("double").startswith("IEEE"):
|
||||
def test_plus_minus_0j(self):
|
||||
# test that -0j and 0j literals are not identified
|
||||
|
|
|
@ -195,6 +195,10 @@ class TestRetrievingSourceCode(GetSourceBase):
|
|||
self.assertEqual(inspect.getdoc(git.abuse),
|
||||
'Another\n\ndocstring\n\ncontaining\n\ntabs')
|
||||
|
||||
def test_cleandoc(self):
|
||||
self.assertEqual(inspect.cleandoc('An\n indented\n docstring.'),
|
||||
'An\nindented\ndocstring.')
|
||||
|
||||
def test_getcomments(self):
|
||||
self.assertEqual(inspect.getcomments(mod), '# line 1\n')
|
||||
self.assertEqual(inspect.getcomments(mod.StupidGit), '# line 20\n')
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
import test.support
|
||||
from test.support import verbose
|
||||
import random
|
||||
import re
|
||||
import sys
|
||||
import threading
|
||||
import _thread
|
||||
|
@ -71,6 +72,8 @@ class ThreadTests(unittest.TestCase):
|
|||
for i in range(NUMTASKS):
|
||||
t = TestThread("<thread %d>"%i, self, sema, mutex, numrunning)
|
||||
threads.append(t)
|
||||
self.failUnlessEqual(t.getIdent(), None)
|
||||
self.assert_(re.match('<TestThread\(.*, initial\)>', repr(t)))
|
||||
t.start()
|
||||
|
||||
if verbose:
|
||||
|
@ -78,6 +81,8 @@ class ThreadTests(unittest.TestCase):
|
|||
for t in threads:
|
||||
t.join(NUMTASKS)
|
||||
self.assert_(not t.isAlive())
|
||||
self.failIfEqual(t.getIdent(), 0)
|
||||
self.assert_(re.match('<TestThread\(.*, \w+ -?\d+\)>', repr(t)))
|
||||
if verbose:
|
||||
print('all tasks done')
|
||||
self.assertEqual(numrunning.get(), 0)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue