155 lines
3.8 KiB
Go
Executable File
155 lines
3.8 KiB
Go
Executable File
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)
|
|
}
|
|
}
|