1package stdlib
2
3import (
4	"fmt"
5	"testing"
6
7	"github.com/zclconf/go-cty/cty"
8)
9
10func TestCSVDecode(t *testing.T) {
11	tests := []struct {
12		Input   cty.Value
13		Want    cty.Value
14		WantErr string
15	}{
16		{
17			cty.StringVal(csvTest),
18			cty.ListVal([]cty.Value{
19				cty.ObjectVal(map[string]cty.Value{
20					"name": cty.StringVal("foo"),
21					"size": cty.StringVal("100"),
22					"type": cty.StringVal("tiny"),
23				}),
24				cty.ObjectVal(map[string]cty.Value{
25					"name": cty.StringVal("bar"),
26					"size": cty.StringVal(""),
27					"type": cty.StringVal("huge"),
28				}),
29				cty.ObjectVal(map[string]cty.Value{
30					"name": cty.StringVal("baz"),
31					"size": cty.StringVal("50"),
32					"type": cty.StringVal("weedy"),
33				}),
34			}),
35			``,
36		},
37		{
38			cty.StringVal(`"just","header","line"`),
39			cty.ListValEmpty(cty.Object(map[string]cty.Type{
40				"just":   cty.String,
41				"header": cty.String,
42				"line":   cty.String,
43			})),
44			``,
45		},
46		{
47			cty.StringVal(``),
48			cty.DynamicVal,
49			`missing header line`,
50		},
51		{
52			cty.StringVal(`not csv at all`),
53			cty.ListValEmpty(cty.Object(map[string]cty.Type{
54				"not csv at all": cty.String,
55			})),
56			``,
57		},
58		{
59			cty.StringVal(`invalid"thing"`),
60			cty.DynamicVal,
61			`parse error on line 1, column 7: bare " in non-quoted-field`,
62		},
63		{
64			cty.UnknownVal(cty.String),
65			cty.DynamicVal, // need to know the value to determine the type
66			``,
67		},
68		{
69			cty.DynamicVal,
70			cty.DynamicVal,
71			``,
72		},
73		{
74			cty.True,
75			cty.DynamicVal,
76			`string required, but received bool`,
77		},
78		{
79			cty.NullVal(cty.String),
80			cty.DynamicVal,
81			`argument must not be null`,
82		},
83	}
84
85	for _, test := range tests {
86		t.Run(fmt.Sprintf("CSVDecode(%#v)", test.Input), func(t *testing.T) {
87			got, err := CSVDecode(test.Input)
88			var errStr string
89			if err != nil {
90				errStr = err.Error()
91			}
92			if errStr != test.WantErr {
93				t.Fatalf("wrong error\ngot:  %s\nwant: %s", errStr, test.WantErr)
94			}
95			if err != nil {
96				return
97			}
98
99			if !got.RawEquals(test.Want) {
100				t.Errorf("wrong result\ngot:  %#v\nwant: %#v", got, test.Want)
101			}
102		})
103	}
104}
105
106const csvTest = `"name","size","type"
107"foo","100","tiny"
108"bar","","huge"
109"baz","50","weedy"
110`
111