def test_function(self):
     module = codegen.Module()
     func = codegen.Function('myfunc', args=['myarg1', 'myarg2'],
                             parent_scope=module.scope)
     self.assertCodeEqual(as_source_code(func), """
         def myfunc(myarg1, myarg2):
             pass
     """)
 def test_reserve_name_function_arg(self):
     scope = codegen.Scope()
     scope.reserve_function_arg_name('arg_name')
     scope.reserve_name('myfunc')
     func = codegen.Function('myfunc',
                             args=['arg_name'],
                             parent_scope=scope)
     self.assertNotIn('arg_name2', func.all_reserved_names())
 def test_function_return(self):
     module = codegen.Module()
     func = codegen.Function('myfunc',
                             parent_scope=module)
     func.add_return(codegen.String("Hello"))
     self.assertCodeEqual(as_source_code(func), """
         def myfunc():
             return 'Hello'
     """)
 def test_add_function(self):
     module = codegen.Module()
     func_name = module.scope.reserve_name('myfunc')
     func = codegen.Function(func_name,
                             parent_scope=module)
     module.add_function(func_name, func)
     self.assertCodeEqual(as_source_code(module), """
         def myfunc():
             pass
     """)
 def test_function_args_name_reserved_check(self):
     module = codegen.Module()
     module.scope.reserve_function_arg_name('my_arg')
     func_name = module.scope.reserve_name('myfunc')
     func = codegen.Function(func_name, args=['my_arg'],
                             parent_scope=module.scope)
     func.add_return(func.variable('my_arg'))
     self.assertCodeEqual(as_source_code(func), """
         def myfunc(my_arg):
             return my_arg
     """)
 def test_variable_reference_function_arg_check(self):
     scope = codegen.Scope()
     func_name = scope.reserve_name('myfunc')
     func = codegen.Function(func_name, args=['my_arg'],
                             parent_scope=scope)
     # Can't use undefined 'some_name'
     self.assertRaises(AssertionError,
                       codegen.VariableReference,
                       'some_name',
                       func)
     # But can use function argument 'my_arg'
     ref = codegen.VariableReference('my_arg', func)
     self.assertCodeEqual(as_source_code(ref), 'my_arg')
    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_function_bad_arg(self):
     module = codegen.Module()
     func = codegen.Function('myfunc', args=['my arg'],
                             parent_scope=module.scope)
     self.assertRaises(AssertionError, as_source_code, func)