blob: 0dc9c2da7b71e6f1dfcfe1ce7fdf1a7251080a73 [file] [log] [blame]
package common
import (
"flag"
"reflect"
"testing"
"github.com/stretchr/testify/require"
"go.skia.org/infra/go/deepequal/assertdeep"
"go.skia.org/infra/go/testutils/unittest"
)
func TestMultiString(t *testing.T) {
unittest.SmallTest(t)
// Test basic operation.
defaults := []string{"mydefault", "mydefault2"}
var values []string
m := &multiString{
values: &values,
}
addAndCheck := func(newVal string, expect []string, expectStr string) {
require.NoError(t, m.Set(newVal))
assertdeep.Equal(t, expect, *m.values)
assertdeep.Equal(t, expect, values)
// Sanity check.
assertdeep.Equal(t, []string{"mydefault", "mydefault2"}, defaults)
require.Equal(t, expectStr, m.String())
}
addAndCheck("alpha", []string{"alpha"}, "alpha")
addAndCheck("beta,gamma", []string{"alpha", "beta", "gamma"}, "alpha,beta,gamma")
addAndCheck("delta", []string{"alpha", "beta", "gamma", "delta"}, "alpha,beta,gamma,delta")
// Test MultiStringFlagVar behavior.
values = nil
m = newMultiString(&values, defaults)
assertdeep.Equal(t, defaults, *m.values)
assertdeep.Equal(t, defaults, values)
addAndCheck("alpha", []string{"alpha"}, "alpha")
addAndCheck("beta,gamma", []string{"alpha", "beta", "gamma"}, "alpha,beta,gamma")
addAndCheck("delta", []string{"alpha", "beta", "gamma", "delta"}, "alpha,beta,gamma,delta")
// Sanity check.
assertdeep.Equal(t, []string{"mydefault", "mydefault2"}, defaults)
// Verify that changing the defaults does not change the flag values.
values = nil
m = newMultiString(&values, defaults)
defaults[0] = "replaced"
assertdeep.Equal(t, []string{"mydefault", "mydefault2"}, *m.values)
assertdeep.Equal(t, []string{"mydefault", "mydefault2"}, values)
// Verify that it's okay to pass nil for the defaults.
values = nil
m = newMultiString(&values, nil)
require.Nil(t, values)
require.Equal(t, "", m.String())
// This is the code from the flag package which caused a crash without a
// nil check in String().
NewMultiStringFlag("myflag", nil, "Use --myflag")
myflag := flag.Lookup("myflag")
require.NotNil(t, myflag)
typ := reflect.TypeOf(myflag.Value)
var z reflect.Value
if typ.Kind() == reflect.Ptr {
z = reflect.New(typ.Elem())
} else {
z = reflect.Zero(typ)
}
require.Equal(t, "", z.Interface().(flag.Value).String())
}