package main import ( "bytes" "errors" "flag" "io" "strings" "testing" ) func TestRunArguments(t *testing.T) { var output bytes.Buffer err := run([]string{"-name", "小朱", "-minutes", "30"}, strings.NewReader(""), &output) if err != nil { t.Fatalf("运行失败:%v", err) } want := "学习者:小朱,学习时长:30 分钟\n" if output.String() != want { t.Errorf("输出=%q,期望=%q", output.String(), want) } } func TestRunInteractive(t *testing.T) { var output bytes.Buffer err := run([]string{"-interactive"}, strings.NewReader("小朱\n45\n"), &output) if err != nil { t.Fatalf("交互失败:%v", err) } want := "请输入姓名:请输入学习分钟数:学习者:小朱,学习时长:45 分钟\n" if output.String() != want { t.Errorf("输出=%q,期望=%q", output.String(), want) } } func TestRunErrors(t *testing.T) { tests := []struct { name string args []string input string }{ {name: "missing_name", args: []string{"-minutes", "30"}}, {name: "empty_name", args: []string{"-name", " ", "-minutes", "30"}}, {name: "zero", args: []string{"-name", "小朱", "-minutes", "0"}}, {name: "too_large", args: []string{"-name", "小朱", "-minutes", "1441"}}, {name: "invalid_flag", args: []string{"-unknown"}}, {name: "invalid_number", args: []string{"-name", "小朱", "-minutes", "abc"}}, {name: "positional", args: []string{"extra"}}, {name: "mixed", args: []string{"-interactive", "-minutes", "0"}}, {name: "missing_input", args: []string{"-interactive"}, input: "小朱\n"}, {name: "invalid_input", args: []string{"-interactive"}, input: "小朱\nabc\n"}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := run(tt.args, strings.NewReader(tt.input), io.Discard); err == nil { t.Fatal("预期返回错误,实际没有错误") } }) } } func TestRunBounds(t *testing.T) { for _, minutes := range []string{"1", "1440"} { t.Run(minutes, func(t *testing.T) { err := run([]string{"-name", "小朱", "-minutes", minutes}, strings.NewReader(""), io.Discard) if err != nil { t.Fatalf("边界值应当有效:%v", err) } }) } } func TestRunHelp(t *testing.T) { var output bytes.Buffer err := run([]string{"-h"}, strings.NewReader(""), &output) if !errors.Is(err, flag.ErrHelp) { t.Fatalf("期望帮助标记,实际错误:%v", err) } if !strings.Contains(output.String(), "-interactive") { t.Errorf("帮助信息未包含参数说明:%q", output.String()) } }