def test_incomplete_iterator(self): # SETUP code = """\ def gen(n): state = 'Starting' try: for i in range(n): yield i finally: state = 'Done' g = gen(999) x = next(g) """ expected_report = """\ n = 999 state = 'Starting' i = 0 yield 0 GeneratorExit state = 'Done' x = 0 """ tracer = CodeTracer() # EXEC report = tracer.trace_code(code) # VERIFY self.assertReportEqual(expected_report, report)
def test_set_attribute_item(self): # SETUP code = """\ class Shelf(object): pass shelf = Shelf() shelf.counts = {} shelf.counts[2] = 3 """ expected_report = """\ shelf.counts = {} shelf.counts[2] = 3 """ tracer = CodeTracer() # EXEC report = tracer.trace_code(code) # VERIFY self.assertReportEqual(expected_report, report)
def test_set_attribute_attribute(self): # SETUP code = """\ class foo(object): pass f = foo() f.child = foo() f.child.name = 'bob' """ expected_report = """\ f.child.name = 'bob' """ tracer = CodeTracer() # EXEC report = tracer.trace_code(code) # VERIFY self.assertReportEqual(expected_report, report)
def test_function_called_twice(self): # SETUP code = """\ def foo(): x = 2 return x + 10 n = foo() r = foo() """ expected_report = """\ | x = 2 | x = 2 return 12 | return 12 n = 12 r = 12 """ tracer = CodeTracer() # EXEC report = tracer.trace_code(code) # VERIFY self.assertReportEqual(expected_report, report)
def test_mutable(self): # SETUP code = """\ a = [1, 2, [3, 4]] a[0] = 9 a[2][1] = 8 i = 0 a[i] = 10 b = a a[0] += 1 """ expected_report = """\ a = [1, 2, [3, 4]] a[0] = 9 a[2][1] = 8 i = 0 a[?] = 10 b = [10, 2, [3, 8]] a[0] = 11 """ # EXEC report = CodeTracer().trace_code(code) # VERIFY self.assertMultiLineEqual(expected_report, report)
def test_print(self): # SETUP code = """\ s = 'x' print(s) """ expected_report_python2 = """\ s = 'x' print 'x' """ expected_report_python3 = """\ s = 'x' print('x') """ expected_report = (expected_report_python3 if version_info.major >= 3 else expected_report_python2) tracer = CodeTracer() # EXEC report = tracer.trace_code(code) # VERIFY self.assertEqual(expected_report.splitlines(), report.splitlines())
def test_slice(self): # SETUP code = """\ a = [1, 2, 3, 4, 5] a[1:4] = [20, 30] b = a a[2:] = [300] b = a a[:2] = [2000] b = a """ expected_report = """\ a = [1, 2, 3, 4, 5] a[1:4] = [20, 30] b = [1, 20, 30, 5] a[2:] = [300] b = [1, 20, 300] a[:2] = [2000] b = [2000, 300] """ # EXEC report = CodeTracer().trace_code(code) # VERIFY self.assertMultiLineEqual(expected_report, report)
def test_print_in_function(self): # SETUP code = """\ from __future__ import print_function def main(): s = 'Hello, World!' print(s) main() """ expected_report = """\ s = 'Hello, World!' print('Hello, World!') """ tracer = CodeTracer() # EXEC report = tracer.trace_code(code) # VERIFY self.assertReportEqual(expected_report, report)
def test_slice_magic(self): """ All augmented assignments on slices, possible with mocks. """ # SETUP code = """\ from mock import MagicMock class Foo(MagicMock): def __repr__(self): return 'Foo()' foo = Foo() foo[1] = 3 foo[1:10] = 3 foo[1:10:2] = 3 foo[...] = 3 foo[1, 2:3] = 3 foo[1:10] += 3 foo[1:10] -= 3 foo[1:10] *= 3 foo[1:10] /= 3 foo[1:10] //= 3 foo[1:10] %= 3 foo[1:10] **= 3 foo[1:10] >>= 3 foo[1:10] <<= 3 foo[1:10] &= 3 foo[1:10] ^= 3 foo[1:10] |= 3 """ expected_report = """\ foo = Foo() foo[1] = 3 foo[1:10] = 3 foo[1:10:2] = 3 foo[...] = 3 foo[1, 2:3] = 3 foo[1:10] += 3 foo[1:10] -= 3 foo[1:10] *= 3 foo[1:10] /= 3 foo[1:10] //= 3 foo[1:10] %= 3 foo[1:10] **= 3 foo[1:10] >>= 3 foo[1:10] <<= 3 foo[1:10] &= 3 foo[1:10] ^= 3 foo[1:10] |= 3 """ # EXEC report = CodeTracer().trace_code(code) # VERIFY self.assertReportEqual(expected_report, report)