main_test.go 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. package main
  2. import (
  3. "bytes"
  4. "errors"
  5. "flag"
  6. "io"
  7. "strings"
  8. "testing"
  9. )
  10. func TestRunArguments(t *testing.T) {
  11. var output bytes.Buffer
  12. err := run([]string{"-name", "小朱", "-minutes", "30"}, strings.NewReader(""), &output)
  13. if err != nil {
  14. t.Fatalf("运行失败:%v", err)
  15. }
  16. want := "学习者:小朱,学习时长:30 分钟\n"
  17. if output.String() != want {
  18. t.Errorf("输出=%q,期望=%q", output.String(), want)
  19. }
  20. }
  21. func TestRunInteractive(t *testing.T) {
  22. var output bytes.Buffer
  23. err := run([]string{"-interactive"}, strings.NewReader("小朱\n45\n"), &output)
  24. if err != nil {
  25. t.Fatalf("交互失败:%v", err)
  26. }
  27. want := "请输入姓名:请输入学习分钟数:学习者:小朱,学习时长:45 分钟\n"
  28. if output.String() != want {
  29. t.Errorf("输出=%q,期望=%q", output.String(), want)
  30. }
  31. }
  32. func TestRunErrors(t *testing.T) {
  33. tests := []struct {
  34. name string
  35. args []string
  36. input string
  37. }{
  38. {name: "missing_name", args: []string{"-minutes", "30"}},
  39. {name: "empty_name", args: []string{"-name", " ", "-minutes", "30"}},
  40. {name: "zero", args: []string{"-name", "小朱", "-minutes", "0"}},
  41. {name: "too_large", args: []string{"-name", "小朱", "-minutes", "1441"}},
  42. {name: "invalid_flag", args: []string{"-unknown"}},
  43. {name: "invalid_number", args: []string{"-name", "小朱", "-minutes", "abc"}},
  44. {name: "positional", args: []string{"extra"}},
  45. {name: "mixed", args: []string{"-interactive", "-minutes", "0"}},
  46. {name: "missing_input", args: []string{"-interactive"}, input: "小朱\n"},
  47. {name: "invalid_input", args: []string{"-interactive"}, input: "小朱\nabc\n"},
  48. }
  49. for _, tt := range tests {
  50. t.Run(tt.name, func(t *testing.T) {
  51. if err := run(tt.args, strings.NewReader(tt.input), io.Discard); err == nil {
  52. t.Fatal("预期返回错误,实际没有错误")
  53. }
  54. })
  55. }
  56. }
  57. func TestRunBounds(t *testing.T) {
  58. for _, minutes := range []string{"1", "1440"} {
  59. t.Run(minutes, func(t *testing.T) {
  60. err := run([]string{"-name", "小朱", "-minutes", minutes}, strings.NewReader(""), io.Discard)
  61. if err != nil {
  62. t.Fatalf("边界值应当有效:%v", err)
  63. }
  64. })
  65. }
  66. }
  67. func TestRunHelp(t *testing.T) {
  68. var output bytes.Buffer
  69. err := run([]string{"-h"}, strings.NewReader(""), &output)
  70. if !errors.Is(err, flag.ErrHelp) {
  71. t.Fatalf("期望帮助标记,实际错误:%v", err)
  72. }
  73. if !strings.Contains(output.String(), "-interactive") {
  74. t.Errorf("帮助信息未包含参数说明:%q", output.String())
  75. }
  76. }