1package stdlib
2
3import (
4	"fmt"
5	"testing"
6
7	"github.com/zclconf/go-cty/cty"
8)
9
10func TestNot(t *testing.T) {
11	tests := []struct {
12		Input cty.Value
13		Want  cty.Value
14	}{
15		{
16			cty.True,
17			cty.False,
18		},
19		{
20			cty.False,
21			cty.True,
22		},
23		{
24			cty.UnknownVal(cty.Bool),
25			cty.UnknownVal(cty.Bool),
26		},
27		{
28			cty.DynamicVal,
29			cty.UnknownVal(cty.Bool),
30		},
31		{
32			cty.True.Mark(1),
33			cty.False.Mark(1),
34		},
35	}
36
37	for _, test := range tests {
38		t.Run(fmt.Sprintf("Not(%#v)", test.Input), func(t *testing.T) {
39			got, err := Not(test.Input)
40
41			if err != nil {
42				t.Fatalf("unexpected error: %s", err)
43			}
44
45			if !got.RawEquals(test.Want) {
46				t.Errorf("wrong result\ngot:  %#v\nwant: %#v", got, test.Want)
47			}
48		})
49	}
50}
51
52func TestAnd(t *testing.T) {
53	tests := []struct {
54		A    cty.Value
55		B    cty.Value
56		Want cty.Value
57	}{
58		{
59			cty.False,
60			cty.False,
61			cty.False,
62		},
63		{
64			cty.False,
65			cty.True,
66			cty.False,
67		},
68		{
69			cty.True,
70			cty.False,
71			cty.False,
72		},
73		{
74			cty.True,
75			cty.True,
76			cty.True,
77		},
78		{
79			cty.True,
80			cty.UnknownVal(cty.Bool),
81			cty.UnknownVal(cty.Bool),
82		},
83		{
84			cty.UnknownVal(cty.Bool),
85			cty.UnknownVal(cty.Bool),
86			cty.UnknownVal(cty.Bool),
87		},
88		{
89			cty.True,
90			cty.DynamicVal,
91			cty.UnknownVal(cty.Bool),
92		},
93		{
94			cty.DynamicVal,
95			cty.DynamicVal,
96			cty.UnknownVal(cty.Bool),
97		},
98	}
99
100	for _, test := range tests {
101		t.Run(fmt.Sprintf("And(%#v,%#v)", test.A, test.B), func(t *testing.T) {
102			got, err := And(test.A, test.B)
103
104			if err != nil {
105				t.Fatalf("unexpected error: %s", err)
106			}
107
108			if !got.RawEquals(test.Want) {
109				t.Errorf("wrong result\ngot:  %#v\nwant: %#v", got, test.Want)
110			}
111		})
112	}
113}
114
115func TestOr(t *testing.T) {
116	tests := []struct {
117		A    cty.Value
118		B    cty.Value
119		Want cty.Value
120	}{
121		{
122			cty.False,
123			cty.False,
124			cty.False,
125		},
126		{
127			cty.False,
128			cty.True,
129			cty.True,
130		},
131		{
132			cty.True,
133			cty.False,
134			cty.True,
135		},
136		{
137			cty.True,
138			cty.True,
139			cty.True,
140		},
141		{
142			cty.True,
143			cty.UnknownVal(cty.Bool),
144			cty.UnknownVal(cty.Bool),
145		},
146		{
147			cty.UnknownVal(cty.Bool),
148			cty.UnknownVal(cty.Bool),
149			cty.UnknownVal(cty.Bool),
150		},
151		{
152			cty.True,
153			cty.DynamicVal,
154			cty.UnknownVal(cty.Bool),
155		},
156		{
157			cty.DynamicVal,
158			cty.DynamicVal,
159			cty.UnknownVal(cty.Bool),
160		},
161	}
162
163	for _, test := range tests {
164		t.Run(fmt.Sprintf("Or(%#v,%#v)", test.A, test.B), func(t *testing.T) {
165			got, err := Or(test.A, test.B)
166
167			if err != nil {
168				t.Fatalf("unexpected error: %s", err)
169			}
170
171			if !got.RawEquals(test.Want) {
172				t.Errorf("wrong result\ngot:  %#v\nwant: %#v", got, test.Want)
173			}
174		})
175	}
176}
177