blob: 64dca9fd0cd9f3da90ab21cd8a084e845ed491bf [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
Michael W. Hudsonfb4d6ec2002-10-02 13:13:45 +0000355class RaisingTraceFuncTestCase(unittest.TestCase):
Michael W. Hudson006c7522002-11-08 13:08:46 +0000356 def trace(self, frame, event, arg):
357 """A trace function that raises an exception in response to a
358 specific trace event."""
359 if event == self.raiseOnEvent:
Michael W. Hudsonfb4d6ec2002-10-02 13:13:45 +0000360 raise ValueError # just something that isn't RuntimeError
Michael W. Hudson006c7522002-11-08 13:08:46 +0000361 else:
362 return self.trace
Tim Peters3de75262002-11-09 05:26:15 +0000363
Michael W. Hudson006c7522002-11-08 13:08:46 +0000364 def f(self):
365 """The function to trace; raises an exception if that's the case
366 we're testing, so that the 'exception' trace event fires."""
367 if self.raiseOnEvent == 'exception':
368 x = 0
369 y = 1/x
370 else:
Michael W. Hudsonfb4d6ec2002-10-02 13:13:45 +0000371 return 1
Tim Peters3de75262002-11-09 05:26:15 +0000372
Michael W. Hudson006c7522002-11-08 13:08:46 +0000373 def run_test_for_event(self, event):
374 """Tests that an exception raised in response to the given event is
375 handled OK."""
376 self.raiseOnEvent = event
Michael W. Hudsonfb4d6ec2002-10-02 13:13:45 +0000377 try:
378 for i in xrange(sys.getrecursionlimit() + 1):
Michael W. Hudson006c7522002-11-08 13:08:46 +0000379 sys.settrace(self.trace)
Michael W. Hudsonfb4d6ec2002-10-02 13:13:45 +0000380 try:
Michael W. Hudson006c7522002-11-08 13:08:46 +0000381 self.f()
Michael W. Hudsonfb4d6ec2002-10-02 13:13:45 +0000382 except ValueError:
383 pass
384 else:
385 self.fail("exception not thrown!")
386 except RuntimeError:
387 self.fail("recursion counter not reset")
Tim Peters3de75262002-11-09 05:26:15 +0000388
Michael W. Hudson006c7522002-11-08 13:08:46 +0000389 # Test the handling of exceptions raised by each kind of trace event.
390 def test_call(self):
391 self.run_test_for_event('call')
392 def test_line(self):
393 self.run_test_for_event('line')
394 def test_return(self):
395 self.run_test_for_event('return')
396 def test_exception(self):
397 self.run_test_for_event('exception')
Michael W. Hudsonfb4d6ec2002-10-02 13:13:45 +0000398
Michael W. Hudson58ee2af2003-04-29 16:18:47 +0000399 def test_trash_stack(self):
400 def f():
401 for i in range(5):
402 print i # line tracing will raise an exception at this line
403
404 def g(frame, why, extra):
405 if (why == 'line' and
406 frame.f_lineno == f.func_code.co_firstlineno + 2):
407 raise RuntimeError, "i am crashing"
408 return g
409
410 sys.settrace(g)
411 try:
412 f()
413 except RuntimeError:
414 # the test is really that this doesn't segfault:
415 import gc
416 gc.collect()
417 else:
418 self.fail("exception not propagated")
419
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000420
421# 'Jump' tests: assigning to frame.f_lineno within a trace function
422# moves the execution position - it's how debuggers implement a Jump
423# command (aka. "Set next statement").
424
425class JumpTracer:
426 """Defines a trace function that jumps from one place to another,
427 with the source and destination lines of the jump being defined by
428 the 'jump' property of the function under test."""
429
430 def __init__(self, function):
431 self.function = function
432 self.jumpFrom = function.jump[0]
433 self.jumpTo = function.jump[1]
434 self.done = False
435
436 def trace(self, frame, event, arg):
437 if not self.done and frame.f_code == self.function.func_code:
438 firstLine = frame.f_code.co_firstlineno
439 if frame.f_lineno == firstLine + self.jumpFrom:
440 # Cope with non-integer self.jumpTo (because of
441 # no_jump_to_non_integers below).
442 try:
443 frame.f_lineno = firstLine + self.jumpTo
444 except TypeError:
445 frame.f_lineno = self.jumpTo
446 self.done = True
447 return self.trace
448
449# The first set of 'jump' tests are for things that are allowed:
450
451def jump_simple_forwards(output):
452 output.append(1)
453 output.append(2)
454 output.append(3)
455
456jump_simple_forwards.jump = (1, 3)
457jump_simple_forwards.output = [3]
458
459def jump_simple_backwards(output):
460 output.append(1)
461 output.append(2)
462
463jump_simple_backwards.jump = (2, 1)
464jump_simple_backwards.output = [1, 1, 2]
465
466def jump_out_of_block_forwards(output):
467 for i in 1, 2:
468 output.append(2)
469 for j in [3]: # Also tests jumping over a block
470 output.append(4)
471 output.append(5)
472
473jump_out_of_block_forwards.jump = (3, 5)
474jump_out_of_block_forwards.output = [2, 5]
475
476def jump_out_of_block_backwards(output):
477 output.append(1)
478 for i in [1]:
479 output.append(3)
480 for j in [2]: # Also tests jumping over a block
481 output.append(5)
482 output.append(6)
483 output.append(7)
484
485jump_out_of_block_backwards.jump = (6, 1)
486jump_out_of_block_backwards.output = [1, 3, 5, 1, 3, 5, 6, 7]
487
488def jump_to_codeless_line(output):
489 output.append(1)
490 # Jumping to this line should skip to the next one.
491 output.append(3)
492
493jump_to_codeless_line.jump = (1, 2)
494jump_to_codeless_line.output = [3]
495
496def jump_to_same_line(output):
497 output.append(1)
498 output.append(2)
499 output.append(3)
500
501jump_to_same_line.jump = (2, 2)
502jump_to_same_line.output = [1, 2, 3]
503
504# Tests jumping within a finally block, and over one.
505def jump_in_nested_finally(output):
506 try:
507 output.append(2)
508 finally:
509 output.append(4)
510 try:
511 output.append(6)
512 finally:
513 output.append(8)
514 output.append(9)
515
516jump_in_nested_finally.jump = (4, 9)
517jump_in_nested_finally.output = [2, 9]
518
519# The second set of 'jump' tests are for things that are not allowed:
520
521def no_jump_too_far_forwards(output):
522 try:
523 output.append(2)
524 output.append(3)
525 except ValueError, e:
526 output.append('after' in str(e))
527
528no_jump_too_far_forwards.jump = (3, 6)
529no_jump_too_far_forwards.output = [2, True]
530
531def no_jump_too_far_backwards(output):
532 try:
533 output.append(2)
534 output.append(3)
535 except ValueError, e:
536 output.append('before' in str(e))
537
538no_jump_too_far_backwards.jump = (3, -1)
539no_jump_too_far_backwards.output = [2, True]
540
541# Test each kind of 'except' line.
542def no_jump_to_except_1(output):
543 try:
544 output.append(2)
545 except:
546 e = sys.exc_info()[1]
547 output.append('except' in str(e))
548
549no_jump_to_except_1.jump = (2, 3)
550no_jump_to_except_1.output = [True]
551
552def no_jump_to_except_2(output):
553 try:
554 output.append(2)
555 except ValueError:
556 e = sys.exc_info()[1]
557 output.append('except' in str(e))
558
559no_jump_to_except_2.jump = (2, 3)
560no_jump_to_except_2.output = [True]
561
562def no_jump_to_except_3(output):
563 try:
564 output.append(2)
565 except ValueError, e:
566 output.append('except' in str(e))
567
568no_jump_to_except_3.jump = (2, 3)
569no_jump_to_except_3.output = [True]
570
571def no_jump_to_except_4(output):
572 try:
573 output.append(2)
574 except (ValueError, RuntimeError), e:
575 output.append('except' in str(e))
576
577no_jump_to_except_4.jump = (2, 3)
578no_jump_to_except_4.output = [True]
579
580def no_jump_forwards_into_block(output):
581 try:
582 output.append(2)
583 for i in 1, 2:
584 output.append(4)
585 except ValueError, e:
586 output.append('into' in str(e))
587
588no_jump_forwards_into_block.jump = (2, 4)
589no_jump_forwards_into_block.output = [True]
590
591def no_jump_backwards_into_block(output):
592 try:
593 for i in 1, 2:
594 output.append(3)
595 output.append(4)
596 except ValueError, e:
597 output.append('into' in str(e))
598
599no_jump_backwards_into_block.jump = (4, 3)
600no_jump_backwards_into_block.output = [3, 3, True]
601
602def no_jump_into_finally_block(output):
603 try:
604 try:
605 output.append(3)
606 x = 1
607 finally:
608 output.append(6)
609 except ValueError, e:
610 output.append('finally' in str(e))
611
612no_jump_into_finally_block.jump = (4, 6)
613no_jump_into_finally_block.output = [3, 6, True] # The 'finally' still runs
614
615def no_jump_out_of_finally_block(output):
616 try:
617 try:
618 output.append(3)
619 finally:
620 output.append(5)
621 output.append(6)
622 except ValueError, e:
623 output.append('finally' in str(e))
624
625no_jump_out_of_finally_block.jump = (5, 1)
626no_jump_out_of_finally_block.output = [3, True]
627
628# This verifies the line-numbers-must-be-integers rule.
629def no_jump_to_non_integers(output):
630 try:
631 output.append(2)
632 except ValueError, e:
633 output.append('integer' in str(e))
634
635no_jump_to_non_integers.jump = (2, "Spam")
636no_jump_to_non_integers.output = [True]
637
638# This verifies that you can't set f_lineno via _getframe or similar
639# trickery.
640def no_jump_without_trace_function():
641 try:
642 previous_frame = sys._getframe().f_back
643 previous_frame.f_lineno = previous_frame.f_lineno
644 except ValueError, e:
645 # This is the exception we wanted; make sure the error message
646 # talks about trace functions.
647 if 'trace' not in str(e):
648 raise
649 else:
650 # Something's wrong - the expected exception wasn't raised.
651 raise RuntimeError, "Trace-function-less jump failed to fail"
652
653
654class JumpTestCase(unittest.TestCase):
655 def compare_jump_output(self, expected, received):
656 if received != expected:
657 self.fail( "Outputs don't match:\n" +
658 "Expected: " + repr(expected) + "\n" +
659 "Received: " + repr(received))
660
661 def run_test(self, func):
662 tracer = JumpTracer(func)
663 sys.settrace(tracer.trace)
664 output = []
665 func(output)
666 sys.settrace(None)
667 self.compare_jump_output(func.output, output)
668
669 def test_01_jump_simple_forwards(self):
670 self.run_test(jump_simple_forwards)
671 def test_02_jump_simple_backwards(self):
672 self.run_test(jump_simple_backwards)
673 def test_03_jump_out_of_block_forwards(self):
674 self.run_test(jump_out_of_block_forwards)
675 def test_04_jump_out_of_block_backwards(self):
676 self.run_test(jump_out_of_block_backwards)
677 def test_05_jump_to_codeless_line(self):
678 self.run_test(jump_to_codeless_line)
679 def test_06_jump_to_same_line(self):
680 self.run_test(jump_to_same_line)
681 def test_07_jump_in_nested_finally(self):
682 self.run_test(jump_in_nested_finally)
683 def test_08_no_jump_too_far_forwards(self):
684 self.run_test(no_jump_too_far_forwards)
685 def test_09_no_jump_too_far_backwards(self):
686 self.run_test(no_jump_too_far_backwards)
Jeremy Hyltoned40ea12006-04-04 14:26:39 +0000687 def test_10_no_jump_to_except_1(self):
688 self.run_test(no_jump_to_except_1)
689 def test_11_no_jump_to_except_2(self):
690 self.run_test(no_jump_to_except_2)
691 def test_12_no_jump_to_except_3(self):
692 self.run_test(no_jump_to_except_3)
693 def test_13_no_jump_to_except_4(self):
694 self.run_test(no_jump_to_except_4)
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000695 def test_14_no_jump_forwards_into_block(self):
696 self.run_test(no_jump_forwards_into_block)
697 def test_15_no_jump_backwards_into_block(self):
698 self.run_test(no_jump_backwards_into_block)
699 def test_16_no_jump_into_finally_block(self):
700 self.run_test(no_jump_into_finally_block)
701 def test_17_no_jump_out_of_finally_block(self):
702 self.run_test(no_jump_out_of_finally_block)
703 def test_18_no_jump_to_non_integers(self):
704 self.run_test(no_jump_to_non_integers)
705 def test_19_no_jump_without_trace_function(self):
706 no_jump_without_trace_function()
707
Michael W. Hudson53d58bb2002-08-30 13:09:51 +0000708def test_main():
Walter Dörwald21d3a322003-05-01 17:45:56 +0000709 test_support.run_unittest(
710 TraceTestCase,
711 RaisingTraceFuncTestCase,
712 JumpTestCase
713 )
Michael W. Hudson53d58bb2002-08-30 13:09:51 +0000714
715if __name__ == "__main__":
716 test_main()