1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package runtime_test
16
17 import (
18 "fmt"
19 "strconv"
20 "testing"
21
22 "cuelang.org/go/cue"
23 "cuelang.org/go/cue/build"
24 "cuelang.org/go/cue/cuecontext"
25 "cuelang.org/go/cue/errors"
26 "cuelang.org/go/cue/token"
27 "cuelang.org/go/internal"
28 "cuelang.org/go/internal/core/adt"
29 "cuelang.org/go/internal/core/runtime"
30 "cuelang.org/go/internal/cuetxtar"
31 "cuelang.org/go/internal/value"
32 )
33
34 func Test(t *testing.T) {
35 test := cuetxtar.TxTarTest{
36 Root: "testdata/",
37 Name: "extern",
38 }
39
40 test.Run(t, func(t *cuetxtar.Test) {
41 interpreter := &interpreterFake{files: map[string]int{}}
42 ctx := cuecontext.New(cuecontext.Interpreter(interpreter))
43
44 b := t.Instance()
45 v := ctx.BuildInstance(b)
46 if err := v.Err(); err != nil {
47 t.WriteErrors(errors.Promote(err, "test"))
48 return
49 }
50
51 fmt.Fprintf(t, "%v\n", v)
52 })
53 }
54
55 type interpreterFake struct {
56 files map[string]int
57 }
58
59 func (i *interpreterFake) Kind() string { return "test" }
60
61 func (i *interpreterFake) NewCompiler(b *build.Instance, r *runtime.Runtime) (runtime.Compiler, errors.Error) {
62 switch b.PkgName {
63 case "failinit":
64 return nil, errors.Newf(token.NoPos, "TEST: fail initialization")
65 case "nullinit":
66 return nil, nil
67 case "scopetest":
68 return newCompilerFake(b, r)
69 }
70 return i, nil
71 }
72
73 func (i *interpreterFake) Compile(funcName string, _ adt.Value, a *internal.Attr) (adt.Expr, errors.Error) {
74 if ok, _ := a.Flag(1, "fail"); ok {
75 return nil, errors.Newf(token.NoPos, "TEST: fail compilation")
76 }
77
78 str, ok, err := a.Lookup(1, "err")
79 if err != nil {
80 return nil, errors.Promote(err, "test")
81 }
82
83 if ok {
84 return nil, errors.Newf(token.NoPos, "%s", str)
85 }
86
87 if str, err = a.String(0); err != nil {
88 return nil, errors.Promote(err, "test")
89 }
90
91 if _, ok := i.files[str]; !ok {
92 i.files[str] = len(i.files) + 1
93 }
94
95 return &adt.Builtin{
96 Name: "impl" + funcName + strconv.Itoa(i.files[str]),
97 Params: []adt.Param{{Value: &adt.BasicType{K: adt.IntKind}}},
98 Result: adt.IntKind,
99 }, nil
100 }
101
102 type compilerFake struct {
103 runtime *runtime.Runtime
104 b *build.Instance
105 }
106
107 func newCompilerFake(b *build.Instance, r *runtime.Runtime) (runtime.Compiler, errors.Error) {
108 return &compilerFake{
109 runtime: r,
110 b: b,
111 }, nil
112 }
113
114 func (c *compilerFake) Compile(name string, scope adt.Value, a *internal.Attr) (adt.Expr, errors.Error) {
115 typStr, err := a.String(0)
116 if err != nil {
117 return nil, errors.Promote(err, "test")
118 }
119
120 call := &adt.CallExpr{Fun: &adt.Builtin{
121 Result: adt.TopKind,
122 Func: func(opctx *adt.OpContext, args []adt.Value) adt.Expr {
123 cuectx := (*cue.Context)(c.runtime)
124 scope := value.Make(opctx, scope)
125
126 typ := cuectx.CompileString(typStr, cue.Scope(scope))
127 _, ityp := value.ToInternal(typ)
128 return ityp
129 },
130 }}
131 return call, nil
132 }
133
View as plain text