|
|
@@ -0,0 +1,82 @@
|
|
|
+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())
|
|
|
+ }
|
|
|
+}
|