def test_try_catch_has_assignment_for_name_2(self): scope = codegen.Scope() try_ = codegen.Try([], scope) name = scope.reserve_name('foo') # Add to 'except' try_.except_block.add_assignment(name, codegen.String('x')) self.assertFalse(try_.has_assignment_for_name(name)) # Add to 'else' try_.else_block.add_assignment(name, codegen.String('x'), allow_multiple=True) self.assertTrue(try_.has_assignment_for_name(name))
def test_try_catch_multiple_exceptions(self): scope = codegen.Scope() scope.reserve_name('MyError') scope.reserve_name('OtherError') try_ = codegen.Try([scope.variable('MyError'), scope.variable('OtherError')], scope) self.assertCodeEqual(as_source_code(try_), """ try: pass except (MyError, OtherError): pass """)
def test_try_catch_has_assignment_for_name_1(self): scope = codegen.Scope() try_ = codegen.Try([], scope) name = scope.reserve_name('foo') self.assertFalse(try_.has_assignment_for_name(name)) # Just add to 'try' block try_.try_block.add_assignment(name, codegen.String('x')) # Not all branches define name, so overall can't trust the name # to be defined at the end. self.assertFalse(try_.has_assignment_for_name(name)) # Now add to 'except' block as well try_.except_block.add_assignment(name, codegen.String('x'), allow_multiple=True) self.assertTrue(try_.has_assignment_for_name(name))
def test_multiple_add_assignment_in_inherited_scope(self): # try/if etc inherit their scope from function scope = codegen.Scope() scope.reserve_name('myfunc') func = codegen.Function('myfunc', args=[], parent_scope=scope) try_ = codegen.Try([], func) name = func.reserve_name('name') # We'd really like to ensure no multiple assignments ever, # but the way that if/try etc. work make that hard. # Instead, we add a keyword argument to allow the second assignment. try_.try_block.add_assignment(name, codegen.Number(1)) self.assertRaises(AssertionError, try_.try_block.add_assignment, name, codegen.Number(2)) self.assertRaises(AssertionError, try_.except_block.add_assignment, name, codegen.Number(2)) try_.except_block.add_assignment(name, codegen.Number(2), allow_multiple=True)
def test_try_catch(self): scope = codegen.Scope() scope.reserve_name('MyError') try_ = codegen.Try([scope.variable('MyError')], scope) self.assertCodeEqual(as_source_code(try_), """ try: pass except MyError: pass """) scope.reserve_name('x') scope.reserve_name('y') scope.reserve_name('z') try_.try_block.add_assignment('x', codegen.String("x")) try_.except_block.add_assignment('y', codegen.String("y")) try_.else_block.add_assignment('z', codegen.String("z")) self.assertCodeEqual(as_source_code(try_), """ try: x = 'x' except MyError: y = 'y' else: z = 'z' """)