package args import ( "fmt" "io/ioutil" "os" "path" "testing" "time" ) func TestNewArgSet(t *testing.T) { NewArgSet() } func TestAppend(t *testing.T) { as := NewArgSet() as.Append(INT, "key", "help", nil) if len(as.args) != 1 || *as.args[0] != *NewArg(INT, "key", "help", nil) { t.Errorf("argset.Append failed: got %v, want %v", *as.args[0], *NewArg(INT, "key", "help", nil)) } } func TestParse(t *testing.T) { osArgs := append([]string{}, os.Args[:]...) defer func() { os.Args = osArgs }() os.Args = []string{"nothing", "-flag", "5"} os.Setenv("ENV", "9") as := NewArgSet() as.Append(INT, "flag", "help", 1) as.Append(INT, "env", "help", 2) as.Append(INT, "default", "help", 3) if err := as.Parse(); err != nil { t.Fatalf("cannot parse legal: %v", err) } else if arg := as.Get("flag"); arg == nil || arg.Value != 5 { t.Errorf("cannot set from flag: got %v", arg) } else if arg := as.Get("env"); arg == nil || arg.Value != 9 { t.Errorf("cannot set from env: got %v", arg) } else if arg := as.Get("default"); arg == nil || arg.Value != 3 { t.Errorf("cannot set from default: got %v", arg) } os.Args = []string{"nothing", "-testkey5", "bad"} as = NewArgSet() as.Append(INT, "testkey4", "help", "4") if err := as.Parse(); err == nil { t.Fatal(err) } } func TestParseFloatTime(t *testing.T) { osArgs := append([]string{}, os.Args[:]...) defer func() { os.Args = osArgs }() os.Args = []string{"nothing", "-flag", "5.5"} os.Setenv("ENV", "2019-01-01") as := NewArgSet() as.Append(FLOAT, "flag", "help", 1.1) as.Append(TIME, "env", "help", "2019-03-22") wantTime := time.Date(2019, 1, 1, 0, 0, 0, 0, time.UTC) if err := as.Parse(); err != nil { t.Fatalf("cannot parse legal: %v", err) } else if arg := as.Get("flag"); arg == nil || arg.Value != float32(5.5) { t.Errorf("cannot set from flag: got %v (%v / %T != %v / %T)", arg, arg.Value, arg.Value, 5.5, 5.5) } else if arg := as.Get("env"); arg == nil || arg.Value != wantTime { t.Errorf("cannot set from env: got %v (%v / %T != %v / %T)", arg, arg.Value, arg.Value, wantTime, wantTime) } } func TestGet(t *testing.T) { was := os.Args defer func() { os.Args = was }() os.Args = []string{"exec", "-testkey1", "5"} as := NewArgSet() as.Append(INT, "testkey1", "help", 1) as.Append(INT, "testkey2", "help", 2) as.Append(INT, "testkey3", "help", 3) if err := as.Parse(); err != nil { t.Fatal(err) } if as.Get("testkey1") == nil { t.Errorf("cannot get parsed at %q", "testkey1") } } func TestSetValueFromFileYAML(t *testing.T) { was := os.Args defer func() { os.Args = was }() os.Args = []string{"exec"} testSetValueFromFile(t, "yaml", ` 1: 5 2: hello 3: 5m 4: true 5: 2019-01-01 6: 5.5 `) testSetValueFromFile(t, "json", ` { "1": 5, "2": "hello", "3": "5m", "4": true, "5": "2019-01-01", "6": 5.5 } `) } func testSetValueFromFile(t *testing.T, suffix, content string) { d, err := ioutil.TempDir(os.TempDir(), "prefix") defer os.RemoveAll(d) f, err := os.Create(path.Join(d, "conf."+suffix)) if err != nil { t.Fatal(err) } fmt.Fprintln(f, content) f.Close() as := NewArgSet(f.Name()) as.Append(INT, "1", "help", 1) as.Append(STRING, "2", "help", "world") as.Append(DURATION, "3", "help", time.Hour) as.Append(BOOL, "4", "help", false) as.Append(TIME, "5", "help", time.Now()) as.Append(FLOAT, "6", "help", 1.1) if err := as.Parse(); err != nil { t.Fatal(err) } if v := as.Get("1").GetInt(); v != 5 { t.Fatal(v) } if v := as.Get("2").GetString(); v != "hello" { t.Fatal(v) } if v := as.Get("3").GetDuration(); v != time.Minute*5 { t.Fatal(v) } if v := as.Get("4").GetBool(); v != true { t.Fatal(v) } if v := as.Get("5").GetTime(); v != time.Date(2019, 1, 1, 0, 0, 0, 0, time.UTC) { t.Fatal(v) } if v := as.Get("6").GetFloat(); v != 5.5 { t.Fatal(v) } }