blob: 6ad38d103ad97980dd9f12ac2c8e3b73db7b2956 [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'Arc0d75f092007-11-13 21:54:28 +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'Arc0d75f092007-11-13 21:54:28 +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'Arc0d75f092007-11-13 21:54:28 +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'Arc6fd03bb2008-02-04 21:45:05 +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'Arc6fd03bb2008-02-04 21:45:05 +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
Georg Brandl56112892008-01-20 13:59:46 +0000273 def set_and_retrieve_none(self):
274 sys.settrace(None)
275 assert sys.gettrace() is None
276
277 def set_and_retrieve_func(self):
278 def fn(*args):
279 pass
280
281 sys.settrace(fn)
282 try:
283 assert sys.gettrace() is fn
284 finally:
285 sys.settrace(None)
286
Nicholas Bastinaea94592004-03-22 18:30:42 +0000287 def test_01_basic(self):
Michael W. Hudson53d58bb2002-08-30 13:09:51 +0000288 self.run_test(basic)
Jeremy Hyltoned40ea12006-04-04 14:26:39 +0000289 def test_02_arigo(self):
290 self.run_test(arigo_example)
Nicholas Bastinaea94592004-03-22 18:30:42 +0000291 def test_03_one_instr(self):
Michael W. Hudson53d58bb2002-08-30 13:09:51 +0000292 self.run_test(one_instr_line)
Jeremy Hyltoned40ea12006-04-04 14:26:39 +0000293 def test_04_no_pop_blocks(self):
294 self.run_test(no_pop_blocks)
Neal Norwitz4ffedad2006-08-04 04:58:47 +0000295 def test_05_no_pop_tops(self):
296 self.run_test(no_pop_tops)
Nicholas Bastinaea94592004-03-22 18:30:42 +0000297 def test_06_call(self):
Michael W. Hudson519a3422002-09-11 14:47:51 +0000298 self.run_test(call)
Nicholas Bastinaea94592004-03-22 18:30:42 +0000299 def test_07_raise(self):
Michael W. Hudson519a3422002-09-11 14:47:51 +0000300 self.run_test(test_raise)
301
Nicholas Bastinaea94592004-03-22 18:30:42 +0000302 def test_08_settrace_and_return(self):
Michael W. Hudson519a3422002-09-11 14:47:51 +0000303 self.run_test2(settrace_and_return)
Nicholas Bastinaea94592004-03-22 18:30:42 +0000304 def test_09_settrace_and_raise(self):
Michael W. Hudson519a3422002-09-11 14:47:51 +0000305 self.run_test2(settrace_and_raise)
Jeremy Hyltoned40ea12006-04-04 14:26:39 +0000306 def test_10_ireturn(self):
307 self.run_test(ireturn_example)
Nicholas Bastinfa7bec72004-03-22 19:21:47 +0000308 def test_11_tightloop(self):
309 self.run_test(tightloop_example)
Armin Rigo70693382004-03-22 19:30:39 +0000310 def test_12_tighterloop(self):
311 self.run_test(tighterloop_example)
Michael W. Hudson53d58bb2002-08-30 13:09:51 +0000312
Amaury Forgeot d'Arc0d75f092007-11-13 21:54:28 +0000313 def test_13_genexp(self):
314 self.run_test(generator_example)
315 # issue1265: if the trace function contains a generator,
316 # and if the traced function contains another generator
317 # that is not completely exhausted, the trace stopped.
318 # Worse: the 'finally' clause was not invoked.
319 tracer = Tracer()
320 sys.settrace(tracer.traceWithGenexp)
321 generator_example()
322 sys.settrace(None)
323 self.compare_events(generator_example.__code__.co_firstlineno,
324 tracer.events, generator_example.events)
325
Amaury Forgeot d'Arc6fd03bb2008-02-04 21:45:05 +0000326 def test_14_onliner_if(self):
327 def onliners():
328 if True: False
329 else: True
330 return 0
331 self.run_and_compare(
332 onliners,
333 [(0, 'call'),
334 (1, 'line'),
335 (3, 'line'),
336 (3, 'return')])
337
338 def test_15_loops(self):
339 # issue1750076: "while" expression is skipped by debugger
340 def for_example():
341 for x in range(2):
342 pass
343 self.run_and_compare(
344 for_example,
345 [(0, 'call'),
346 (1, 'line'),
347 (2, 'line'),
348 (1, 'line'),
349 (2, 'line'),
350 (1, 'line'),
351 (1, 'return')])
352
353 def while_example():
354 # While expression should be traced on every loop
355 x = 2
356 while x > 0:
357 x -= 1
358 self.run_and_compare(
359 while_example,
360 [(0, 'call'),
361 (2, 'line'),
362 (3, 'line'),
363 (4, 'line'),
364 (3, 'line'),
365 (4, 'line'),
366 (3, 'line'),
367 (3, 'return')])
368
Amaury Forgeot d'Arc99af7db2008-02-05 00:26:21 +0000369 def test_16_blank_lines(self):
370 exec("def f():\n" + "\n" * 256 + " pass")
371 self.run_and_compare(
372 f,
373 [(0, 'call'),
374 (257, 'line'),
375 (257, 'return')])
376
377
Michael W. Hudsonfb4d6ec2002-10-02 13:13:45 +0000378class RaisingTraceFuncTestCase(unittest.TestCase):
Michael W. Hudson006c7522002-11-08 13:08:46 +0000379 def trace(self, frame, event, arg):
380 """A trace function that raises an exception in response to a
381 specific trace event."""
382 if event == self.raiseOnEvent:
Michael W. Hudsonfb4d6ec2002-10-02 13:13:45 +0000383 raise ValueError # just something that isn't RuntimeError
Michael W. Hudson006c7522002-11-08 13:08:46 +0000384 else:
385 return self.trace
Tim Peters3de75262002-11-09 05:26:15 +0000386
Michael W. Hudson006c7522002-11-08 13:08:46 +0000387 def f(self):
388 """The function to trace; raises an exception if that's the case
389 we're testing, so that the 'exception' trace event fires."""
390 if self.raiseOnEvent == 'exception':
391 x = 0
392 y = 1/x
393 else:
Michael W. Hudsonfb4d6ec2002-10-02 13:13:45 +0000394 return 1
Tim Peters3de75262002-11-09 05:26:15 +0000395
Michael W. Hudson006c7522002-11-08 13:08:46 +0000396 def run_test_for_event(self, event):
397 """Tests that an exception raised in response to the given event is
398 handled OK."""
399 self.raiseOnEvent = event
Michael W. Hudsonfb4d6ec2002-10-02 13:13:45 +0000400 try:
401 for i in xrange(sys.getrecursionlimit() + 1):
Michael W. Hudson006c7522002-11-08 13:08:46 +0000402 sys.settrace(self.trace)
Michael W. Hudsonfb4d6ec2002-10-02 13:13:45 +0000403 try:
Michael W. Hudson006c7522002-11-08 13:08:46 +0000404 self.f()
Michael W. Hudsonfb4d6ec2002-10-02 13:13:45 +0000405 except ValueError:
406 pass
407 else:
408 self.fail("exception not thrown!")
409 except RuntimeError:
410 self.fail("recursion counter not reset")
Tim Peters3de75262002-11-09 05:26:15 +0000411
Michael W. Hudson006c7522002-11-08 13:08:46 +0000412 # Test the handling of exceptions raised by each kind of trace event.
413 def test_call(self):
414 self.run_test_for_event('call')
415 def test_line(self):
416 self.run_test_for_event('line')
417 def test_return(self):
418 self.run_test_for_event('return')
419 def test_exception(self):
420 self.run_test_for_event('exception')
Michael W. Hudsonfb4d6ec2002-10-02 13:13:45 +0000421
Michael W. Hudson58ee2af2003-04-29 16:18:47 +0000422 def test_trash_stack(self):
423 def f():
424 for i in range(5):
425 print i # line tracing will raise an exception at this line
426
427 def g(frame, why, extra):
428 if (why == 'line' and
429 frame.f_lineno == f.func_code.co_firstlineno + 2):
430 raise RuntimeError, "i am crashing"
431 return g
432
433 sys.settrace(g)
434 try:
435 f()
436 except RuntimeError:
437 # the test is really that this doesn't segfault:
438 import gc
439 gc.collect()
440 else:
441 self.fail("exception not propagated")
442
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000443
444# 'Jump' tests: assigning to frame.f_lineno within a trace function
445# moves the execution position - it's how debuggers implement a Jump
446# command (aka. "Set next statement").
447
448class JumpTracer:
449 """Defines a trace function that jumps from one place to another,
450 with the source and destination lines of the jump being defined by
451 the 'jump' property of the function under test."""
452
453 def __init__(self, function):
454 self.function = function
455 self.jumpFrom = function.jump[0]
456 self.jumpTo = function.jump[1]
457 self.done = False
458
459 def trace(self, frame, event, arg):
460 if not self.done and frame.f_code == self.function.func_code:
461 firstLine = frame.f_code.co_firstlineno
462 if frame.f_lineno == firstLine + self.jumpFrom:
463 # Cope with non-integer self.jumpTo (because of
464 # no_jump_to_non_integers below).
465 try:
466 frame.f_lineno = firstLine + self.jumpTo
467 except TypeError:
468 frame.f_lineno = self.jumpTo
469 self.done = True
470 return self.trace
471
472# The first set of 'jump' tests are for things that are allowed:
473
474def jump_simple_forwards(output):
475 output.append(1)
476 output.append(2)
477 output.append(3)
478
479jump_simple_forwards.jump = (1, 3)
480jump_simple_forwards.output = [3]
481
482def jump_simple_backwards(output):
483 output.append(1)
484 output.append(2)
485
486jump_simple_backwards.jump = (2, 1)
487jump_simple_backwards.output = [1, 1, 2]
488
489def jump_out_of_block_forwards(output):
490 for i in 1, 2:
491 output.append(2)
492 for j in [3]: # Also tests jumping over a block
493 output.append(4)
494 output.append(5)
495
496jump_out_of_block_forwards.jump = (3, 5)
497jump_out_of_block_forwards.output = [2, 5]
498
499def jump_out_of_block_backwards(output):
500 output.append(1)
501 for i in [1]:
502 output.append(3)
503 for j in [2]: # Also tests jumping over a block
504 output.append(5)
505 output.append(6)
506 output.append(7)
507
508jump_out_of_block_backwards.jump = (6, 1)
509jump_out_of_block_backwards.output = [1, 3, 5, 1, 3, 5, 6, 7]
510
511def jump_to_codeless_line(output):
512 output.append(1)
513 # Jumping to this line should skip to the next one.
514 output.append(3)
515
516jump_to_codeless_line.jump = (1, 2)
517jump_to_codeless_line.output = [3]
518
519def jump_to_same_line(output):
520 output.append(1)
521 output.append(2)
522 output.append(3)
523
524jump_to_same_line.jump = (2, 2)
525jump_to_same_line.output = [1, 2, 3]
526
527# Tests jumping within a finally block, and over one.
528def jump_in_nested_finally(output):
529 try:
530 output.append(2)
531 finally:
532 output.append(4)
533 try:
534 output.append(6)
535 finally:
536 output.append(8)
537 output.append(9)
538
539jump_in_nested_finally.jump = (4, 9)
540jump_in_nested_finally.output = [2, 9]
541
542# The second set of 'jump' tests are for things that are not allowed:
543
544def no_jump_too_far_forwards(output):
545 try:
546 output.append(2)
547 output.append(3)
548 except ValueError, e:
549 output.append('after' in str(e))
550
551no_jump_too_far_forwards.jump = (3, 6)
552no_jump_too_far_forwards.output = [2, True]
553
554def no_jump_too_far_backwards(output):
555 try:
556 output.append(2)
557 output.append(3)
558 except ValueError, e:
559 output.append('before' in str(e))
560
561no_jump_too_far_backwards.jump = (3, -1)
562no_jump_too_far_backwards.output = [2, True]
563
564# Test each kind of 'except' line.
565def no_jump_to_except_1(output):
566 try:
567 output.append(2)
568 except:
569 e = sys.exc_info()[1]
570 output.append('except' in str(e))
571
572no_jump_to_except_1.jump = (2, 3)
573no_jump_to_except_1.output = [True]
574
575def no_jump_to_except_2(output):
576 try:
577 output.append(2)
578 except ValueError:
579 e = sys.exc_info()[1]
580 output.append('except' in str(e))
581
582no_jump_to_except_2.jump = (2, 3)
583no_jump_to_except_2.output = [True]
584
585def no_jump_to_except_3(output):
586 try:
587 output.append(2)
588 except ValueError, e:
589 output.append('except' in str(e))
590
591no_jump_to_except_3.jump = (2, 3)
592no_jump_to_except_3.output = [True]
593
594def no_jump_to_except_4(output):
595 try:
596 output.append(2)
597 except (ValueError, RuntimeError), e:
598 output.append('except' in str(e))
599
600no_jump_to_except_4.jump = (2, 3)
601no_jump_to_except_4.output = [True]
602
603def no_jump_forwards_into_block(output):
604 try:
605 output.append(2)
606 for i in 1, 2:
607 output.append(4)
608 except ValueError, e:
609 output.append('into' in str(e))
610
611no_jump_forwards_into_block.jump = (2, 4)
612no_jump_forwards_into_block.output = [True]
613
614def no_jump_backwards_into_block(output):
615 try:
616 for i in 1, 2:
617 output.append(3)
618 output.append(4)
619 except ValueError, e:
620 output.append('into' in str(e))
621
622no_jump_backwards_into_block.jump = (4, 3)
623no_jump_backwards_into_block.output = [3, 3, True]
624
625def no_jump_into_finally_block(output):
626 try:
627 try:
628 output.append(3)
629 x = 1
630 finally:
631 output.append(6)
632 except ValueError, e:
633 output.append('finally' in str(e))
634
635no_jump_into_finally_block.jump = (4, 6)
636no_jump_into_finally_block.output = [3, 6, True] # The 'finally' still runs
637
638def no_jump_out_of_finally_block(output):
639 try:
640 try:
641 output.append(3)
642 finally:
643 output.append(5)
644 output.append(6)
645 except ValueError, e:
646 output.append('finally' in str(e))
647
648no_jump_out_of_finally_block.jump = (5, 1)
649no_jump_out_of_finally_block.output = [3, True]
650
651# This verifies the line-numbers-must-be-integers rule.
652def no_jump_to_non_integers(output):
653 try:
654 output.append(2)
655 except ValueError, e:
656 output.append('integer' in str(e))
657
658no_jump_to_non_integers.jump = (2, "Spam")
659no_jump_to_non_integers.output = [True]
660
661# This verifies that you can't set f_lineno via _getframe or similar
662# trickery.
663def no_jump_without_trace_function():
664 try:
665 previous_frame = sys._getframe().f_back
666 previous_frame.f_lineno = previous_frame.f_lineno
667 except ValueError, e:
668 # This is the exception we wanted; make sure the error message
669 # talks about trace functions.
670 if 'trace' not in str(e):
671 raise
672 else:
673 # Something's wrong - the expected exception wasn't raised.
674 raise RuntimeError, "Trace-function-less jump failed to fail"
675
676
677class JumpTestCase(unittest.TestCase):
678 def compare_jump_output(self, expected, received):
679 if received != expected:
680 self.fail( "Outputs don't match:\n" +
681 "Expected: " + repr(expected) + "\n" +
682 "Received: " + repr(received))
683
684 def run_test(self, func):
685 tracer = JumpTracer(func)
686 sys.settrace(tracer.trace)
687 output = []
688 func(output)
689 sys.settrace(None)
690 self.compare_jump_output(func.output, output)
691
692 def test_01_jump_simple_forwards(self):
693 self.run_test(jump_simple_forwards)
694 def test_02_jump_simple_backwards(self):
695 self.run_test(jump_simple_backwards)
696 def test_03_jump_out_of_block_forwards(self):
697 self.run_test(jump_out_of_block_forwards)
698 def test_04_jump_out_of_block_backwards(self):
699 self.run_test(jump_out_of_block_backwards)
700 def test_05_jump_to_codeless_line(self):
701 self.run_test(jump_to_codeless_line)
702 def test_06_jump_to_same_line(self):
703 self.run_test(jump_to_same_line)
704 def test_07_jump_in_nested_finally(self):
705 self.run_test(jump_in_nested_finally)
706 def test_08_no_jump_too_far_forwards(self):
707 self.run_test(no_jump_too_far_forwards)
708 def test_09_no_jump_too_far_backwards(self):
709 self.run_test(no_jump_too_far_backwards)
Jeremy Hyltoned40ea12006-04-04 14:26:39 +0000710 def test_10_no_jump_to_except_1(self):
711 self.run_test(no_jump_to_except_1)
712 def test_11_no_jump_to_except_2(self):
713 self.run_test(no_jump_to_except_2)
714 def test_12_no_jump_to_except_3(self):
715 self.run_test(no_jump_to_except_3)
716 def test_13_no_jump_to_except_4(self):
717 self.run_test(no_jump_to_except_4)
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000718 def test_14_no_jump_forwards_into_block(self):
719 self.run_test(no_jump_forwards_into_block)
720 def test_15_no_jump_backwards_into_block(self):
721 self.run_test(no_jump_backwards_into_block)
722 def test_16_no_jump_into_finally_block(self):
723 self.run_test(no_jump_into_finally_block)
724 def test_17_no_jump_out_of_finally_block(self):
725 self.run_test(no_jump_out_of_finally_block)
726 def test_18_no_jump_to_non_integers(self):
727 self.run_test(no_jump_to_non_integers)
728 def test_19_no_jump_without_trace_function(self):
729 no_jump_without_trace_function()
730
Michael W. Hudson53d58bb2002-08-30 13:09:51 +0000731def test_main():
Walter Dörwald21d3a322003-05-01 17:45:56 +0000732 test_support.run_unittest(
733 TraceTestCase,
734 RaisingTraceFuncTestCase,
735 JumpTestCase
736 )
Michael W. Hudson53d58bb2002-08-30 13:09:51 +0000737
738if __name__ == "__main__":
739 test_main()