mirror of
https://github.com/python/cpython.git
synced 2025-10-13 18:33:34 +00:00
Convert the parser module test to use PyUnit.
This commit is contained in:
parent
194bfb2805
commit
58422e5820
2 changed files with 197 additions and 285 deletions
|
@ -1,92 +0,0 @@
|
||||||
test_parser
|
|
||||||
Expressions:
|
|
||||||
expr: foo(1)
|
|
||||||
expr: [1, 2, 3]
|
|
||||||
expr: [x**3 for x in range(20)]
|
|
||||||
expr: [x**3 for x in range(20) if x % 3]
|
|
||||||
expr: foo(*args)
|
|
||||||
expr: foo(*args, **kw)
|
|
||||||
expr: foo(**kw)
|
|
||||||
expr: foo(key=value)
|
|
||||||
expr: foo(key=value, *args)
|
|
||||||
expr: foo(key=value, *args, **kw)
|
|
||||||
expr: foo(key=value, **kw)
|
|
||||||
expr: foo(a, b, c, *args)
|
|
||||||
expr: foo(a, b, c, *args, **kw)
|
|
||||||
expr: foo(a, b, c, **kw)
|
|
||||||
expr: foo + bar
|
|
||||||
expr: lambda: 0
|
|
||||||
expr: lambda x: 0
|
|
||||||
expr: lambda *y: 0
|
|
||||||
expr: lambda *y, **z: 0
|
|
||||||
expr: lambda **z: 0
|
|
||||||
expr: lambda x, y: 0
|
|
||||||
expr: lambda foo=bar: 0
|
|
||||||
expr: lambda foo=bar, spaz=nifty+spit: 0
|
|
||||||
expr: lambda foo=bar, **z: 0
|
|
||||||
expr: lambda foo=bar, blaz=blat+2, **z: 0
|
|
||||||
expr: lambda foo=bar, blaz=blat+2, *y, **z: 0
|
|
||||||
expr: lambda x, *y, **z: 0
|
|
||||||
|
|
||||||
Statements:
|
|
||||||
suite: print
|
|
||||||
suite: print 1
|
|
||||||
suite: print 1,
|
|
||||||
suite: print >>fp
|
|
||||||
suite: print >>fp, 1
|
|
||||||
suite: print >>fp, 1,
|
|
||||||
suite: a
|
|
||||||
suite: a = b
|
|
||||||
suite: a = b = c = d = e
|
|
||||||
suite: a += b
|
|
||||||
suite: a -= b
|
|
||||||
suite: a *= b
|
|
||||||
suite: a /= b
|
|
||||||
suite: a %= b
|
|
||||||
suite: a &= b
|
|
||||||
suite: a |= b
|
|
||||||
suite: a ^= b
|
|
||||||
suite: a <<= b
|
|
||||||
suite: a >>= b
|
|
||||||
suite: a **= b
|
|
||||||
suite: def f(): pass
|
|
||||||
suite: def f(*args): pass
|
|
||||||
suite: def f(*args, **kw): pass
|
|
||||||
suite: def f(**kw): pass
|
|
||||||
suite: def f(foo=bar): pass
|
|
||||||
suite: def f(foo=bar, *args): pass
|
|
||||||
suite: def f(foo=bar, *args, **kw): pass
|
|
||||||
suite: def f(foo=bar, **kw): pass
|
|
||||||
suite: def f(a, b): pass
|
|
||||||
suite: def f(a, b, *args): pass
|
|
||||||
suite: def f(a, b, *args, **kw): pass
|
|
||||||
suite: def f(a, b, **kw): pass
|
|
||||||
suite: def f(a, b, foo=bar): pass
|
|
||||||
suite: def f(a, b, foo=bar, *args): pass
|
|
||||||
suite: def f(a, b, foo=bar, *args, **kw): pass
|
|
||||||
suite: def f(a, b, foo=bar, **kw): pass
|
|
||||||
suite: from sys.path import *
|
|
||||||
suite: from sys.path import dirname
|
|
||||||
suite: from sys.path import dirname as my_dirname
|
|
||||||
suite: from sys.path import dirname, basename
|
|
||||||
suite: from sys.path import dirname as my_dirname, basename
|
|
||||||
suite: from sys.path import dirname, basename as my_basename
|
|
||||||
suite: import sys
|
|
||||||
suite: import sys as system
|
|
||||||
suite: import sys, math
|
|
||||||
suite: import sys as system, math
|
|
||||||
suite: import sys, math as my_math
|
|
||||||
|
|
||||||
Invalid parse trees:
|
|
||||||
|
|
||||||
<junk>
|
|
||||||
caught expected exception for invalid tree
|
|
||||||
|
|
||||||
print >>fp,
|
|
||||||
caught expected exception for invalid tree
|
|
||||||
|
|
||||||
a,,c
|
|
||||||
caught expected exception for invalid tree
|
|
||||||
|
|
||||||
a $= b
|
|
||||||
caught expected exception for invalid tree
|
|
|
@ -1,9 +1,6 @@
|
||||||
import os.path
|
|
||||||
import parser
|
import parser
|
||||||
import pprint
|
import test_support
|
||||||
import sys
|
import unittest
|
||||||
|
|
||||||
from test_support import TestFailed
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# First, we test that we can generate trees from valid source fragments,
|
# First, we test that we can generate trees from valid source fragments,
|
||||||
|
@ -11,212 +8,219 @@ from test_support import TestFailed
|
||||||
# of the parser module.
|
# of the parser module.
|
||||||
#
|
#
|
||||||
|
|
||||||
def roundtrip(f, s):
|
class RoundtripLegalSyntaxTestCase(unittest.TestCase):
|
||||||
st1 = f(s)
|
def roundtrip(self, f, s):
|
||||||
t = st1.totuple()
|
st1 = f(s)
|
||||||
try:
|
t = st1.totuple()
|
||||||
st2 = parser.sequence2ast(t)
|
try:
|
||||||
except parser.ParserError:
|
st2 = parser.sequence2ast(t)
|
||||||
raise TestFailed, s
|
except parser.ParserError:
|
||||||
|
self.fail("could not roundtrip %r" % s)
|
||||||
|
|
||||||
def roundtrip_fromfile(filename):
|
self.assertEquals(t, st2.totuple(),
|
||||||
roundtrip(parser.suite, open(filename).read())
|
"could not re-generate syntax tree")
|
||||||
|
|
||||||
def test_expr(s):
|
def check_expr(self, s):
|
||||||
print "expr:", s
|
self.roundtrip(parser.expr, s)
|
||||||
roundtrip(parser.expr, s)
|
|
||||||
|
|
||||||
def test_suite(s):
|
def check_suite(self, s):
|
||||||
print "suite:", s
|
self.roundtrip(parser.suite, s)
|
||||||
roundtrip(parser.suite, s)
|
|
||||||
|
|
||||||
|
def test_expressions(self):
|
||||||
|
self.check_expr("foo(1)")
|
||||||
|
self.check_expr("[1, 2, 3]")
|
||||||
|
self.check_expr("[x**3 for x in range(20)]")
|
||||||
|
self.check_expr("[x**3 for x in range(20) if x % 3]")
|
||||||
|
self.check_expr("foo(*args)")
|
||||||
|
self.check_expr("foo(*args, **kw)")
|
||||||
|
self.check_expr("foo(**kw)")
|
||||||
|
self.check_expr("foo(key=value)")
|
||||||
|
self.check_expr("foo(key=value, *args)")
|
||||||
|
self.check_expr("foo(key=value, *args, **kw)")
|
||||||
|
self.check_expr("foo(key=value, **kw)")
|
||||||
|
self.check_expr("foo(a, b, c, *args)")
|
||||||
|
self.check_expr("foo(a, b, c, *args, **kw)")
|
||||||
|
self.check_expr("foo(a, b, c, **kw)")
|
||||||
|
self.check_expr("foo + bar")
|
||||||
|
self.check_expr("lambda: 0")
|
||||||
|
self.check_expr("lambda x: 0")
|
||||||
|
self.check_expr("lambda *y: 0")
|
||||||
|
self.check_expr("lambda *y, **z: 0")
|
||||||
|
self.check_expr("lambda **z: 0")
|
||||||
|
self.check_expr("lambda x, y: 0")
|
||||||
|
self.check_expr("lambda foo=bar: 0")
|
||||||
|
self.check_expr("lambda foo=bar, spaz=nifty+spit: 0")
|
||||||
|
self.check_expr("lambda foo=bar, **z: 0")
|
||||||
|
self.check_expr("lambda foo=bar, blaz=blat+2, **z: 0")
|
||||||
|
self.check_expr("lambda foo=bar, blaz=blat+2, *y, **z: 0")
|
||||||
|
self.check_expr("lambda x, *y, **z: 0")
|
||||||
|
|
||||||
print "Expressions:"
|
def test_print(self):
|
||||||
|
self.check_suite("print")
|
||||||
|
self.check_suite("print 1")
|
||||||
|
self.check_suite("print 1,")
|
||||||
|
self.check_suite("print >>fp")
|
||||||
|
self.check_suite("print >>fp, 1")
|
||||||
|
self.check_suite("print >>fp, 1,")
|
||||||
|
|
||||||
test_expr("foo(1)")
|
def test_simple_expression(self):
|
||||||
test_expr("[1, 2, 3]")
|
# expr_stmt
|
||||||
test_expr("[x**3 for x in range(20)]")
|
self.check_suite("a")
|
||||||
test_expr("[x**3 for x in range(20) if x % 3]")
|
|
||||||
test_expr("foo(*args)")
|
|
||||||
test_expr("foo(*args, **kw)")
|
|
||||||
test_expr("foo(**kw)")
|
|
||||||
test_expr("foo(key=value)")
|
|
||||||
test_expr("foo(key=value, *args)")
|
|
||||||
test_expr("foo(key=value, *args, **kw)")
|
|
||||||
test_expr("foo(key=value, **kw)")
|
|
||||||
test_expr("foo(a, b, c, *args)")
|
|
||||||
test_expr("foo(a, b, c, *args, **kw)")
|
|
||||||
test_expr("foo(a, b, c, **kw)")
|
|
||||||
test_expr("foo + bar")
|
|
||||||
test_expr("lambda: 0")
|
|
||||||
test_expr("lambda x: 0")
|
|
||||||
test_expr("lambda *y: 0")
|
|
||||||
test_expr("lambda *y, **z: 0")
|
|
||||||
test_expr("lambda **z: 0")
|
|
||||||
test_expr("lambda x, y: 0")
|
|
||||||
test_expr("lambda foo=bar: 0")
|
|
||||||
test_expr("lambda foo=bar, spaz=nifty+spit: 0")
|
|
||||||
test_expr("lambda foo=bar, **z: 0")
|
|
||||||
test_expr("lambda foo=bar, blaz=blat+2, **z: 0")
|
|
||||||
test_expr("lambda foo=bar, blaz=blat+2, *y, **z: 0")
|
|
||||||
test_expr("lambda x, *y, **z: 0")
|
|
||||||
|
|
||||||
print
|
def test_simple_assignments(self):
|
||||||
print "Statements:"
|
self.check_suite("a = b")
|
||||||
test_suite("print")
|
self.check_suite("a = b = c = d = e")
|
||||||
test_suite("print 1")
|
|
||||||
test_suite("print 1,")
|
|
||||||
test_suite("print >>fp")
|
|
||||||
test_suite("print >>fp, 1")
|
|
||||||
test_suite("print >>fp, 1,")
|
|
||||||
|
|
||||||
# expr_stmt
|
def test_simple_augmented_assignments(self):
|
||||||
test_suite("a")
|
self.check_suite("a += b")
|
||||||
test_suite("a = b")
|
self.check_suite("a -= b")
|
||||||
test_suite("a = b = c = d = e")
|
self.check_suite("a *= b")
|
||||||
test_suite("a += b")
|
self.check_suite("a /= b")
|
||||||
test_suite("a -= b")
|
self.check_suite("a %= b")
|
||||||
test_suite("a *= b")
|
self.check_suite("a &= b")
|
||||||
test_suite("a /= b")
|
self.check_suite("a |= b")
|
||||||
test_suite("a %= b")
|
self.check_suite("a ^= b")
|
||||||
test_suite("a &= b")
|
self.check_suite("a <<= b")
|
||||||
test_suite("a |= b")
|
self.check_suite("a >>= b")
|
||||||
test_suite("a ^= b")
|
self.check_suite("a **= b")
|
||||||
test_suite("a <<= b")
|
|
||||||
test_suite("a >>= b")
|
|
||||||
test_suite("a **= b")
|
|
||||||
|
|
||||||
test_suite("def f(): pass")
|
def test_function_defs(self):
|
||||||
test_suite("def f(*args): pass")
|
self.check_suite("def f(): pass")
|
||||||
test_suite("def f(*args, **kw): pass")
|
self.check_suite("def f(*args): pass")
|
||||||
test_suite("def f(**kw): pass")
|
self.check_suite("def f(*args, **kw): pass")
|
||||||
test_suite("def f(foo=bar): pass")
|
self.check_suite("def f(**kw): pass")
|
||||||
test_suite("def f(foo=bar, *args): pass")
|
self.check_suite("def f(foo=bar): pass")
|
||||||
test_suite("def f(foo=bar, *args, **kw): pass")
|
self.check_suite("def f(foo=bar, *args): pass")
|
||||||
test_suite("def f(foo=bar, **kw): pass")
|
self.check_suite("def f(foo=bar, *args, **kw): pass")
|
||||||
|
self.check_suite("def f(foo=bar, **kw): pass")
|
||||||
|
|
||||||
test_suite("def f(a, b): pass")
|
self.check_suite("def f(a, b): pass")
|
||||||
test_suite("def f(a, b, *args): pass")
|
self.check_suite("def f(a, b, *args): pass")
|
||||||
test_suite("def f(a, b, *args, **kw): pass")
|
self.check_suite("def f(a, b, *args, **kw): pass")
|
||||||
test_suite("def f(a, b, **kw): pass")
|
self.check_suite("def f(a, b, **kw): pass")
|
||||||
test_suite("def f(a, b, foo=bar): pass")
|
self.check_suite("def f(a, b, foo=bar): pass")
|
||||||
test_suite("def f(a, b, foo=bar, *args): pass")
|
self.check_suite("def f(a, b, foo=bar, *args): pass")
|
||||||
test_suite("def f(a, b, foo=bar, *args, **kw): pass")
|
self.check_suite("def f(a, b, foo=bar, *args, **kw): pass")
|
||||||
test_suite("def f(a, b, foo=bar, **kw): pass")
|
self.check_suite("def f(a, b, foo=bar, **kw): pass")
|
||||||
|
|
||||||
test_suite("from sys.path import *")
|
def test_import_from_statement(self):
|
||||||
test_suite("from sys.path import dirname")
|
self.check_suite("from sys.path import *")
|
||||||
test_suite("from sys.path import dirname as my_dirname")
|
self.check_suite("from sys.path import dirname")
|
||||||
test_suite("from sys.path import dirname, basename")
|
self.check_suite("from sys.path import dirname as my_dirname")
|
||||||
test_suite("from sys.path import dirname as my_dirname, basename")
|
self.check_suite("from sys.path import dirname, basename")
|
||||||
test_suite("from sys.path import dirname, basename as my_basename")
|
self.check_suite(
|
||||||
|
"from sys.path import dirname as my_dirname, basename")
|
||||||
|
self.check_suite(
|
||||||
|
"from sys.path import dirname, basename as my_basename")
|
||||||
|
|
||||||
test_suite("import sys")
|
def test_basic_import_statement(self):
|
||||||
test_suite("import sys as system")
|
self.check_suite("import sys")
|
||||||
test_suite("import sys, math")
|
self.check_suite("import sys as system")
|
||||||
test_suite("import sys as system, math")
|
self.check_suite("import sys, math")
|
||||||
test_suite("import sys, math as my_math")
|
self.check_suite("import sys as system, math")
|
||||||
|
self.check_suite("import sys, math as my_math")
|
||||||
#d = os.path.dirname(os.__file__)
|
|
||||||
#roundtrip_fromfile(os.path.join(d, "os.py"))
|
|
||||||
#roundtrip_fromfile(os.path.join(d, "test", "test_parser.py"))
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Second, we take *invalid* trees and make sure we get ParserError
|
# Second, we take *invalid* trees and make sure we get ParserError
|
||||||
# rejections for them.
|
# rejections for them.
|
||||||
#
|
#
|
||||||
|
|
||||||
print
|
class IllegalSyntaxTestCase(unittest.TestCase):
|
||||||
print "Invalid parse trees:"
|
def check_bad_tree(self, tree, label):
|
||||||
|
try:
|
||||||
|
parser.sequence2ast(tree)
|
||||||
|
except parser.ParserError:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
self.fail("did not detect invalid tree for %r" % label)
|
||||||
|
|
||||||
def check_bad_tree(tree, label):
|
def test_junk(self):
|
||||||
print
|
# not even remotely valid:
|
||||||
print label
|
self.check_bad_tree((1, 2, 3), "<junk>")
|
||||||
try:
|
|
||||||
parser.sequence2ast(tree)
|
def test_print_chevron_comma(self):
|
||||||
except parser.ParserError:
|
"Illegal input: print >>fp,"""
|
||||||
print "caught expected exception for invalid tree"
|
tree = \
|
||||||
else:
|
(257,
|
||||||
print "test failed: did not properly detect invalid tree:"
|
(264,
|
||||||
pprint.pprint(tree)
|
(265,
|
||||||
|
(266,
|
||||||
|
(268,
|
||||||
|
(1, 'print'),
|
||||||
|
(35, '>>'),
|
||||||
|
(290,
|
||||||
|
(291,
|
||||||
|
(292,
|
||||||
|
(293,
|
||||||
|
(295,
|
||||||
|
(296,
|
||||||
|
(297,
|
||||||
|
(298, (299, (300, (301, (302, (303, (1, 'fp')))))))))))))),
|
||||||
|
(12, ','))),
|
||||||
|
(4, ''))),
|
||||||
|
(0, ''))
|
||||||
|
self.check_bad_tree(tree, "print >>fp,")
|
||||||
|
|
||||||
|
def test_a_comma_comma_c(self):
|
||||||
|
"""Illegal input: a,,c"""
|
||||||
|
tree = \
|
||||||
|
(258,
|
||||||
|
(311,
|
||||||
|
(290,
|
||||||
|
(291,
|
||||||
|
(292,
|
||||||
|
(293,
|
||||||
|
(295,
|
||||||
|
(296,
|
||||||
|
(297,
|
||||||
|
(298, (299, (300, (301, (302, (303, (1, 'a')))))))))))))),
|
||||||
|
(12, ','),
|
||||||
|
(12, ','),
|
||||||
|
(290,
|
||||||
|
(291,
|
||||||
|
(292,
|
||||||
|
(293,
|
||||||
|
(295,
|
||||||
|
(296,
|
||||||
|
(297,
|
||||||
|
(298, (299, (300, (301, (302, (303, (1, 'c'))))))))))))))),
|
||||||
|
(4, ''),
|
||||||
|
(0, ''))
|
||||||
|
self.check_bad_tree(tree, "a,,c")
|
||||||
|
|
||||||
|
def test_illegal_operator(self):
|
||||||
|
"""Illegal input: a $= b"""
|
||||||
|
tree = \
|
||||||
|
(257,
|
||||||
|
(264,
|
||||||
|
(265,
|
||||||
|
(266,
|
||||||
|
(267,
|
||||||
|
(312,
|
||||||
|
(291,
|
||||||
|
(292,
|
||||||
|
(293,
|
||||||
|
(294,
|
||||||
|
(296,
|
||||||
|
(297,
|
||||||
|
(298,
|
||||||
|
(299,
|
||||||
|
(300, (301, (302, (303, (304, (1, 'a'))))))))))))))),
|
||||||
|
(268, (37, '$=')),
|
||||||
|
(312,
|
||||||
|
(291,
|
||||||
|
(292,
|
||||||
|
(293,
|
||||||
|
(294,
|
||||||
|
(296,
|
||||||
|
(297,
|
||||||
|
(298,
|
||||||
|
(299,
|
||||||
|
(300, (301, (302, (303, (304, (1, 'b'))))))))))))))))),
|
||||||
|
(4, ''))),
|
||||||
|
(0, ''))
|
||||||
|
self.check_bad_tree(tree, "a $= b")
|
||||||
|
|
||||||
|
|
||||||
# not even remotely valid:
|
test_support.run_unittest(RoundtripLegalSyntaxTestCase)
|
||||||
check_bad_tree((1, 2, 3), "<junk>")
|
test_support.run_unittest(IllegalSyntaxTestCase)
|
||||||
|
|
||||||
# print >>fp,
|
|
||||||
tree = \
|
|
||||||
(257,
|
|
||||||
(264,
|
|
||||||
(265,
|
|
||||||
(266,
|
|
||||||
(268,
|
|
||||||
(1, 'print'),
|
|
||||||
(35, '>>'),
|
|
||||||
(290,
|
|
||||||
(291,
|
|
||||||
(292,
|
|
||||||
(293,
|
|
||||||
(295,
|
|
||||||
(296,
|
|
||||||
(297,
|
|
||||||
(298, (299, (300, (301, (302, (303, (1, 'fp')))))))))))))),
|
|
||||||
(12, ','))),
|
|
||||||
(4, ''))),
|
|
||||||
(0, ''))
|
|
||||||
|
|
||||||
check_bad_tree(tree, "print >>fp,")
|
|
||||||
|
|
||||||
# a,,c
|
|
||||||
tree = \
|
|
||||||
(258,
|
|
||||||
(311,
|
|
||||||
(290,
|
|
||||||
(291,
|
|
||||||
(292,
|
|
||||||
(293,
|
|
||||||
(295,
|
|
||||||
(296, (297, (298, (299, (300, (301, (302, (303, (1, 'a')))))))))))))),
|
|
||||||
(12, ','),
|
|
||||||
(12, ','),
|
|
||||||
(290,
|
|
||||||
(291,
|
|
||||||
(292,
|
|
||||||
(293,
|
|
||||||
(295,
|
|
||||||
(296, (297, (298, (299, (300, (301, (302, (303, (1, 'c'))))))))))))))),
|
|
||||||
(4, ''),
|
|
||||||
(0, ''))
|
|
||||||
|
|
||||||
check_bad_tree(tree, "a,,c")
|
|
||||||
|
|
||||||
# a $= b
|
|
||||||
tree = \
|
|
||||||
(257,
|
|
||||||
(264,
|
|
||||||
(265,
|
|
||||||
(266,
|
|
||||||
(267,
|
|
||||||
(312,
|
|
||||||
(291,
|
|
||||||
(292,
|
|
||||||
(293,
|
|
||||||
(294,
|
|
||||||
(296,
|
|
||||||
(297,
|
|
||||||
(298,
|
|
||||||
(299, (300, (301, (302, (303, (304, (1, 'a'))))))))))))))),
|
|
||||||
(268, (37, '$=')),
|
|
||||||
(312,
|
|
||||||
(291,
|
|
||||||
(292,
|
|
||||||
(293,
|
|
||||||
(294,
|
|
||||||
(296,
|
|
||||||
(297,
|
|
||||||
(298,
|
|
||||||
(299, (300, (301, (302, (303, (304, (1, 'b'))))))))))))))))),
|
|
||||||
(4, ''))),
|
|
||||||
(0, ''))
|
|
||||||
|
|
||||||
check_bad_tree(tree, "a $= b")
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue