gocmdDaemon/flag_test.go

227 lines
5.9 KiB
Go

package gocmdDaemon
import (
"encoding/json"
"flag"
"fmt"
"os"
"testing"
)
func TestMFlag_Int(t *testing.T) {
// 保存原始参数,以便测试后恢复
oldArgs := os.Args
defer func() { os.Args = oldArgs }()
// 重置flag包状态
flag.CommandLine = flag.NewFlagSet(os.Args[0], flag.ExitOnError)
// 设置测试参数
os.Args = []string{"cmd", "-i", "123", "--int-flag", "456"}
m := &MFlag{
flags: make(map[string]interface{}),
}
// 注册标志
m.Int("i", "int-flag", 0, "测试整数标志")
m.Parse()
// 测试短标志
if got := m.GetIntFlag("int-flag"); got != 456 {
t.Errorf("GetIntFlag() = %v, want %v", got, 456)
}
}
func TestMFlag_String(t *testing.T) {
// 保存原始参数,以便测试后恢复
oldArgs := os.Args
defer func() { os.Args = oldArgs }()
// 重置flag包状态
flag.CommandLine = flag.NewFlagSet(os.Args[0], flag.ExitOnError)
// 设置测试参数
os.Args = []string{"cmd", "-s", "hello", "--str-flag", "world"}
m := &MFlag{
flags: make(map[string]interface{}),
}
// 注册标志
m.String("s", "str-flag", "", "测试字符串标志")
m.Parse()
// 测试长标志
if got := m.GetStringFlag("str-flag"); got != "world" {
t.Errorf("GetStringFlag() = %v, want %v", got, "world")
}
}
func TestMFlag_Bool(t *testing.T) {
// 保存原始参数,以便测试后恢复
oldArgs := os.Args
defer func() { os.Args = oldArgs }()
// 重置flag包状态
flag.CommandLine = flag.NewFlagSet(os.Args[0], flag.ExitOnError)
// 设置测试参数
os.Args = []string{"cmd", "-b", "--bool-flag"}
m := &MFlag{
flags: make(map[string]interface{}),
}
// 注册标志
m.Bool("b", "bool-flag", false, "测试布尔标志")
m.Parse()
// 测试布尔标志
if got := m.GetBoolFlag("bool-flag"); !got {
t.Errorf("GetBoolFlag() = %v, want %v", got, true)
}
}
func TestMFlag_GetNonExistentFlags(t *testing.T) {
m := &MFlag{
flags: make(map[string]interface{}),
}
// 测试获取不存在的标志
if got := m.GetIntFlag("non-existent"); got != -1 {
t.Errorf("GetIntFlag() for non-existent flag = %v, want %v", got, -1)
}
if got := m.GetStringFlag("non-existent"); got != "" {
t.Errorf("GetStringFlag() for non-existent flag = %v, want %v", got, "")
}
if got := m.GetBoolFlag("non-existent"); got != false {
t.Errorf("GetBoolFlag() for non-existent flag = %v, want %v", got, false)
}
}
func TestMFlag_RemainArgs(t *testing.T) {
// 保存原始参数,以便测试后恢复
oldArgs := os.Args
defer func() { os.Args = oldArgs }()
// 重置flag包状态
flag.CommandLine = flag.NewFlagSet(os.Args[0], flag.ExitOnError)
// 设置测试参数,包括剩余参数
os.Args = []string{"cmd", "-i", "123", "arg1", "arg2", "arg3", "-d"}
m := &MFlag{
flags: make(map[string]interface{}),
}
// 注册标志
m.Int("i", "int-flag", 0, "测试整数标志")
m.Parse()
// 测试剩余参数
expectedArgs := []string{"arg1", "arg2", "arg3", "-d"}
if len(m.RemainArgs) != len(expectedArgs) {
t.Errorf("RemainArgs length = %v, want %v", len(m.RemainArgs), len(expectedArgs))
}
for i, arg := range expectedArgs {
if i < len(m.RemainArgs) && m.RemainArgs[i] != arg {
t.Errorf("RemainArgs[%d] = %v, want %v", i, m.RemainArgs[i], arg)
}
}
}
func TestMFlag_MultipleFlags(t *testing.T) {
// 保存原始参数,以便测试后恢复
oldArgs := os.Args
defer func() { os.Args = oldArgs }()
// 重置flag包状态
flag.CommandLine = flag.NewFlagSet(os.Args[0], flag.ExitOnError)
// 设置测试参数
os.Args = []string{"cmd", "-i", "123", "-s", "hello", "-b", "subcmd", "-s", "h1"}
m := &MFlag{
flags: make(map[string]interface{}),
}
// 注册多个标志
m.Int("i", "int-flag", 0, "测试整数标志")
m.String("s", "str-flag", "", "测试字符串标志")
m.Bool("b", "bool-flag", false, "测试布尔标志")
m.Parse()
// 测试所有标志值
if got := m.GetIntFlag("int-flag"); got != 123 {
t.Errorf("GetIntFlag() = %v, want %v", got, 123)
}
if got := m.GetStringFlag("str-flag"); got != "hello" {
t.Errorf("GetStringFlag() = %v, want %v", got, "hello")
}
if got := m.GetBoolFlag("bool-flag"); !got {
t.Errorf("GetBoolFlag() = %v, want %v", got, true)
}
}
func TestMFlag_MarshalJSON(t *testing.T) {
oldArgs := os.Args
defer func() { os.Args = oldArgs }()
// 重置flag包状态
flag.CommandLine = flag.NewFlagSet(os.Args[0], flag.ExitOnError)
// 设置测试参数
os.Args = []string{"cmd", "-i", "123", "-s", "hello", "-b", "subcmd", "-s", "h1"}
m := &MFlag{
flags: make(map[string]interface{}),
}
// 注册多个标志
m.Int("i", "int-flag", 0, "测试整数标志")
m.String("s", "str-flag", "", "测试字符串标志")
m.Bool("b", "bool-flag", false, "测试布尔标志")
m.Parse()
fmt.Println(m.GetIntFlag("int-flag"))
jsonBytes, err := m.MarshalJSON()
if err != nil {
t.Errorf("MarshalJSON() error = %v, want nil", err)
}
var result map[string]interface{}
err = json.Unmarshal(jsonBytes, &result)
if err != nil {
t.Errorf("UnmarshalJSON() error = %v, want nil", err)
}
if int(result["int-flag"].(float64)) != 123 {
t.Errorf("MarshalJSON() int-flag = %v, want %v", result["int-flag"], 123)
}
if result["str-flag"] != "hello" {
t.Errorf("MarshalJSON() str-flag = %v, want %v", result["str-flag"], "hello")
}
if result["bool-flag"] != true {
t.Errorf("MarshalJSON() bool-flag = %v, want %v", result["bool-flag"], true)
}
m1 := &MFlag{
flags: make(map[string]interface{}),
}
err1 := json.Unmarshal(jsonBytes, m1)
if err1 != nil {
t.Errorf("UnmarshalJSON() error = %v, want nil", err)
}
if int(m1.GetIntFlag("int-flag")) != 123 {
t.Errorf("MarshalJSON() int-flag = %v, want %v", m1.GetIntFlag("int-flag"), 123)
}
if m1.GetStringFlag("str-flag") != "hello" {
t.Errorf("MarshalJSON() str-flag = %v, want %v", m1.GetStringFlag("str-flag"), "hello")
}
if m1.GetBoolFlag("bool-flag") != true {
t.Errorf("MarshalJSON() bool-flag = %v, want %v", m1.GetBoolFlag("bool-flag"), true)
}
}