def test_with_main_func(): root = ast.TranslationUnit([ ast.Function(ast.FunctionProto('foo', [], ast.BuiltinTypes.VOID)), ast.Function(ast.FunctionProto('main', [], ast.BuiltinTypes.I32)) ]) mfp = MainFuncPass() mfp.visit(root)
def test_without_main_func(): root = ast.TranslationUnit([ ast.Function(ast.FunctionProto('foo', [], ast.BuiltinTypes.VOID)) ]) mfp = MainFuncPass() with pytest.raises(DumbNameError): mfp.visit(root)
def test_func_redeclaration(): foo_func = ast.Function(ast.FunctionProto('foo', [], BuiltinTypes.VOID)) foo_func_dup = ast.Function( ast.FunctionProto('foo', [], BuiltinTypes.I32)) root = ast.TranslationUnit([foo_func, foo_func_dup]) tp = TypePass() with pytest.raises(DumbNameError): tp.visit(root)
def test_funccall_unknown_func(): foo_call = ast.FuncCall('foo', [ast.IntegerConstant(0)]) main_func = ast.Function(ast.FunctionProto('main', [], BuiltinTypes.VOID), ast.Block([foo_call])) root = ast.TranslationUnit([main_func]) tp = TypePass() with pytest.raises(DumbNameError): tp.visit(root)
def test_return_promote_val(): foo_func = ast.Function( ast.FunctionProto('foo', [], BuiltinTypes.F32), ast.Block([ ast.Return(ast.IntegerConstant(1)) ])) root = ast.TranslationUnit([foo_func]) tp = TypePass() tp.visit(root)
def test_return_no_ret_no_val(): foo_func = ast.Function( ast.FunctionProto('foo', [], BuiltinTypes.VOID), ast.Block([ ast.Return() ])) root = ast.TranslationUnit([foo_func]) tp = TypePass() tp.visit(root)
def test_funccall_wrong_num_args(): foo_func = ast.Function(ast.FunctionProto('foo', [], BuiltinTypes.VOID)) foo_call = ast.FuncCall('foo', [ast.IntegerConstant(1)]) main_func = ast.Function(ast.FunctionProto('main', [], BuiltinTypes.VOID), ast.Block([foo_call])) root = ast.TranslationUnit([foo_func, main_func]) tp = TypePass() with pytest.raises(DumbTypeError): tp.visit(root)
def test_func_proto(): args = [ ast.Argument('a', BuiltinTypes.I32), ast.Argument('b', BuiltinTypes.I32) ] foo_func = ast.Function( ast.FunctionProto('foo', args, BuiltinTypes.VOID)) root = ast.TranslationUnit([foo_func]) tp = TypePass() tp.visit(root)
def test_func_bad_arg_type(): args = [ ast.Argument('a', BuiltinTypes.VOID) ] foo_func = ast.Function( ast.FunctionProto('foo', args, BuiltinTypes.VOID)) root = ast.TranslationUnit([foo_func]) tp = TypePass() with pytest.raises(DumbTypeError): tp.visit(root)
def test_return_incompatible_val(): foo_func = ast.Function( ast.FunctionProto('foo', [], BuiltinTypes.I32), ast.Block([ ast.Return(ast.FloatConstant(1.0)) ])) root = ast.TranslationUnit([foo_func]) tp = TypePass() with pytest.raises(DumbTypeError): tp.visit(root)
def test_return_no_ret_val(): foo_func = ast.Function( ast.FunctionProto('foo', [], BuiltinTypes.VOID), ast.Block([ ast.Return(ast.IntegerConstant(1)) ])) root = ast.TranslationUnit([foo_func]) tp = TypePass() with pytest.raises(DumbTypeError): tp.visit(root)
def test_funccall_bad_arg(arg_list, val_list): foo_func = ast.Function( ast.FunctionProto('foo', arg_list, BuiltinTypes.VOID)) foo_call = ast.FuncCall('foo', val_list) main_func = ast.Function(ast.FunctionProto('main', [], BuiltinTypes.VOID), ast.Block([foo_call])) root = ast.TranslationUnit([foo_func, main_func]) tp = TypePass() with pytest.raises(DumbTypeError): tp.visit(root)
def test_funccall(): foo_func = ast.Function( ast.FunctionProto('foo', [ast.Argument('foo', BuiltinTypes.I32)], BuiltinTypes.VOID)) foo_call = ast.FuncCall('foo', [ast.IntegerConstant(0)]) main_func = ast.Function(ast.FunctionProto('main', [], BuiltinTypes.VOID), ast.Block([foo_call])) root = ast.TranslationUnit([foo_func, main_func]) tp = TypePass() tp.visit(root)
def parse_translation_unit(self): """Parse translation unit. Returns: TranslationUnit: Root of the AST. Grammar: top_level_decl : func | top_level_decl func """ decls = [] while self.curr_token.kind != 'EOF': if self.curr_token.kind == 'FUNC': decls.append(self.parse_func()) elif self.curr_token.kind == 'ATTR_START': decls.append(self.parse_with_attrs()) else: msg = 'unexpected token at top level' self.diag.error(self.curr_token.loc, msg) raise DumbSyntaxError(msg) return ast.TranslationUnit(decls)
getattr(visitor, method_name).assert_called_once_with(node) @pytest.mark.parametrize('node', [ ast.Block(None), ast.If(None, None), ast.While(None, None), ast.Break(), ast.Continue(), ast.Return(), ast.Var(None, None), ast.Expression(None) ]) def test_stmt_visitor(node): visitor = StubStmtVisitor() method_name = 'visit_' + type(node).__name__ with mock.patch.object(visitor, method_name): visitor.visit(node) getattr(visitor, method_name).assert_called_once_with(node) @pytest.mark.parametrize('node', [ast.Function(None, None), ast.TranslationUnit(None)]) def test_decl_visitor(node): visitor = StubDeclVisitor() method_name = 'visit_' + type(node).__name__ with mock.patch.object(visitor, method_name): visitor.visit(node) getattr(visitor, method_name).assert_called_once_with(node)