File: compile_test.go

package info (click to toggle)
golang-github-traefik-yaegi 0.16.1-2
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 24,608 kB
  • sloc: sh: 457; makefile: 39
file content (84 lines) | stat: -rw-r--r-- 1,614 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
package interp

import (
	"go/ast"
	"go/parser"
	"go/token"
	"testing"

	"github.com/traefik/yaegi/stdlib"
)

func TestCompileAST(t *testing.T) {
	i := New(Options{})
	file, err := parser.ParseFile(i.FileSet(), "_.go", `
		package main

		import "fmt"

		type Foo struct{}

		var foo Foo
		const bar = "asdf"

		func main() {
			fmt.Println(1)
		}
	`, 0)
	if err != nil {
		panic(err)
	}
	if len(file.Imports) != 1 || len(file.Decls) != 5 {
		panic("wrong number of imports or decls")
	}

	dType := file.Decls[1].(*ast.GenDecl)
	dVar := file.Decls[2].(*ast.GenDecl)
	dConst := file.Decls[3].(*ast.GenDecl)
	dFunc := file.Decls[4].(*ast.FuncDecl)

	if dType.Tok != token.TYPE {
		panic("decl[1] is not a type")
	}
	if dVar.Tok != token.VAR {
		panic("decl[2] is not a var")
	}
	if dConst.Tok != token.CONST {
		panic("decl[3] is not a const")
	}

	cases := []struct {
		desc string
		node ast.Node
		skip string
	}{
		{desc: "file", node: file, skip: "temporary ignore"},
		{desc: "import", node: file.Imports[0]},
		{desc: "type", node: dType},
		{desc: "var", node: dVar, skip: "not supported"},
		{desc: "const", node: dConst},
		{desc: "func", node: dFunc},
		{desc: "block", node: dFunc.Body},
		{desc: "expr", node: dFunc.Body.List[0]},
	}

	_ = i.Use(stdlib.Symbols)

	for _, c := range cases {
		t.Run(c.desc, func(t *testing.T) {
			if c.skip != "" {
				t.Skip(c.skip)
			}

			i := i
			if _, ok := c.node.(*ast.File); ok {
				i = New(Options{})
				_ = i.Use(stdlib.Symbols)
			}
			_, err := i.CompileAST(c.node)
			if err != nil {
				t.Fatalf("Failed to compile %s: %v", c.desc, err)
			}
		})
	}
}