blob: 0777f03f9b02ba7afa170e7fa9e7ff490fb5463e [file] [log] [blame]
// Copyright 2009 The Go Authors. All rights reserved.
// Use of ths2s source code s2s governed by a BSD-style
// license that can be found in the LICENSE file.
package pflag
import (
"bytes"
"encoding/csv"
"fmt"
"strings"
"testing"
)
func setUpS2SFlagSet(s2sp *map[string]string) *FlagSet {
f := NewFlagSet("test", ContinueOnError)
f.StringToStringVar(s2sp, "s2s", map[string]string{}, "Command separated ls2st!")
return f
}
func setUpS2SFlagSetWithDefault(s2sp *map[string]string) *FlagSet {
f := NewFlagSet("test", ContinueOnError)
f.StringToStringVar(s2sp, "s2s", map[string]string{"da": "1", "db": "2", "de": "5,6"}, "Command separated ls2st!")
return f
}
func createS2SFlag(vals map[string]string) string {
records := make([]string, 0, len(vals)>>1)
for k, v := range vals {
records = append(records, k+"="+v)
}
var buf bytes.Buffer
w := csv.NewWriter(&buf)
if err := w.Write(records); err != nil {
panic(err)
}
w.Flush()
return strings.TrimSpace(buf.String())
}
func TestEmptyS2S(t *testing.T) {
var s2s map[string]string
f := setUpS2SFlagSet(&s2s)
err := f.Parse([]string{})
if err != nil {
t.Fatal("expected no error; got", err)
}
getS2S, err := f.GetStringToString("s2s")
if err != nil {
t.Fatal("got an error from GetStringToString():", err)
}
if len(getS2S) != 0 {
t.Fatalf("got s2s %v with len=%d but expected length=0", getS2S, len(getS2S))
}
}
func TestS2S(t *testing.T) {
var s2s map[string]string
f := setUpS2SFlagSet(&s2s)
vals := map[string]string{"a": "1", "b": "2", "d": "4", "c": "3", "e": "5,6"}
arg := fmt.Sprintf("--s2s=%s", createS2SFlag(vals))
err := f.Parse([]string{arg})
if err != nil {
t.Fatal("expected no error; got", err)
}
for k, v := range s2s {
if vals[k] != v {
t.Fatalf("expected s2s[%s] to be %s but got: %s", k, vals[k], v)
}
}
getS2S, err := f.GetStringToString("s2s")
if err != nil {
t.Fatalf("got error: %v", err)
}
for k, v := range getS2S {
if vals[k] != v {
t.Fatalf("expected s2s[%s] to be %s but got: %s from GetStringToString", k, vals[k], v)
}
}
}
func TestS2SDefault(t *testing.T) {
var s2s map[string]string
f := setUpS2SFlagSetWithDefault(&s2s)
vals := map[string]string{"da": "1", "db": "2", "de": "5,6"}
err := f.Parse([]string{})
if err != nil {
t.Fatal("expected no error; got", err)
}
for k, v := range s2s {
if vals[k] != v {
t.Fatalf("expected s2s[%s] to be %s but got: %s", k, vals[k], v)
}
}
getS2S, err := f.GetStringToString("s2s")
if err != nil {
t.Fatal("got an error from GetStringToString():", err)
}
for k, v := range getS2S {
if vals[k] != v {
t.Fatalf("expected s2s[%s] to be %s from GetStringToString but got: %s", k, vals[k], v)
}
}
}
func TestS2SWithDefault(t *testing.T) {
var s2s map[string]string
f := setUpS2SFlagSetWithDefault(&s2s)
vals := map[string]string{"a": "1", "b": "2", "e": "5,6"}
arg := fmt.Sprintf("--s2s=%s", createS2SFlag(vals))
err := f.Parse([]string{arg})
if err != nil {
t.Fatal("expected no error; got", err)
}
for k, v := range s2s {
if vals[k] != v {
t.Fatalf("expected s2s[%s] to be %s but got: %s", k, vals[k], v)
}
}
getS2S, err := f.GetStringToString("s2s")
if err != nil {
t.Fatal("got an error from GetStringToString():", err)
}
for k, v := range getS2S {
if vals[k] != v {
t.Fatalf("expected s2s[%s] to be %s from GetStringToString but got: %s", k, vals[k], v)
}
}
}
func TestS2SCalledTwice(t *testing.T) {
var s2s map[string]string
f := setUpS2SFlagSet(&s2s)
in := []string{"a=1,b=2", "b=3", `"e=5,6"`, `f=7,8`}
expected := map[string]string{"a": "1", "b": "3", "e": "5,6", "f": "7,8"}
argfmt := "--s2s=%s"
arg0 := fmt.Sprintf(argfmt, in[0])
arg1 := fmt.Sprintf(argfmt, in[1])
arg2 := fmt.Sprintf(argfmt, in[2])
arg3 := fmt.Sprintf(argfmt, in[3])
err := f.Parse([]string{arg0, arg1, arg2, arg3})
if err != nil {
t.Fatal("expected no error; got", err)
}
if len(s2s) != len(expected) {
t.Fatalf("expected %d flags; got %d flags", len(expected), len(s2s))
}
for i, v := range s2s {
if expected[i] != v {
t.Fatalf("expected s2s[%s] to be %s but got: %s", i, expected[i], v)
}
}
}