blob: ab47431018f6340b55659bab2d3fb6f6d295084c [file] [log] [blame]
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00001# Testing the line trace facility.
2
3from test import test_support
4import unittest
5import sys
6import difflib
7
8# A very basic example. If this fails, we're in deep trouble.
9def basic():
10 return 1
11
12basic.events = [(0, 'call'),
13 (1, 'line'),
14 (1, 'return')]
15
Jeremy Hyltoned40ea12006-04-04 14:26:39 +000016# Many of the tests below are tricky because they involve pass statements.
17# If there is implicit control flow around a pass statement (in an except
18# clause or else caluse) under what conditions do you set a line number
19# following that clause?
20
21
22# The entire "while 0:" statement is optimized away. No code
23# exists for it, so the line numbers skip directly from "del x"
24# to "x = 1".
Michael W. Hudson53d58bb2002-08-30 13:09:51 +000025def arigo_example():
26 x = 1
27 del x
28 while 0:
29 pass
30 x = 1
31
32arigo_example.events = [(0, 'call'),
33 (1, 'line'),
34 (2, 'line'),
Michael W. Hudson53d58bb2002-08-30 13:09:51 +000035 (5, 'line'),
36 (5, 'return')]
37
38# check that lines consisting of just one instruction get traced:
39def one_instr_line():
40 x = 1
41 del x
42 x = 1
43
44one_instr_line.events = [(0, 'call'),
45 (1, 'line'),
46 (2, 'line'),
47 (3, 'line'),
48 (3, 'return')]
49
50def no_pop_tops(): # 0
51 x = 1 # 1
52 for a in range(2): # 2
53 if a: # 3
54 x = 1 # 4
55 else: # 5
56 x = 1 # 6
57
58no_pop_tops.events = [(0, 'call'),
59 (1, 'line'),
60 (2, 'line'),
61 (3, 'line'),
62 (6, 'line'),
63 (2, 'line'),
64 (3, 'line'),
65 (4, 'line'),
66 (2, 'line'),
Michael W. Hudson02ff6a92002-09-11 15:36:32 +000067 (2, 'return')]
Michael W. Hudson53d58bb2002-08-30 13:09:51 +000068
69def no_pop_blocks():
Jeremy Hyltoned40ea12006-04-04 14:26:39 +000070 y = 1
71 while not y:
Michael W. Hudson53d58bb2002-08-30 13:09:51 +000072 bla
73 x = 1
74
75no_pop_blocks.events = [(0, 'call'),
76 (1, 'line'),
Jeremy Hyltoned40ea12006-04-04 14:26:39 +000077 (2, 'line'),
78 (4, 'line'),
79 (4, 'return')]
Michael W. Hudson53d58bb2002-08-30 13:09:51 +000080
Michael W. Hudson519a3422002-09-11 14:47:51 +000081def called(): # line -3
82 x = 1
83
84def call(): # line 0
85 called()
86
87call.events = [(0, 'call'),
88 (1, 'line'),
89 (-3, 'call'),
90 (-2, 'line'),
91 (-2, 'return'),
92 (1, 'return')]
93
94def raises():
95 raise Exception
96
97def test_raise():
98 try:
99 raises()
100 except Exception, exc:
101 x = 1
102
103test_raise.events = [(0, 'call'),
104 (1, 'line'),
105 (2, 'line'),
106 (-3, 'call'),
107 (-2, 'line'),
108 (-2, 'exception'),
Barry Warsawe2eca0b2005-08-15 18:14:19 +0000109 (-2, 'return'),
Michael W. Hudson519a3422002-09-11 14:47:51 +0000110 (2, 'exception'),
111 (3, 'line'),
112 (4, 'line'),
113 (4, 'return')]
114
115def _settrace_and_return(tracefunc):
116 sys.settrace(tracefunc)
117 sys._getframe().f_back.f_trace = tracefunc
118def settrace_and_return(tracefunc):
119 _settrace_and_return(tracefunc)
Tim Peters3de75262002-11-09 05:26:15 +0000120
Michael W. Hudson519a3422002-09-11 14:47:51 +0000121settrace_and_return.events = [(1, 'return')]
122
123def _settrace_and_raise(tracefunc):
124 sys.settrace(tracefunc)
125 sys._getframe().f_back.f_trace = tracefunc
126 raise RuntimeError
127def settrace_and_raise(tracefunc):
128 try:
129 _settrace_and_raise(tracefunc)
130 except RuntimeError, exc:
131 pass
Tim Peters3de75262002-11-09 05:26:15 +0000132
Michael W. Hudson519a3422002-09-11 14:47:51 +0000133settrace_and_raise.events = [(2, 'exception'),
134 (3, 'line'),
135 (4, 'line'),
136 (4, 'return')]
137
Nicholas Bastinaea94592004-03-22 18:30:42 +0000138# implicit return example
Jeremy Hyltoned40ea12006-04-04 14:26:39 +0000139# This test is interesting because of the else: pass
140# part of the code. The code generate for the true
141# part of the if contains a jump past the else branch.
142# The compiler then generates an implicit "return None"
143# Internally, the compiler visits the pass statement
144# and stores its line number for use on the next instruction.
145# The next instruction is the implicit return None.
Nicholas Bastinaea94592004-03-22 18:30:42 +0000146def ireturn_example():
147 a = 5
148 b = 5
149 if a == b:
150 b = a+1
151 else:
152 pass
153
154ireturn_example.events = [(0, 'call'),
155 (1, 'line'),
156 (2, 'line'),
157 (3, 'line'),
158 (4, 'line'),
Jeremy Hyltoned40ea12006-04-04 14:26:39 +0000159 (6, 'line'),
160 (6, 'return')]
Nicholas Bastinaea94592004-03-22 18:30:42 +0000161
Nicholas Bastinfa7bec72004-03-22 19:21:47 +0000162# Tight loop with while(1) example (SF #765624)
163def tightloop_example():
164 items = range(0, 3)
165 try:
166 i = 0
167 while 1:
Nicholas Bastinee6c9b82004-03-22 19:23:46 +0000168 b = items[i]; i+=1
Nicholas Bastinfa7bec72004-03-22 19:21:47 +0000169 except IndexError:
170 pass
171
172tightloop_example.events = [(0, 'call'),
173 (1, 'line'),
174 (2, 'line'),
175 (3, 'line'),
176 (4, 'line'),
177 (5, 'line'),
178 (5, 'line'),
179 (5, 'line'),
Nicholas Bastinee6c9b82004-03-22 19:23:46 +0000180 (5, 'line'),
Nicholas Bastinfa7bec72004-03-22 19:21:47 +0000181 (5, 'exception'),
182 (6, 'line'),
183 (7, 'line'),
184 (7, 'return')]
185
Armin Rigo70693382004-03-22 19:30:39 +0000186def tighterloop_example():
187 items = range(1, 4)
188 try:
189 i = 0
190 while 1: i = items[i]
191 except IndexError:
192 pass
193
194tighterloop_example.events = [(0, 'call'),
195 (1, 'line'),
196 (2, 'line'),
197 (3, 'line'),
198 (4, 'line'),
199 (4, 'line'),
200 (4, 'line'),
201 (4, 'line'),
202 (4, 'exception'),
203 (5, 'line'),
204 (6, 'line'),
205 (6, 'return')]
206
Amaury Forgeot d'Arcc572dc32007-11-13 22:43:05 +0000207def generator_function():
208 try:
209 yield True
210 "continued"
211 finally:
212 "finally"
213def generator_example():
214 # any() will leave the generator before its end
215 x = any(generator_function())
216
217 # the following lines were not traced
218 for x in range(10):
219 y = x
220
221generator_example.events = ([(0, 'call'),
222 (2, 'line'),
223 (-6, 'call'),
224 (-5, 'line'),
225 (-4, 'line'),
226 (-4, 'return'),
227 (-4, 'call'),
228 (-4, 'exception'),
229 (-1, 'line'),
230 (-1, 'return')] +
231 [(5, 'line'), (6, 'line')] * 10 +
232 [(5, 'line'), (5, 'return')])
233
234
Michael W. Hudson53d58bb2002-08-30 13:09:51 +0000235class Tracer:
236 def __init__(self):
237 self.events = []
238 def trace(self, frame, event, arg):
239 self.events.append((frame.f_lineno, event))
240 return self.trace
Amaury Forgeot d'Arcc572dc32007-11-13 22:43:05 +0000241 def traceWithGenexp(self, frame, event, arg):
242 (o for o in [1])
243 self.events.append((frame.f_lineno, event))
244 return self.trace
Michael W. Hudson53d58bb2002-08-30 13:09:51 +0000245
246class TraceTestCase(unittest.TestCase):
Michael W. Hudson519a3422002-09-11 14:47:51 +0000247 def compare_events(self, line_offset, events, expected_events):
Tim Peters3de75262002-11-09 05:26:15 +0000248 events = [(l - line_offset, e) for (l, e) in events]
Michael W. Hudson519a3422002-09-11 14:47:51 +0000249 if events != expected_events:
250 self.fail(
251 "events did not match expectation:\n" +
Amaury Forgeot d'Arcc572dc32007-11-13 22:43:05 +0000252 "\n".join(difflib.ndiff([str(x) for x in expected_events],
253 [str(x) for x in events])))
Tim Peters3de75262002-11-09 05:26:15 +0000254
Amaury Forgeot d'Arc316f8a82008-02-04 22:34:57 +0000255 def run_and_compare(self, func, events):
Michael W. Hudson53d58bb2002-08-30 13:09:51 +0000256 tracer = Tracer()
257 sys.settrace(tracer.trace)
258 func()
259 sys.settrace(None)
Michael W. Hudson519a3422002-09-11 14:47:51 +0000260 self.compare_events(func.func_code.co_firstlineno,
Amaury Forgeot d'Arc316f8a82008-02-04 22:34:57 +0000261 tracer.events, events)
262
263 def run_test(self, func):
264 self.run_and_compare(func, func.events)
Michael W. Hudson519a3422002-09-11 14:47:51 +0000265
266 def run_test2(self, func):
267 tracer = Tracer()
268 func(tracer.trace)
269 sys.settrace(None)
270 self.compare_events(func.func_code.co_firstlineno,
271 tracer.events, func.events)
Tim Peters3de75262002-11-09 05:26:15 +0000272
Nicholas Bastinaea94592004-03-22 18:30:42 +0000273 def test_01_basic(self):
Michael W. Hudson53d58bb2002-08-30 13:09:51 +0000274 self.run_test(basic)
Jeremy Hyltoned40ea12006-04-04 14:26:39 +0000275 def test_02_arigo(self):
276 self.run_test(arigo_example)
Nicholas Bastinaea94592004-03-22 18:30:42 +0000277 def test_03_one_instr(self):
Michael W. Hudson53d58bb2002-08-30 13:09:51 +0000278 self.run_test(one_instr_line)
Jeremy Hyltoned40ea12006-04-04 14:26:39 +0000279 def test_04_no_pop_blocks(self):
280 self.run_test(no_pop_blocks)
Neal Norwitz4ffedad2006-08-04 04:58:47 +0000281 def test_05_no_pop_tops(self):
282 self.run_test(no_pop_tops)
Nicholas Bastinaea94592004-03-22 18:30:42 +0000283 def test_06_call(self):
Michael W. Hudson519a3422002-09-11 14:47:51 +0000284 self.run_test(call)
Nicholas Bastinaea94592004-03-22 18:30:42 +0000285 def test_07_raise(self):
Michael W. Hudson519a3422002-09-11 14:47:51 +0000286 self.run_test(test_raise)
287
Nicholas Bastinaea94592004-03-22 18:30:42 +0000288 def test_08_settrace_and_return(self):
Michael W. Hudson519a3422002-09-11 14:47:51 +0000289 self.run_test2(settrace_and_return)
Nicholas Bastinaea94592004-03-22 18:30:42 +0000290 def test_09_settrace_and_raise(self):
Michael W. Hudson519a3422002-09-11 14:47:51 +0000291 self.run_test2(settrace_and_raise)
Jeremy Hyltoned40ea12006-04-04 14:26:39 +0000292 def test_10_ireturn(self):
293 self.run_test(ireturn_example)
Nicholas Bastinfa7bec72004-03-22 19:21:47 +0000294 def test_11_tightloop(self):
295 self.run_test(tightloop_example)
Armin Rigo70693382004-03-22 19:30:39 +0000296 def test_12_tighterloop(self):
297 self.run_test(tighterloop_example)
Michael W. Hudson53d58bb2002-08-30 13:09:51 +0000298
Amaury Forgeot d'Arcc572dc32007-11-13 22:43:05 +0000299 def test_13_genexp(self):
300 self.run_test(generator_example)
301 # issue1265: if the trace function contains a generator,
302 # and if the traced function contains another generator
303 # that is not completely exhausted, the trace stopped.
304 # Worse: the 'finally' clause was not invoked.
305 tracer = Tracer()
306 sys.settrace(tracer.traceWithGenexp)
307 generator_example()
308 sys.settrace(None)
309 self.compare_events(generator_example.func_code.co_firstlineno,
310 tracer.events, generator_example.events)
311
Amaury Forgeot d'Arc316f8a82008-02-04 22:34:57 +0000312 def test_14_onliner_if(self):
313 def onliners():
314 if True: False
315 else: True
316 return 0
317 self.run_and_compare(
318 onliners,
319 [(0, 'call'),
320 (1, 'line'),
321 (3, 'line'),
322 (3, 'return')])
323
324 def test_15_loops(self):
325 # issue1750076: "while" expression is skipped by debugger
326 def for_example():
327 for x in range(2):
328 pass
329 self.run_and_compare(
330 for_example,
331 [(0, 'call'),
332 (1, 'line'),
333 (2, 'line'),
334 (1, 'line'),
335 (2, 'line'),
336 (1, 'line'),
337 (1, 'return')])
338
339 def while_example():
340 # While expression should be traced on every loop
341 x = 2
342 while x > 0:
343 x -= 1
344 self.run_and_compare(
345 while_example,
346 [(0, 'call'),
347 (2, 'line'),
348 (3, 'line'),
349 (4, 'line'),
350 (3, 'line'),
351 (4, 'line'),
352 (3, 'line'),
353 (3, 'return')])
354
Amaury Forgeot d'Arcbc212102008-02-04 23:51:55 +0000355 def test_16_blank_lines(self):
356 exec("def f():\n" + "\n" * 256 + " pass")
357 self.run_and_compare(
358 f,
359 [(0, 'call'),
360 (257, 'line'),
361 (257, 'return')])
362
363
Michael W. Hudsonfb4d6ec2002-10-02 13:13:45 +0000364class RaisingTraceFuncTestCase(unittest.TestCase):
Michael W. Hudson006c7522002-11-08 13:08:46 +0000365 def trace(self, frame, event, arg):
366 """A trace function that raises an exception in response to a
367 specific trace event."""
368 if event == self.raiseOnEvent:
Michael W. Hudsonfb4d6ec2002-10-02 13:13:45 +0000369 raise ValueError # just something that isn't RuntimeError
Michael W. Hudson006c7522002-11-08 13:08:46 +0000370 else:
371 return self.trace
Tim Peters3de75262002-11-09 05:26:15 +0000372
Michael W. Hudson006c7522002-11-08 13:08:46 +0000373 def f(self):
374 """The function to trace; raises an exception if that's the case
375 we're testing, so that the 'exception' trace event fires."""
376 if self.raiseOnEvent == 'exception':
377 x = 0
378 y = 1/x
379 else:
Michael W. Hudsonfb4d6ec2002-10-02 13:13:45 +0000380 return 1
Tim Peters3de75262002-11-09 05:26:15 +0000381
Michael W. Hudson006c7522002-11-08 13:08:46 +0000382 def run_test_for_event(self, event):
383 """Tests that an exception raised in response to the given event is
384 handled OK."""
385 self.raiseOnEvent = event
Michael W. Hudsonfb4d6ec2002-10-02 13:13:45 +0000386 try:
387 for i in xrange(sys.getrecursionlimit() + 1):
Michael W. Hudson006c7522002-11-08 13:08:46 +0000388 sys.settrace(self.trace)
Michael W. Hudsonfb4d6ec2002-10-02 13:13:45 +0000389 try:
Michael W. Hudson006c7522002-11-08 13:08:46 +0000390 self.f()
Michael W. Hudsonfb4d6ec2002-10-02 13:13:45 +0000391 except ValueError:
392 pass
393 else:
394 self.fail("exception not thrown!")
395 except RuntimeError:
396 self.fail("recursion counter not reset")
Tim Peters3de75262002-11-09 05:26:15 +0000397
Michael W. Hudson006c7522002-11-08 13:08:46 +0000398 # Test the handling of exceptions raised by each kind of trace event.
399 def test_call(self):
400 self.run_test_for_event('call')
401 def test_line(self):
402 self.run_test_for_event('line')
403 def test_return(self):
404 self.run_test_for_event('return')
405 def test_exception(self):
406 self.run_test_for_event('exception')
Michael W. Hudsonfb4d6ec2002-10-02 13:13:45 +0000407
Michael W. Hudson58ee2af2003-04-29 16:18:47 +0000408 def test_trash_stack(self):
409 def f():
410 for i in range(5):
411 print i # line tracing will raise an exception at this line
412
413 def g(frame, why, extra):
414 if (why == 'line' and
415 frame.f_lineno == f.func_code.co_firstlineno + 2):
416 raise RuntimeError, "i am crashing"
417 return g
418
419 sys.settrace(g)
420 try:
421 f()
422 except RuntimeError:
423 # the test is really that this doesn't segfault:
424 import gc
425 gc.collect()
426 else:
427 self.fail("exception not propagated")
428
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000429
430# 'Jump' tests: assigning to frame.f_lineno within a trace function
431# moves the execution position - it's how debuggers implement a Jump
432# command (aka. "Set next statement").
433
434class JumpTracer:
435 """Defines a trace function that jumps from one place to another,
436 with the source and destination lines of the jump being defined by
437 the 'jump' property of the function under test."""
438
439 def __init__(self, function):
440 self.function = function
441 self.jumpFrom = function.jump[0]
442 self.jumpTo = function.jump[1]
443 self.done = False
444
445 def trace(self, frame, event, arg):
446 if not self.done and frame.f_code == self.function.func_code:
447 firstLine = frame.f_code.co_firstlineno
448 if frame.f_lineno == firstLine + self.jumpFrom:
449 # Cope with non-integer self.jumpTo (because of
450 # no_jump_to_non_integers below).
451 try:
452 frame.f_lineno = firstLine + self.jumpTo
453 except TypeError:
454 frame.f_lineno = self.jumpTo
455 self.done = True
456 return self.trace
457
458# The first set of 'jump' tests are for things that are allowed:
459
460def jump_simple_forwards(output):
461 output.append(1)
462 output.append(2)
463 output.append(3)
464
465jump_simple_forwards.jump = (1, 3)
466jump_simple_forwards.output = [3]
467
468def jump_simple_backwards(output):
469 output.append(1)
470 output.append(2)
471
472jump_simple_backwards.jump = (2, 1)
473jump_simple_backwards.output = [1, 1, 2]
474
475def jump_out_of_block_forwards(output):
476 for i in 1, 2:
477 output.append(2)
478 for j in [3]: # Also tests jumping over a block
479 output.append(4)
480 output.append(5)
481
482jump_out_of_block_forwards.jump = (3, 5)
483jump_out_of_block_forwards.output = [2, 5]
484
485def jump_out_of_block_backwards(output):
486 output.append(1)
487 for i in [1]:
488 output.append(3)
489 for j in [2]: # Also tests jumping over a block
490 output.append(5)
491 output.append(6)
492 output.append(7)
493
494jump_out_of_block_backwards.jump = (6, 1)
495jump_out_of_block_backwards.output = [1, 3, 5, 1, 3, 5, 6, 7]
496
497def jump_to_codeless_line(output):
498 output.append(1)
499 # Jumping to this line should skip to the next one.
500 output.append(3)
501
502jump_to_codeless_line.jump = (1, 2)
503jump_to_codeless_line.output = [3]
504
505def jump_to_same_line(output):
506 output.append(1)
507 output.append(2)
508 output.append(3)
509
510jump_to_same_line.jump = (2, 2)
511jump_to_same_line.output = [1, 2, 3]
512
513# Tests jumping within a finally block, and over one.
514def jump_in_nested_finally(output):
515 try:
516 output.append(2)
517 finally:
518 output.append(4)
519 try:
520 output.append(6)
521 finally:
522 output.append(8)
523 output.append(9)
524
525jump_in_nested_finally.jump = (4, 9)
526jump_in_nested_finally.output = [2, 9]
527
528# The second set of 'jump' tests are for things that are not allowed:
529
530def no_jump_too_far_forwards(output):
531 try:
532 output.append(2)
533 output.append(3)
534 except ValueError, e:
535 output.append('after' in str(e))
536
537no_jump_too_far_forwards.jump = (3, 6)
538no_jump_too_far_forwards.output = [2, True]
539
540def no_jump_too_far_backwards(output):
541 try:
542 output.append(2)
543 output.append(3)
544 except ValueError, e:
545 output.append('before' in str(e))
546
547no_jump_too_far_backwards.jump = (3, -1)
548no_jump_too_far_backwards.output = [2, True]
549
550# Test each kind of 'except' line.
551def no_jump_to_except_1(output):
552 try:
553 output.append(2)
554 except:
555 e = sys.exc_info()[1]
556 output.append('except' in str(e))
557
558no_jump_to_except_1.jump = (2, 3)
559no_jump_to_except_1.output = [True]
560
561def no_jump_to_except_2(output):
562 try:
563 output.append(2)
564 except ValueError:
565 e = sys.exc_info()[1]
566 output.append('except' in str(e))
567
568no_jump_to_except_2.jump = (2, 3)
569no_jump_to_except_2.output = [True]
570
571def no_jump_to_except_3(output):
572 try:
573 output.append(2)
574 except ValueError, e:
575 output.append('except' in str(e))
576
577no_jump_to_except_3.jump = (2, 3)
578no_jump_to_except_3.output = [True]
579
580def no_jump_to_except_4(output):
581 try:
582 output.append(2)
583 except (ValueError, RuntimeError), e:
584 output.append('except' in str(e))
585
586no_jump_to_except_4.jump = (2, 3)
587no_jump_to_except_4.output = [True]
588
589def no_jump_forwards_into_block(output):
590 try:
591 output.append(2)
592 for i in 1, 2:
593 output.append(4)
594 except ValueError, e:
595 output.append('into' in str(e))
596
597no_jump_forwards_into_block.jump = (2, 4)
598no_jump_forwards_into_block.output = [True]
599
600def no_jump_backwards_into_block(output):
601 try:
602 for i in 1, 2:
603 output.append(3)
604 output.append(4)
605 except ValueError, e:
606 output.append('into' in str(e))
607
608no_jump_backwards_into_block.jump = (4, 3)
609no_jump_backwards_into_block.output = [3, 3, True]
610
611def no_jump_into_finally_block(output):
612 try:
613 try:
614 output.append(3)
615 x = 1
616 finally:
617 output.append(6)
618 except ValueError, e:
619 output.append('finally' in str(e))
620
621no_jump_into_finally_block.jump = (4, 6)
622no_jump_into_finally_block.output = [3, 6, True] # The 'finally' still runs
623
624def no_jump_out_of_finally_block(output):
625 try:
626 try:
627 output.append(3)
628 finally:
629 output.append(5)
630 output.append(6)
631 except ValueError, e:
632 output.append('finally' in str(e))
633
634no_jump_out_of_finally_block.jump = (5, 1)
635no_jump_out_of_finally_block.output = [3, True]
636
637# This verifies the line-numbers-must-be-integers rule.
638def no_jump_to_non_integers(output):
639 try:
640 output.append(2)
641 except ValueError, e:
642 output.append('integer' in str(e))
643
644no_jump_to_non_integers.jump = (2, "Spam")
645no_jump_to_non_integers.output = [True]
646
647# This verifies that you can't set f_lineno via _getframe or similar
648# trickery.
649def no_jump_without_trace_function():
650 try:
651 previous_frame = sys._getframe().f_back
652 previous_frame.f_lineno = previous_frame.f_lineno
653 except ValueError, e:
654 # This is the exception we wanted; make sure the error message
655 # talks about trace functions.
656 if 'trace' not in str(e):
657 raise
658 else:
659 # Something's wrong - the expected exception wasn't raised.
660 raise RuntimeError, "Trace-function-less jump failed to fail"
661
662
663class JumpTestCase(unittest.TestCase):
664 def compare_jump_output(self, expected, received):
665 if received != expected:
666 self.fail( "Outputs don't match:\n" +
667 "Expected: " + repr(expected) + "\n" +
668 "Received: " + repr(received))
669
670 def run_test(self, func):
671 tracer = JumpTracer(func)
672 sys.settrace(tracer.trace)
673 output = []
674 func(output)
675 sys.settrace(None)
676 self.compare_jump_output(func.output, output)
677
678 def test_01_jump_simple_forwards(self):
679 self.run_test(jump_simple_forwards)
680 def test_02_jump_simple_backwards(self):
681 self.run_test(jump_simple_backwards)
682 def test_03_jump_out_of_block_forwards(self):
683 self.run_test(jump_out_of_block_forwards)
684 def test_04_jump_out_of_block_backwards(self):
685 self.run_test(jump_out_of_block_backwards)
686 def test_05_jump_to_codeless_line(self):
687 self.run_test(jump_to_codeless_line)
688 def test_06_jump_to_same_line(self):
689 self.run_test(jump_to_same_line)
690 def test_07_jump_in_nested_finally(self):
691 self.run_test(jump_in_nested_finally)
692 def test_08_no_jump_too_far_forwards(self):
693 self.run_test(no_jump_too_far_forwards)
694 def test_09_no_jump_too_far_backwards(self):
695 self.run_test(no_jump_too_far_backwards)
Jeremy Hyltoned40ea12006-04-04 14:26:39 +0000696 def test_10_no_jump_to_except_1(self):
697 self.run_test(no_jump_to_except_1)
698 def test_11_no_jump_to_except_2(self):
699 self.run_test(no_jump_to_except_2)
700 def test_12_no_jump_to_except_3(self):
701 self.run_test(no_jump_to_except_3)
702 def test_13_no_jump_to_except_4(self):
703 self.run_test(no_jump_to_except_4)
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000704 def test_14_no_jump_forwards_into_block(self):
705 self.run_test(no_jump_forwards_into_block)
706 def test_15_no_jump_backwards_into_block(self):
707 self.run_test(no_jump_backwards_into_block)
708 def test_16_no_jump_into_finally_block(self):
709 self.run_test(no_jump_into_finally_block)
710 def test_17_no_jump_out_of_finally_block(self):
711 self.run_test(no_jump_out_of_finally_block)
712 def test_18_no_jump_to_non_integers(self):
713 self.run_test(no_jump_to_non_integers)
714 def test_19_no_jump_without_trace_function(self):
715 no_jump_without_trace_function()
716
Michael W. Hudson53d58bb2002-08-30 13:09:51 +0000717def test_main():
Walter Dörwald21d3a322003-05-01 17:45:56 +0000718 test_support.run_unittest(
719 TraceTestCase,
720 RaisingTraceFuncTestCase,
721 JumpTestCase
722 )
Michael W. Hudson53d58bb2002-08-30 13:09:51 +0000723
724if __name__ == "__main__":
725 test_main()