github.com/stackb/rules_proto@v0.0.0-20240221195024-5428336c51f1/pkg/protoc/starlark_util_test.go (about) 1 package protoc 2 3 import ( 4 "fmt" 5 "testing" 6 7 "github.com/google/go-cmp/cmp" 8 "go.starlark.net/starlark" 9 "go.starlark.net/starlarkstruct" 10 ) 11 12 func TestStructAttrMapStringBool(t *testing.T) { 13 for name, tc := range map[string]struct { 14 in starlarkstruct.Struct 15 name string 16 want map[string]bool 17 wantErr string 18 }{ 19 "degenerate": { 20 in: *starlarkstruct.FromStringDict( 21 starlarkstruct.Default, 22 starlark.StringDict{}, 23 ), 24 }, 25 "not found": { 26 in: *starlarkstruct.FromStringDict( 27 starlarkstruct.Default, 28 starlark.StringDict{ 29 "a": starlark.False, 30 }, 31 ), 32 name: "b", 33 }, 34 "wrong value type": { 35 in: *starlarkstruct.FromStringDict( 36 starlarkstruct.Default, 37 starlark.StringDict{ 38 "a": starlark.False, 39 }, 40 ), 41 name: "a", 42 wantErr: `"struct".a: value must have type starlark.Dict (got starlark.Bool)`, 43 }, 44 "wrong dict key": { 45 in: *starlarkstruct.FromStringDict( 46 starlarkstruct.Default, 47 starlark.StringDict{ 48 "a": func() *starlark.Dict { 49 d := starlark.NewDict(1) 50 d.SetKey(starlark.False, starlark.False) 51 return d 52 }(), 53 }, 54 ), 55 name: "a", 56 want: map[string]bool{}, 57 wantErr: `"struct".a: dict keys must have type string (got starlark.Bool)`, 58 }, 59 "wrong dict value": { 60 in: *starlarkstruct.FromStringDict( 61 starlarkstruct.Default, 62 starlark.StringDict{ 63 "a": func() *starlark.Dict { 64 d := starlark.NewDict(1) 65 d.SetKey(starlark.String("merge_attrs"), starlark.String("true")) 66 return d 67 }(), 68 }, 69 ), 70 name: "a", 71 want: map[string]bool{}, 72 wantErr: `"struct".a: dict value for "merge_attrs" must have type bool (got starlark.String)`, 73 }, 74 "correct dict value": { 75 in: *starlarkstruct.FromStringDict( 76 starlarkstruct.Default, 77 starlark.StringDict{ 78 "a": func() *starlark.Dict { 79 d := starlark.NewDict(1) 80 d.SetKey(starlark.String("merge_attrs"), starlark.True) 81 return d 82 }(), 83 }, 84 ), 85 name: "a", 86 want: map[string]bool{"merge_attrs": true}, 87 }, 88 } { 89 t.Run(name, func(t *testing.T) { 90 var gotErr string 91 got := structAttrMapStringBool(&tc.in, tc.name, func(format string, args ...interface{}) error { 92 gotErr += fmt.Sprintf(format, args...) 93 return nil 94 }) 95 if diff := cmp.Diff(tc.wantErr, gotErr); diff != "" { 96 t.Errorf("error (-want +got):\n%s", diff) 97 } 98 if diff := cmp.Diff(tc.want, got); diff != "" { 99 t.Errorf("result (-want +got):\n%s", diff) 100 } 101 }) 102 } 103 }