1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package gocode
18
19 import (
20 "bytes"
21 "regexp"
22 "strings"
23 "testing"
24
25 "cuelang.org/go/cue/errors"
26 "cuelang.org/go/encoding/gocode/testdata/pkg1"
27 "cuelang.org/go/encoding/gocode/testdata/pkg2"
28 )
29
30 type validator interface {
31 Validate() error
32 }
33
34 func TestPackages(t *testing.T) {
35
36 testCases := []struct {
37 name string
38 value validator
39 want string
40 }{{
41 name: "failing int",
42 value: pkg2.PickMe(4),
43 want: "invalid value 4 (out of bound >5):\n pkg2/instance.cue:x:x",
44 }, {
45 name: "failing field with validator",
46 value: &pkg1.OtherStruct{A: "car"},
47 want: `
48 2 errors in empty disjunction:
49 conflicting values null and {A:strings.ContainsAny("X"),P:"cuelang.org/go/encoding/gocode/testdata/pkg2".PickMe} (mismatched types null and struct):
50 pkg1/instance.cue:x:x
51 A: invalid value "car" (does not satisfy strings.ContainsAny("X")):
52 pkg1/instance.cue:x:x
53 pkg1/instance.cue:x:x
54 `,
55 }, {
56 name: "failing field of type int",
57 value: &pkg1.MyStruct{A: 11, B: "dog"},
58 want: `
59 2 errors in empty disjunction:
60 conflicting values null and {A:<=10,B:(=~"cat"|*"dog"),O?:OtherStruct,I:"cuelang.org/go/encoding/gocode/testdata/pkg2".ImportMe} (mismatched types null and struct):
61 pkg1/instance.cue:x:x
62 A: invalid value 11 (out of bound <=10):
63 pkg1/instance.cue:x:x
64 `,
65 }, {
66 name: "failing nested struct ",
67 value: &pkg1.MyStruct{A: 5, B: "dog", O: &pkg1.OtherStruct{A: "car", P: 6}},
68 want: `
69 4 errors in empty disjunction:
70 conflicting values null and {A:<=10,B:(=~"cat"|*"dog"),O?:OtherStruct,I:"cuelang.org/go/encoding/gocode/testdata/pkg2".ImportMe} (mismatched types null and struct):
71 pkg1/instance.cue:x:x
72 O: 2 errors in empty disjunction:
73 O: conflicting values null and {A:strings.ContainsAny("X"),P:"cuelang.org/go/encoding/gocode/testdata/pkg2".PickMe} (mismatched types null and struct):
74 pkg1/instance.cue:x:x
75 pkg1/instance.cue:x:x
76 O.A: invalid value "car" (does not satisfy strings.ContainsAny("X")):
77 pkg1/instance.cue:x:x
78 pkg1/instance.cue:x:x
79 `,
80 }, {
81 name: "fail nested struct of different package",
82 value: &pkg1.MyStruct{A: 5, B: "dog", O: &pkg1.OtherStruct{A: "X", P: 4}},
83 want: `
84 4 errors in empty disjunction:
85 conflicting values null and {A:<=10,B:(=~"cat"|*"dog"),O?:OtherStruct,I:"cuelang.org/go/encoding/gocode/testdata/pkg2".ImportMe} (mismatched types null and struct):
86 pkg1/instance.cue:x:x
87 O: 2 errors in empty disjunction:
88 O: conflicting values null and {A:strings.ContainsAny("X"),P:"cuelang.org/go/encoding/gocode/testdata/pkg2".PickMe} (mismatched types null and struct):
89 pkg1/instance.cue:x:x
90 pkg1/instance.cue:x:x
91 O.P: invalid value 4 (out of bound >5):
92 pkg2/instance.cue:x:x
93 `,
94 }, {
95 name: "all good",
96 value: &pkg1.MyStruct{
97 A: 5,
98 B: "dog",
99 I: &pkg2.ImportMe{A: 1000, B: "a"},
100 },
101 want: "nil",
102 }}
103 for _, tc := range testCases {
104 t.Run(tc.name, func(t *testing.T) {
105 got := strings.TrimSpace(errStr(tc.value.Validate()))
106 want := strings.TrimSpace(tc.want)
107 if got != want {
108 t.Errorf("got:\n%q\nwant:\n%q", got, want)
109 }
110 })
111 }
112 }
113
114 func errStr(err error) string {
115 if err == nil {
116 return "nil"
117 }
118 buf := &bytes.Buffer{}
119 errors.Print(buf, err, nil)
120 r := regexp.MustCompile(`.cue:\d+:\d+`)
121 return r.ReplaceAllString(buf.String(), ".cue:x:x")
122 }
123
View as plain text