blob: 96f14f62bb1d223648073d132c68a078a82b5708 [file] [log] [blame]
Fred Drake79ca79d2000-08-21 22:30:53 +00001import parser
Fred Drake58422e52001-06-04 03:56:24 +00002import unittest
Christian Heimesb186d002008-03-18 15:15:01 +00003import sys
Mark Dickinson211c6252009-02-01 10:28:51 +00004import operator
Benjamin Petersonee8712c2008-05-20 21:35:26 +00005from test import support
Fred Drake79ca79d2000-08-21 22:30:53 +00006
7#
8# First, we test that we can generate trees from valid source fragments,
9# and that these valid trees are indeed allowed by the tree-loading side
10# of the parser module.
11#
12
Fred Drake58422e52001-06-04 03:56:24 +000013class RoundtripLegalSyntaxTestCase(unittest.TestCase):
Guido van Rossum32c2ae72002-08-22 19:45:32 +000014
Fred Drake58422e52001-06-04 03:56:24 +000015 def roundtrip(self, f, s):
16 st1 = f(s)
17 t = st1.totuple()
18 try:
Fred Drake6e4f2c02001-07-17 19:33:25 +000019 st2 = parser.sequence2st(t)
Guido van Rossumb940e112007-01-10 16:19:56 +000020 except parser.ParserError as why:
Anthony Baxterc2a5a632004-08-02 06:10:11 +000021 self.fail("could not roundtrip %r: %s" % (s, why))
Fred Drake79ca79d2000-08-21 22:30:53 +000022
Fred Drake58422e52001-06-04 03:56:24 +000023 self.assertEquals(t, st2.totuple(),
24 "could not re-generate syntax tree")
Fred Drake28f739a2000-08-25 22:42:40 +000025
Fred Drake58422e52001-06-04 03:56:24 +000026 def check_expr(self, s):
27 self.roundtrip(parser.expr, s)
Fred Drake28f739a2000-08-25 22:42:40 +000028
Benjamin Petersonf216c942008-10-31 02:28:05 +000029 def test_flags_passed(self):
30 # The unicode literals flags has to be passed from the paser to AST
31 # generation.
32 suite = parser.suite("from __future__ import unicode_literals; x = ''")
33 code = suite.compile()
34 scope = {}
35 exec(code, {}, scope)
Ezio Melottie9615932010-01-24 19:26:24 +000036 self.assertIsInstance(scope["x"], str)
Benjamin Petersonf216c942008-10-31 02:28:05 +000037
Fred Drake58422e52001-06-04 03:56:24 +000038 def check_suite(self, s):
39 self.roundtrip(parser.suite, s)
Fred Drake28f739a2000-08-25 22:42:40 +000040
Fred Drakecf580c72001-07-17 03:01:29 +000041 def test_yield_statement(self):
Tim Peters496563a2002-04-01 00:28:59 +000042 self.check_suite("def f(): yield 1")
Phillip J. Eby0d6615f2005-08-02 00:46:46 +000043 self.check_suite("def f(): yield")
44 self.check_suite("def f(): x += yield")
45 self.check_suite("def f(): x = yield 1")
46 self.check_suite("def f(): x = y = yield 1")
47 self.check_suite("def f(): x = yield")
48 self.check_suite("def f(): x = y = yield")
49 self.check_suite("def f(): 1 + (yield)*2")
50 self.check_suite("def f(): (yield 1)*2")
Tim Peters496563a2002-04-01 00:28:59 +000051 self.check_suite("def f(): return; yield 1")
52 self.check_suite("def f(): yield 1; return")
53 self.check_suite("def f():\n"
Fred Drakecf580c72001-07-17 03:01:29 +000054 " for x in range(30):\n"
55 " yield x\n")
Phillip J. Eby0d6615f2005-08-02 00:46:46 +000056 self.check_suite("def f():\n"
57 " if (yield):\n"
58 " yield x\n")
Fred Drakecf580c72001-07-17 03:01:29 +000059
Fred Drake58422e52001-06-04 03:56:24 +000060 def test_expressions(self):
61 self.check_expr("foo(1)")
62 self.check_expr("[1, 2, 3]")
63 self.check_expr("[x**3 for x in range(20)]")
64 self.check_expr("[x**3 for x in range(20) if x % 3]")
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000065 self.check_expr("[x**3 for x in range(20) if x % 2 if x % 3]")
66 self.check_expr("list(x**3 for x in range(20))")
67 self.check_expr("list(x**3 for x in range(20) if x % 3)")
68 self.check_expr("list(x**3 for x in range(20) if x % 2 if x % 3)")
Fred Drake58422e52001-06-04 03:56:24 +000069 self.check_expr("foo(*args)")
70 self.check_expr("foo(*args, **kw)")
71 self.check_expr("foo(**kw)")
72 self.check_expr("foo(key=value)")
73 self.check_expr("foo(key=value, *args)")
74 self.check_expr("foo(key=value, *args, **kw)")
75 self.check_expr("foo(key=value, **kw)")
76 self.check_expr("foo(a, b, c, *args)")
77 self.check_expr("foo(a, b, c, *args, **kw)")
78 self.check_expr("foo(a, b, c, **kw)")
Benjamin Peterson3938a902008-08-20 02:33:00 +000079 self.check_expr("foo(a, *args, keyword=23)")
Fred Drake58422e52001-06-04 03:56:24 +000080 self.check_expr("foo + bar")
Michael W. Hudson5e83b7a2003-01-29 14:20:23 +000081 self.check_expr("foo - bar")
82 self.check_expr("foo * bar")
83 self.check_expr("foo / bar")
84 self.check_expr("foo // bar")
Fred Drake58422e52001-06-04 03:56:24 +000085 self.check_expr("lambda: 0")
86 self.check_expr("lambda x: 0")
87 self.check_expr("lambda *y: 0")
88 self.check_expr("lambda *y, **z: 0")
89 self.check_expr("lambda **z: 0")
90 self.check_expr("lambda x, y: 0")
91 self.check_expr("lambda foo=bar: 0")
92 self.check_expr("lambda foo=bar, spaz=nifty+spit: 0")
93 self.check_expr("lambda foo=bar, **z: 0")
94 self.check_expr("lambda foo=bar, blaz=blat+2, **z: 0")
95 self.check_expr("lambda foo=bar, blaz=blat+2, *y, **z: 0")
96 self.check_expr("lambda x, *y, **z: 0")
Raymond Hettinger354433a2004-05-19 08:20:33 +000097 self.check_expr("(x for x in range(10))")
98 self.check_expr("foo(x for x in range(10))")
Fred Drake79ca79d2000-08-21 22:30:53 +000099
Fred Drake58422e52001-06-04 03:56:24 +0000100 def test_simple_expression(self):
101 # expr_stmt
102 self.check_suite("a")
Fred Drake79ca79d2000-08-21 22:30:53 +0000103
Fred Drake58422e52001-06-04 03:56:24 +0000104 def test_simple_assignments(self):
105 self.check_suite("a = b")
106 self.check_suite("a = b = c = d = e")
Fred Drake28f739a2000-08-25 22:42:40 +0000107
Fred Drake58422e52001-06-04 03:56:24 +0000108 def test_simple_augmented_assignments(self):
109 self.check_suite("a += b")
110 self.check_suite("a -= b")
111 self.check_suite("a *= b")
112 self.check_suite("a /= b")
Michael W. Hudson5e83b7a2003-01-29 14:20:23 +0000113 self.check_suite("a //= b")
Fred Drake58422e52001-06-04 03:56:24 +0000114 self.check_suite("a %= b")
115 self.check_suite("a &= b")
116 self.check_suite("a |= b")
117 self.check_suite("a ^= b")
118 self.check_suite("a <<= b")
119 self.check_suite("a >>= b")
120 self.check_suite("a **= b")
Fred Drakee3fb18c2001-01-07 06:02:19 +0000121
Fred Drake58422e52001-06-04 03:56:24 +0000122 def test_function_defs(self):
123 self.check_suite("def f(): pass")
124 self.check_suite("def f(*args): pass")
125 self.check_suite("def f(*args, **kw): pass")
126 self.check_suite("def f(**kw): pass")
127 self.check_suite("def f(foo=bar): pass")
128 self.check_suite("def f(foo=bar, *args): pass")
129 self.check_suite("def f(foo=bar, *args, **kw): pass")
130 self.check_suite("def f(foo=bar, **kw): pass")
Fred Drakee3fb18c2001-01-07 06:02:19 +0000131
Fred Drake58422e52001-06-04 03:56:24 +0000132 self.check_suite("def f(a, b): pass")
133 self.check_suite("def f(a, b, *args): pass")
134 self.check_suite("def f(a, b, *args, **kw): pass")
135 self.check_suite("def f(a, b, **kw): pass")
136 self.check_suite("def f(a, b, foo=bar): pass")
137 self.check_suite("def f(a, b, foo=bar, *args): pass")
138 self.check_suite("def f(a, b, foo=bar, *args, **kw): pass")
139 self.check_suite("def f(a, b, foo=bar, **kw): pass")
Fred Drakee3fb18c2001-01-07 06:02:19 +0000140
Anthony Baxterc2a5a632004-08-02 06:10:11 +0000141 self.check_suite("@staticmethod\n"
142 "def f(): pass")
143 self.check_suite("@staticmethod\n"
144 "@funcattrs(x, y)\n"
145 "def f(): pass")
146 self.check_suite("@funcattrs()\n"
147 "def f(): pass")
148
Brett Cannonf4189912005-04-09 02:30:16 +0000149 def test_class_defs(self):
150 self.check_suite("class foo():pass")
Guido van Rossumfc158e22007-11-15 19:17:28 +0000151 self.check_suite("class foo(object):pass")
Mark Dickinson2bd61a92010-07-04 16:37:31 +0000152 self.check_suite("@class_decorator\n"
153 "class foo():pass")
154 self.check_suite("@class_decorator(arg)\n"
155 "class foo():pass")
156 self.check_suite("@decorator1\n"
157 "@decorator2\n"
158 "class foo():pass")
Tim Peterse8906822005-04-20 17:45:13 +0000159
Fred Drake58422e52001-06-04 03:56:24 +0000160 def test_import_from_statement(self):
161 self.check_suite("from sys.path import *")
162 self.check_suite("from sys.path import dirname")
Anthony Baxter1a4ddae2004-08-31 10:07:13 +0000163 self.check_suite("from sys.path import (dirname)")
164 self.check_suite("from sys.path import (dirname,)")
Fred Drake58422e52001-06-04 03:56:24 +0000165 self.check_suite("from sys.path import dirname as my_dirname")
Anthony Baxter1a4ddae2004-08-31 10:07:13 +0000166 self.check_suite("from sys.path import (dirname as my_dirname)")
167 self.check_suite("from sys.path import (dirname as my_dirname,)")
Fred Drake58422e52001-06-04 03:56:24 +0000168 self.check_suite("from sys.path import dirname, basename")
Anthony Baxter1a4ddae2004-08-31 10:07:13 +0000169 self.check_suite("from sys.path import (dirname, basename)")
170 self.check_suite("from sys.path import (dirname, basename,)")
Fred Drake58422e52001-06-04 03:56:24 +0000171 self.check_suite(
172 "from sys.path import dirname as my_dirname, basename")
173 self.check_suite(
Anthony Baxter1a4ddae2004-08-31 10:07:13 +0000174 "from sys.path import (dirname as my_dirname, basename)")
175 self.check_suite(
176 "from sys.path import (dirname as my_dirname, basename,)")
177 self.check_suite(
Fred Drake58422e52001-06-04 03:56:24 +0000178 "from sys.path import dirname, basename as my_basename")
Anthony Baxter1a4ddae2004-08-31 10:07:13 +0000179 self.check_suite(
180 "from sys.path import (dirname, basename as my_basename)")
181 self.check_suite(
182 "from sys.path import (dirname, basename as my_basename,)")
Benjamin Petersonc0747cf2008-11-03 20:31:38 +0000183 self.check_suite("from .bogus import x")
Fred Drakee3fb18c2001-01-07 06:02:19 +0000184
Fred Drake58422e52001-06-04 03:56:24 +0000185 def test_basic_import_statement(self):
186 self.check_suite("import sys")
187 self.check_suite("import sys as system")
188 self.check_suite("import sys, math")
189 self.check_suite("import sys as system, math")
190 self.check_suite("import sys, math as my_math")
Fred Drake79ca79d2000-08-21 22:30:53 +0000191
Neal Norwitz9caf9c02003-02-10 01:54:06 +0000192 def test_pep263(self):
193 self.check_suite("# -*- coding: iso-8859-1 -*-\n"
194 "pass\n")
195
196 def test_assert(self):
197 self.check_suite("assert alo < ahi and blo < bhi\n")
198
Benjamin Peterson4469d0c2008-11-30 22:46:23 +0000199 def test_with(self):
200 self.check_suite("with open('x'): pass\n")
201 self.check_suite("with open('x') as f: pass\n")
Georg Brandl0c315622009-05-25 21:10:36 +0000202 self.check_suite("with open('x') as f, open('y') as g: pass\n")
Benjamin Peterson4469d0c2008-11-30 22:46:23 +0000203
Georg Brandleee31162008-12-07 15:15:22 +0000204 def test_try_stmt(self):
205 self.check_suite("try: pass\nexcept: pass\n")
206 self.check_suite("try: pass\nfinally: pass\n")
207 self.check_suite("try: pass\nexcept A: pass\nfinally: pass\n")
208 self.check_suite("try: pass\nexcept A: pass\nexcept: pass\n"
209 "finally: pass\n")
210 self.check_suite("try: pass\nexcept: pass\nelse: pass\n")
211 self.check_suite("try: pass\nexcept: pass\nelse: pass\n"
212 "finally: pass\n")
213
Thomas Wouters89f507f2006-12-13 04:49:30 +0000214 def test_position(self):
215 # An absolutely minimal test of position information. Better
216 # tests would be a big project.
Benjamin Peterson8f326b22009-12-13 02:10:36 +0000217 code = "def f(x):\n return x + 1"
Thomas Wouters89f507f2006-12-13 04:49:30 +0000218 st1 = parser.suite(code)
219 st2 = st1.totuple(line_info=1, col_info=1)
220
221 def walk(tree):
222 node_type = tree[0]
223 next = tree[1]
224 if isinstance(next, tuple):
225 for elt in tree[1:]:
226 for x in walk(elt):
227 yield x
228 else:
229 yield tree
230
231 terminals = list(walk(st2))
232 self.assertEqual([
233 (1, 'def', 1, 0),
234 (1, 'f', 1, 4),
235 (7, '(', 1, 5),
236 (1, 'x', 1, 6),
237 (8, ')', 1, 7),
238 (11, ':', 1, 8),
239 (4, '', 1, 9),
240 (5, '', 2, -1),
241 (1, 'return', 2, 4),
242 (1, 'x', 2, 11),
243 (14, '+', 2, 13),
244 (2, '1', 2, 15),
245 (4, '', 2, 16),
Benjamin Peterson8f326b22009-12-13 02:10:36 +0000246 (6, '', 2, -1),
247 (4, '', 2, -1),
248 (0, '', 2, -1)],
Thomas Wouters89f507f2006-12-13 04:49:30 +0000249 terminals)
250
Benjamin Peterson4905e802009-09-27 02:43:28 +0000251 def test_extended_unpacking(self):
252 self.check_suite("*a = y")
253 self.check_suite("x, *b, = m")
254 self.check_suite("[*a, *b] = y")
255 self.check_suite("for [*x, b] in x: pass")
256
Thomas Wouters89f507f2006-12-13 04:49:30 +0000257
Fred Drake79ca79d2000-08-21 22:30:53 +0000258#
259# Second, we take *invalid* trees and make sure we get ParserError
260# rejections for them.
261#
262
Fred Drake58422e52001-06-04 03:56:24 +0000263class IllegalSyntaxTestCase(unittest.TestCase):
Guido van Rossum32c2ae72002-08-22 19:45:32 +0000264
Fred Drake58422e52001-06-04 03:56:24 +0000265 def check_bad_tree(self, tree, label):
266 try:
Fred Drake6e4f2c02001-07-17 19:33:25 +0000267 parser.sequence2st(tree)
Fred Drake58422e52001-06-04 03:56:24 +0000268 except parser.ParserError:
269 pass
270 else:
271 self.fail("did not detect invalid tree for %r" % label)
Fred Drake79ca79d2000-08-21 22:30:53 +0000272
Fred Drake58422e52001-06-04 03:56:24 +0000273 def test_junk(self):
274 # not even remotely valid:
275 self.check_bad_tree((1, 2, 3), "<junk>")
276
Fred Drakecf580c72001-07-17 03:01:29 +0000277 def test_illegal_yield_1(self):
Guido van Rossum32c2ae72002-08-22 19:45:32 +0000278 # Illegal yield statement: def f(): return 1; yield 1
Fred Drakecf580c72001-07-17 03:01:29 +0000279 tree = \
280 (257,
281 (264,
282 (285,
283 (259,
284 (1, 'def'),
285 (1, 'f'),
286 (260, (7, '('), (8, ')')),
287 (11, ':'),
288 (291,
289 (4, ''),
290 (5, ''),
291 (264,
292 (265,
293 (266,
294 (272,
295 (275,
296 (1, 'return'),
297 (313,
298 (292,
299 (293,
300 (294,
301 (295,
302 (297,
303 (298,
304 (299,
305 (300,
306 (301,
307 (302, (303, (304, (305, (2, '1')))))))))))))))))),
308 (264,
309 (265,
310 (266,
311 (272,
312 (276,
313 (1, 'yield'),
314 (313,
315 (292,
316 (293,
317 (294,
318 (295,
319 (297,
320 (298,
321 (299,
322 (300,
323 (301,
324 (302,
325 (303, (304, (305, (2, '1')))))))))))))))))),
326 (4, ''))),
327 (6, ''))))),
328 (4, ''),
329 (0, ''))))
330 self.check_bad_tree(tree, "def f():\n return 1\n yield 1")
331
332 def test_illegal_yield_2(self):
Guido van Rossum32c2ae72002-08-22 19:45:32 +0000333 # Illegal return in generator: def f(): return 1; yield 1
Fred Drakecf580c72001-07-17 03:01:29 +0000334 tree = \
335 (257,
336 (264,
337 (265,
338 (266,
339 (278,
340 (1, 'from'),
341 (281, (1, '__future__')),
342 (1, 'import'),
343 (279, (1, 'generators')))),
344 (4, ''))),
345 (264,
346 (285,
347 (259,
348 (1, 'def'),
349 (1, 'f'),
350 (260, (7, '('), (8, ')')),
351 (11, ':'),
352 (291,
353 (4, ''),
354 (5, ''),
355 (264,
356 (265,
357 (266,
358 (272,
359 (275,
360 (1, 'return'),
361 (313,
362 (292,
363 (293,
364 (294,
365 (295,
366 (297,
367 (298,
368 (299,
369 (300,
370 (301,
371 (302, (303, (304, (305, (2, '1')))))))))))))))))),
372 (264,
373 (265,
374 (266,
375 (272,
376 (276,
377 (1, 'yield'),
378 (313,
379 (292,
380 (293,
381 (294,
382 (295,
383 (297,
384 (298,
385 (299,
386 (300,
387 (301,
388 (302,
389 (303, (304, (305, (2, '1')))))))))))))))))),
390 (4, ''))),
391 (6, ''))))),
392 (4, ''),
393 (0, ''))))
394 self.check_bad_tree(tree, "def f():\n return 1\n yield 1")
395
Fred Drake58422e52001-06-04 03:56:24 +0000396 def test_a_comma_comma_c(self):
Guido van Rossum32c2ae72002-08-22 19:45:32 +0000397 # Illegal input: a,,c
Fred Drake58422e52001-06-04 03:56:24 +0000398 tree = \
399 (258,
400 (311,
401 (290,
402 (291,
403 (292,
404 (293,
405 (295,
406 (296,
407 (297,
408 (298, (299, (300, (301, (302, (303, (1, 'a')))))))))))))),
409 (12, ','),
410 (12, ','),
411 (290,
412 (291,
413 (292,
414 (293,
415 (295,
416 (296,
417 (297,
418 (298, (299, (300, (301, (302, (303, (1, 'c'))))))))))))))),
419 (4, ''),
420 (0, ''))
421 self.check_bad_tree(tree, "a,,c")
422
423 def test_illegal_operator(self):
Guido van Rossum32c2ae72002-08-22 19:45:32 +0000424 # Illegal input: a $= b
Fred Drake58422e52001-06-04 03:56:24 +0000425 tree = \
426 (257,
427 (264,
428 (265,
429 (266,
430 (267,
431 (312,
432 (291,
433 (292,
434 (293,
435 (294,
436 (296,
437 (297,
438 (298,
439 (299,
440 (300, (301, (302, (303, (304, (1, 'a'))))))))))))))),
441 (268, (37, '$=')),
442 (312,
443 (291,
444 (292,
445 (293,
446 (294,
447 (296,
448 (297,
449 (298,
450 (299,
451 (300, (301, (302, (303, (304, (1, 'b'))))))))))))))))),
452 (4, ''))),
453 (0, ''))
454 self.check_bad_tree(tree, "a $= b")
Fred Drake79ca79d2000-08-21 22:30:53 +0000455
Neal Norwitz9caf9c02003-02-10 01:54:06 +0000456 def test_malformed_global(self):
457 #doesn't have global keyword in ast
458 tree = (257,
459 (264,
460 (265,
461 (266,
462 (282, (1, 'foo'))), (4, ''))),
463 (4, ''),
Tim Petersf2715e02003-02-19 02:35:07 +0000464 (0, ''))
Neal Norwitz9caf9c02003-02-10 01:54:06 +0000465 self.check_bad_tree(tree, "malformed global ast")
Fred Drake79ca79d2000-08-21 22:30:53 +0000466
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000467
468class CompileTestCase(unittest.TestCase):
469
470 # These tests are very minimal. :-(
471
472 def test_compile_expr(self):
473 st = parser.expr('2 + 3')
474 code = parser.compilest(st)
475 self.assertEquals(eval(code), 5)
476
477 def test_compile_suite(self):
478 st = parser.suite('x = 2; y = x + 3')
479 code = parser.compilest(st)
480 globs = {}
Georg Brandl7cae87c2006-09-06 06:51:57 +0000481 exec(code, globs)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000482 self.assertEquals(globs['y'], 5)
483
484 def test_compile_error(self):
485 st = parser.suite('1 = 3 + 4')
486 self.assertRaises(SyntaxError, parser.compilest, st)
487
Guido van Rossumb5a755e2007-07-18 18:15:48 +0000488 def test_compile_badunicode(self):
Guido van Rossum7eb6ca52007-07-18 21:00:22 +0000489 st = parser.suite('a = "\\U12345678"')
Guido van Rossumb5a755e2007-07-18 18:15:48 +0000490 self.assertRaises(SyntaxError, parser.compilest, st)
Guido van Rossum7eb6ca52007-07-18 21:00:22 +0000491 st = parser.suite('a = "\\u1"')
Guido van Rossumb5a755e2007-07-18 18:15:48 +0000492 self.assertRaises(SyntaxError, parser.compilest, st)
493
Mark Dickinsond35a32e2010-06-17 12:33:22 +0000494 def test_issue_9011(self):
495 # Issue 9011: compilation of an unary minus expression changed
496 # the meaning of the ST, so that a second compilation produced
497 # incorrect results.
498 st = parser.expr('-3')
499 code1 = parser.compilest(st)
500 self.assertEqual(eval(code1), -3)
501 code2 = parser.compilest(st)
502 self.assertEqual(eval(code2), -3)
503
Christian Heimes90c3d9b2008-02-23 13:18:03 +0000504class ParserStackLimitTestCase(unittest.TestCase):
Mark Dickinsond35a32e2010-06-17 12:33:22 +0000505 """try to push the parser to/over its limits.
Christian Heimes90c3d9b2008-02-23 13:18:03 +0000506 see http://bugs.python.org/issue1881 for a discussion
507 """
508 def _nested_expression(self, level):
509 return "["*level+"]"*level
510
511 def test_deeply_nested_list(self):
512 # XXX used to be 99 levels in 2.x
513 e = self._nested_expression(93)
514 st = parser.expr(e)
515 st.compile()
516
517 def test_trigger_memory_error(self):
518 e = self._nested_expression(100)
Christian Heimesb186d002008-03-18 15:15:01 +0000519 print("Expecting 's_push: parser stack overflow' in next line",
520 file=sys.stderr)
Antoine Pitrou88909542009-06-29 13:54:42 +0000521 sys.stderr.flush()
Christian Heimes90c3d9b2008-02-23 13:18:03 +0000522 self.assertRaises(MemoryError, parser.expr, e)
523
Mark Dickinson211c6252009-02-01 10:28:51 +0000524class STObjectTestCase(unittest.TestCase):
525 """Test operations on ST objects themselves"""
526
527 def test_comparisons(self):
528 # ST objects should support order and equality comparisons
529 st1 = parser.expr('2 + 3')
530 st2 = parser.suite('x = 2; y = x + 3')
531 st3 = parser.expr('list(x**3 for x in range(20))')
532 st1_copy = parser.expr('2 + 3')
533 st2_copy = parser.suite('x = 2; y = x + 3')
534 st3_copy = parser.expr('list(x**3 for x in range(20))')
535
536 # exercise fast path for object identity
537 self.assertEquals(st1 == st1, True)
538 self.assertEquals(st2 == st2, True)
539 self.assertEquals(st3 == st3, True)
540 # slow path equality
541 self.assertEqual(st1, st1_copy)
542 self.assertEqual(st2, st2_copy)
543 self.assertEqual(st3, st3_copy)
544 self.assertEquals(st1 == st2, False)
545 self.assertEquals(st1 == st3, False)
546 self.assertEquals(st2 == st3, False)
547 self.assertEquals(st1 != st1, False)
548 self.assertEquals(st2 != st2, False)
549 self.assertEquals(st3 != st3, False)
550 self.assertEquals(st1 != st1_copy, False)
551 self.assertEquals(st2 != st2_copy, False)
552 self.assertEquals(st3 != st3_copy, False)
553 self.assertEquals(st2 != st1, True)
554 self.assertEquals(st1 != st3, True)
555 self.assertEquals(st3 != st2, True)
556 # we don't particularly care what the ordering is; just that
557 # it's usable and self-consistent
558 self.assertEquals(st1 < st2, not (st2 <= st1))
559 self.assertEquals(st1 < st3, not (st3 <= st1))
560 self.assertEquals(st2 < st3, not (st3 <= st2))
561 self.assertEquals(st1 < st2, st2 > st1)
562 self.assertEquals(st1 < st3, st3 > st1)
563 self.assertEquals(st2 < st3, st3 > st2)
564 self.assertEquals(st1 <= st2, st2 >= st1)
565 self.assertEquals(st3 <= st1, st1 >= st3)
566 self.assertEquals(st2 <= st3, st3 >= st2)
567 # transitivity
568 bottom = min(st1, st2, st3)
569 top = max(st1, st2, st3)
570 mid = sorted([st1, st2, st3])[1]
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000571 self.assertTrue(bottom < mid)
572 self.assertTrue(bottom < top)
573 self.assertTrue(mid < top)
574 self.assertTrue(bottom <= mid)
575 self.assertTrue(bottom <= top)
576 self.assertTrue(mid <= top)
577 self.assertTrue(bottom <= bottom)
578 self.assertTrue(mid <= mid)
579 self.assertTrue(top <= top)
Mark Dickinson211c6252009-02-01 10:28:51 +0000580 # interaction with other types
581 self.assertEquals(st1 == 1588.602459, False)
582 self.assertEquals('spanish armada' != st2, True)
583 self.assertRaises(TypeError, operator.ge, st3, None)
584 self.assertRaises(TypeError, operator.le, False, st1)
585 self.assertRaises(TypeError, operator.lt, st1, 1815)
586 self.assertRaises(TypeError, operator.gt, b'waterloo', st2)
587
588
589 # XXX tests for pickling and unpickling of ST objects should go here
590
591
Fred Drake2e2be372001-09-20 21:33:42 +0000592def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000593 support.run_unittest(
Walter Dörwald21d3a322003-05-01 17:45:56 +0000594 RoundtripLegalSyntaxTestCase,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000595 IllegalSyntaxTestCase,
596 CompileTestCase,
Christian Heimes90c3d9b2008-02-23 13:18:03 +0000597 ParserStackLimitTestCase,
Mark Dickinson211c6252009-02-01 10:28:51 +0000598 STObjectTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +0000599 )
Fred Drake2e2be372001-09-20 21:33:42 +0000600
601
602if __name__ == "__main__":
603 test_main()