diff options
| author | James Bardin <j.bardin@gmail.com> | 2021-02-26 16:56:09 -0500 |
|---|---|---|
| committer | James Bardin <j.bardin@gmail.com> | 2021-02-26 17:34:11 -0500 |
| commit | ab5bd0308d35ca3bbdcf53a4a94c0dba35586ba5 (patch) | |
| tree | fc4c71d5d4a27a9992a1b6f2e79026c6c4d5273c /ops_test.go | |
| parent | 2cbe9e4128cfe39fe77b4fbcc8a1642ccb683195 (diff) | |
avoid panics with marked index values
Diffstat (limited to 'ops_test.go')
| -rw-r--r-- | ops_test.go | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/ops_test.go b/ops_test.go index 82eee9b..1074e3d 100644 --- a/ops_test.go +++ b/ops_test.go @@ -155,3 +155,124 @@ func TestApplyPath(t *testing.T) { }) } } + +func TestIndex(t *testing.T) { + tests := map[string]struct { + coll cty.Value + key cty.Value + want cty.Value + err string + }{ + "marked key to maked value": { + coll: cty.ListVal([]cty.Value{ + cty.StringVal("a"), + }), + key: cty.NumberIntVal(0).Mark("marked"), + want: cty.StringVal("a").Mark("marked"), + }, + "missing list key": { + coll: cty.ListVal([]cty.Value{ + cty.StringVal("a"), + }), + key: cty.NumberIntVal(1).Mark("marked"), + want: cty.DynamicVal, + err: "Invalid index", + }, + "null marked key": { + coll: cty.ListVal([]cty.Value{ + cty.StringVal("a"), + }), + key: cty.NullVal(cty.Number).Mark("marked"), + want: cty.DynamicVal, + err: "Invalid index", + }, + "dynamic key": { + coll: cty.ListVal([]cty.Value{ + cty.StringVal("a"), + }), + key: cty.DynamicVal, + want: cty.DynamicVal, + }, + "invalid marked key type": { + coll: cty.ListVal([]cty.Value{ + cty.StringVal("a"), + }), + key: cty.StringVal("foo").Mark("marked"), + want: cty.DynamicVal, + err: "Invalid index", + }, + "marked map key": { + coll: cty.MapVal(map[string]cty.Value{ + "foo": cty.StringVal("a"), + }), + key: cty.StringVal("foo").Mark("marked"), + want: cty.StringVal("a").Mark("marked"), + }, + "missing marked map key": { + coll: cty.MapVal(map[string]cty.Value{ + "foo": cty.StringVal("a"), + }), + key: cty.StringVal("bar").Mark("mark"), + want: cty.DynamicVal, + err: "Invalid index", + }, + "marked object key": { + coll: cty.ObjectVal(map[string]cty.Value{ + "foo": cty.StringVal("a"), + }), + key: cty.StringVal("foo").Mark("marked"), + // an object attribute is fetched by string index, and the marks + // are not maintained + want: cty.StringVal("a"), + }, + "invalid marked object key type": { + coll: cty.ObjectVal(map[string]cty.Value{ + "foo": cty.StringVal("a"), + }), + key: cty.ListVal([]cty.Value{cty.NullVal(cty.String)}).Mark("marked"), + want: cty.DynamicVal, + err: "Invalid index", + }, + "invalid marked object key": { + coll: cty.ObjectVal(map[string]cty.Value{ + "foo": cty.StringVal("a"), + }), + key: cty.NumberIntVal(0).Mark("marked"), + want: cty.DynamicVal, + err: "Invalid index", + }, + } + + for name, tc := range tests { + t.Run(name, func(t *testing.T) { + t.Logf("testing Index\ncollection: %#v\nkey: %#v", tc.coll, tc.key) + + got, diags := Index(tc.coll, tc.key, nil) + + for _, diag := range diags { + t.Logf(diag.Error()) + } + + if tc.err != "" { + if !diags.HasErrors() { + t.Fatalf("succeeded, but want error\nwant error: %s", tc.err) + } + if len(diags) != 1 { + t.Fatalf("wrong number of diagnostics %d; want 1", len(diags)) + } + + if gotErrStr := diags[0].Summary; gotErrStr != tc.err { + t.Fatalf("wrong error\ngot error: %s\nwant error: %s", gotErrStr, tc.err) + } + return + } + + if diags.HasErrors() { + t.Fatalf("failed, but want success\ngot diagnostics:\n%s", diags.Error()) + } + if !tc.want.RawEquals(got) { + t.Fatalf("wrong result\ngot: %#v\nwant: %#v", got, tc.want) + } + }) + } +} |
