1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package adt_test
16
17 import (
18 "testing"
19
20 "cuelang.org/go/cue/ast"
21 "cuelang.org/go/internal/core/adt"
22 "cuelang.org/go/internal/core/compile"
23 "cuelang.org/go/internal/core/eval"
24 "cuelang.org/go/internal/core/runtime"
25 "cuelang.org/go/internal/cuetest"
26 )
27
28 func TestMatchPatternValue(t *testing.T) {
29 type testCase struct {
30 expr string
31 label string
32 index int64
33 value string
34 result bool
35 }
36
37 r := runtime.New()
38 ctx := eval.NewContext(r, nil)
39
40 pv := func(t *testing.T, s string) adt.Value {
41 switch s {
42 case "_":
43 return &adt.Top{}
44 }
45 cfg := compile.Config{
46 Imports: func(x *ast.Ident) (pkgPath string) {
47 return r.BuiltinPackagePath(x.Name)
48 },
49 }
50 v, b := r.Compile(&runtime.Config{Config: cfg}, s)
51 if b.Err != nil {
52 t.Fatal(b.Err)
53 }
54 v.Finalize(ctx)
55 ctx.Err()
56 return v.Value()
57 }
58
59 str := func(s string) (adt.Feature, adt.Value) {
60 f := r.StrLabel(s)
61 return f, ctx.NewString(s)
62 }
63
64 idx := func(i int64) adt.Feature {
65 return adt.MakeIntLabel(adt.IntLabel, i)
66 }
67
68 testCases := []testCase{{
69 expr: "string",
70 label: "foo",
71 result: true,
72 }, {
73 expr: "_",
74 label: "foo",
75 result: true,
76 }, {
77 expr: "_|_",
78 label: "foo",
79 result: false,
80 }, {
81 expr: `<"h"`,
82 label: "foo",
83 result: true,
84 }, {
85 expr: `"foo"`,
86 label: "bar",
87 result: false,
88 }, {
89 expr: `"foo"`,
90 label: "foo",
91 result: true,
92 }, {
93 expr: `<4`,
94 index: 5,
95 result: false,
96 }, {
97 expr: `>=4`,
98 index: 5,
99 result: true,
100 }, {
101 expr: `5`,
102 index: 5,
103 result: true,
104 }, {
105 expr: `5`,
106 label: "str",
107 result: false,
108 }, {
109 expr: `>1 & <10`,
110 index: 5,
111 result: true,
112 }, {
113 expr: `>1 & <10`,
114 index: 10,
115 result: false,
116 }, {
117 expr: `<1 | >10`,
118 index: 0,
119 result: true,
120 }, {
121 expr: `<1 | >10`,
122 index: 5,
123 result: false,
124 }, {
125 expr: `strings.HasPrefix("foo")`,
126 label: "foo",
127 result: true,
128 }, {
129 expr: `strings.HasPrefix("foo")`,
130 label: "bar",
131 result: false,
132 }}
133
134 cuetest.Run(t, testCases, func(t *cuetest.T, tc *testCase) {
135 expr := pv(t.T, tc.expr)
136
137 var f adt.Feature
138 var label adt.Value
139 if tc.label != "" {
140 f, label = str(tc.label)
141 } else {
142 f = idx(tc.index)
143 }
144 if tc.value != "" {
145 label = pv(t.T, tc.value)
146 }
147
148 t.Equal(adt.MatchPatternValue(ctx, expr, f, label), tc.result)
149 })
150 }
151
View as plain text