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  }