blob: e1c3e6b3809c98cd4f9ec458de15d789028e4e9a [file]
package experiments
import (
"errors"
"testing"
"github.com/google/go-cmp/cmp"
)
func TestParseFlags(t *testing.T) {
type testFlags struct {
Exp1 bool `flag:"exp1"`
Exp2 bool `flag:"exp2"`
Untagged bool
}
tests := []struct {
descr string
raw string
want testFlags
wantErr error
}{{
descr: "default values",
raw: "",
want: testFlags{
Exp1: false,
Exp2: false,
},
}, {
descr: "true flag",
raw: "exp1=true",
want: testFlags{
Exp1: true,
Exp2: false,
},
}, {
descr: "false flag",
raw: "exp1=false",
want: testFlags{
Exp1: false,
Exp2: false,
},
}, {
descr: "implicit value",
raw: "exp1",
want: testFlags{
Exp1: true,
Exp2: false,
},
}, {
descr: "multiple flags",
raw: "exp1=true,exp2=true",
want: testFlags{
Exp1: true,
Exp2: true,
},
}, {
descr: "repeated flag",
raw: "exp1=false,exp1=true",
want: testFlags{
Exp1: true,
Exp2: false,
},
}, {
descr: "spaces",
raw: " exp1 = true, exp2=true ",
want: testFlags{
Exp1: true,
Exp2: true,
},
}, {
descr: "unknown flags",
raw: "Exp1=true,Untagged,Foo=true",
want: testFlags{
Exp1: false,
Exp2: false,
Untagged: false,
},
}, {
descr: "empty flag name",
raw: "=true",
wantErr: ErrInvalidFormat,
}, {
descr: "invalid flag value",
raw: "exp1=foo",
wantErr: ErrInvalidFormat,
}}
for _, test := range tests {
t.Run(test.descr, func(t *testing.T) {
got := testFlags{}
err := parseFlags(test.raw, &got)
if test.wantErr != nil {
if !errors.Is(err, test.wantErr) {
t.Errorf("Got: parseFlags(%q) returned error: %v. Want: %v.", test.raw, err, test.wantErr)
}
} else {
if err != nil {
t.Fatalf("Got: parseFlags(%q) returned error: %v. Want: no error.", test.raw, err)
}
if diff := cmp.Diff(test.want, got); diff != "" {
t.Fatalf("parseFlags(%q) returned diff (-want,+got):\n%s", test.raw, diff)
}
}
})
}
t.Run("invalid dest type", func(t *testing.T) {
var dest string
err := parseFlags("", &dest)
if !errors.Is(err, ErrInvalidDest) {
t.Fatalf("Got: parseFlags() returned error: %v. Want: %v.", err, ErrInvalidDest)
}
})
t.Run("nil dest", func(t *testing.T) {
err := parseFlags("", (*struct{})(nil))
if !errors.Is(err, ErrInvalidDest) {
t.Fatalf("Got: parseFlags() returned error: %v. Want: %v.", err, ErrInvalidDest)
}
})
t.Run("unsupported flag type", func(t *testing.T) {
var dest struct {
Foo string `flag:"foo"`
}
err := parseFlags("foo", &dest)
if !errors.Is(err, ErrInvalidDest) {
t.Fatalf("Got: parseFlags() returned error: %v. Want: %v.", err, ErrInvalidDest)
}
})
}