cuelang.org/go@v0.13.0/internal/core/dep/dep_test.go (about) 1 // Copyright 2020 CUE Authors 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package dep_test 16 17 import ( 18 "fmt" 19 "io" 20 "strings" 21 "testing" 22 "text/tabwriter" 23 24 "cuelang.org/go/cue" 25 "cuelang.org/go/cue/format" 26 "cuelang.org/go/internal" 27 "cuelang.org/go/internal/core/adt" 28 "cuelang.org/go/internal/core/debug" 29 "cuelang.org/go/internal/core/dep" 30 "cuelang.org/go/internal/core/eval" 31 "cuelang.org/go/internal/core/runtime" 32 "cuelang.org/go/internal/cuedebug" 33 "cuelang.org/go/internal/cuetdtest" 34 "cuelang.org/go/internal/cuetxtar" 35 "cuelang.org/go/internal/value" 36 ) 37 38 func TestVisit(t *testing.T) { 39 test := cuetxtar.TxTarTest{ 40 Root: "./testdata", 41 Name: "dependencies", 42 // Matrix: cuetdtest.SmallMatrix, 43 Matrix: cuetdtest.DevOnlyMatrix, 44 45 ToDo: map[string]string{ 46 "dependencies-v3/inline": "error", 47 }, 48 } 49 50 test.Run(t, func(t *cuetxtar.Test) { 51 flags := cuedebug.Config{ 52 Sharing: true, 53 // LogEval: 1, 54 } 55 ctx := t.CueContext() 56 r := (*runtime.Runtime)(ctx) 57 r.SetDebugOptions(&flags) 58 59 val := ctx.BuildInstance(t.Instance()) 60 if val.Err() != nil { 61 t.Fatal(val.Err()) 62 } 63 64 ctxt := eval.NewContext(value.ToInternal(val)) 65 66 testCases := []struct { 67 name string 68 root string 69 cfg *dep.Config 70 }{{ 71 name: "field", 72 root: "a.b", 73 cfg: nil, 74 }, { 75 name: "all", 76 root: "a", 77 cfg: &dep.Config{Descend: true}, 78 }, { 79 name: "dynamic", 80 root: "a", 81 cfg: &dep.Config{Dynamic: true}, 82 }} 83 84 for _, tc := range testCases { 85 v := val.LookupPath(cue.ParsePath(tc.root)) 86 87 _, n := value.ToInternal(v) 88 w := t.Writer(tc.name) 89 90 t.Run(tc.name, func(sub *testing.T) { 91 testVisit(sub, w, ctxt, n, tc.cfg) 92 }) 93 } 94 }) 95 } 96 97 func testVisit(t *testing.T, w io.Writer, ctxt *adt.OpContext, v *adt.Vertex, cfg *dep.Config) { 98 t.Helper() 99 100 tw := tabwriter.NewWriter(w, 0, 4, 1, ' ', 0) 101 defer tw.Flush() 102 103 fmt.Fprintf(tw, "line \vreference\v path of resulting vertex\n") 104 105 dep.Visit(cfg, ctxt, v, func(d dep.Dependency) error { 106 if d.Reference == nil { 107 t.Fatal("no reference") 108 } 109 110 src := d.Reference.Source() 111 line := src.Pos().Line() 112 b, _ := format.Node(src) 113 ref := string(b) 114 str := value.Make(ctxt, d.Node).Path().String() 115 116 if i := d.Import(); i != nil { 117 path := i.ImportPath.StringValue(ctxt) 118 str = fmt.Sprintf("%q.%s", path, str) 119 } else if d.Node.IsDetached() { 120 str = "**non-rooted**" 121 } 122 123 fmt.Fprintf(tw, "%d:\v%s\v=> %s\n", line, ref, str) 124 125 return nil 126 }) 127 } 128 129 // DO NOT REMOVE: for Testing purposes. 130 func TestX(t *testing.T) { 131 version := internal.DefaultVersion 132 // version = internal.DevVersion // Uncomment for eval V3 133 flags := cuedebug.Config{ 134 Sharing: true, 135 LogEval: 1, 136 } 137 138 cfg := &dep.Config{ 139 Dynamic: true, 140 // Descend: true, 141 } 142 143 in := ` 144 ` 145 146 if strings.TrimSpace(in) == "" { 147 t.Skip() 148 } 149 150 r := runtime.NewWithSettings(version, flags) 151 ctx := (*cue.Context)(r) 152 153 v := ctx.CompileString(in) 154 if err := v.Err(); err != nil { 155 t.Fatal(err) 156 } 157 158 aVal := v.LookupPath(cue.MakePath(cue.Str("a"))) 159 160 r, n := value.ToInternal(aVal) 161 162 out := debug.NodeString(r, n, nil) 163 t.Error(out) 164 165 ctxt := eval.NewContext(r, n) 166 167 n.VisitLeafConjuncts(func(c adt.Conjunct) bool { 168 str := debug.NodeString(ctxt, c.Elem(), nil) 169 t.Log(str) 170 return true 171 }) 172 173 w := &strings.Builder{} 174 fmt.Fprintln(w) 175 176 testVisit(t, w, ctxt, n, cfg) 177 178 t.Error(w.String()) 179 }