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