1package stdlib
2
3import (
4	"fmt"
5	"testing"
6
7	"github.com/zclconf/go-cty/cty"
8)
9
10func TestEqual(t *testing.T) {
11	tests := []struct {
12		A    cty.Value
13		B    cty.Value
14		Want cty.Value
15	}{
16		{
17			cty.NumberIntVal(1),
18			cty.NumberIntVal(2),
19			cty.False,
20		},
21		{
22			cty.NumberIntVal(2),
23			cty.NumberIntVal(2),
24			cty.True,
25		},
26		{
27			cty.NullVal(cty.Number),
28			cty.NullVal(cty.Number),
29			cty.True,
30		},
31		{
32			cty.NumberIntVal(2),
33			cty.NullVal(cty.Number),
34			cty.False,
35		},
36		{
37			cty.NumberIntVal(1),
38			cty.UnknownVal(cty.Number),
39			cty.UnknownVal(cty.Bool),
40		},
41		{
42			cty.UnknownVal(cty.Number),
43			cty.UnknownVal(cty.Number),
44			cty.UnknownVal(cty.Bool),
45		},
46		{
47			cty.NumberIntVal(1),
48			cty.DynamicVal,
49			cty.UnknownVal(cty.Bool),
50		},
51		{
52			cty.DynamicVal,
53			cty.DynamicVal,
54			cty.UnknownVal(cty.Bool),
55		},
56	}
57
58	for _, test := range tests {
59		t.Run(fmt.Sprintf("Equal(%#v,%#v)", test.A, test.B), func(t *testing.T) {
60			got, err := Equal(test.A, test.B)
61
62			if err != nil {
63				t.Fatalf("unexpected error: %s", err)
64			}
65
66			if !got.RawEquals(test.Want) {
67				t.Errorf("wrong result\ngot:  %#v\nwant: %#v", got, test.Want)
68			}
69		})
70	}
71}
72
73func TestCoalesce(t *testing.T) {
74	tests := []struct {
75		Values []cty.Value
76		Want   cty.Value
77	}{
78		{
79			[]cty.Value{cty.True},
80			cty.True,
81		},
82		{
83			[]cty.Value{cty.NullVal(cty.Bool), cty.True},
84			cty.True,
85		},
86		{
87			[]cty.Value{cty.NullVal(cty.Bool), cty.False},
88			cty.False,
89		},
90		{
91			[]cty.Value{cty.NullVal(cty.Bool), cty.False, cty.StringVal("hello")},
92			cty.StringVal("false"),
93		},
94		{
95			[]cty.Value{cty.True, cty.UnknownVal(cty.Bool)},
96			cty.True,
97		},
98		{
99			[]cty.Value{cty.UnknownVal(cty.Bool), cty.True},
100			cty.UnknownVal(cty.Bool),
101		},
102		{
103			[]cty.Value{cty.UnknownVal(cty.Bool), cty.StringVal("hello")},
104			cty.UnknownVal(cty.String),
105		},
106		{
107			[]cty.Value{cty.DynamicVal, cty.True},
108			cty.UnknownVal(cty.Bool),
109		},
110		{
111			[]cty.Value{cty.DynamicVal},
112			cty.DynamicVal,
113		},
114	}
115
116	for _, test := range tests {
117		t.Run(fmt.Sprintf("Coalesce(%#v...)", test.Values), func(t *testing.T) {
118			got, err := Coalesce(test.Values...)
119
120			if err != nil {
121				t.Fatalf("unexpected error: %s", err)
122			}
123
124			if !got.RawEquals(test.Want) {
125				t.Errorf("wrong result\ngot:  %#v\nwant: %#v", got, test.Want)
126			}
127		})
128	}
129}
130