arg_test.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. package flags
  2. import (
  3. "testing"
  4. )
  5. func TestPositional(t *testing.T) {
  6. var opts = struct {
  7. Value bool `short:"v"`
  8. Positional struct {
  9. Command int
  10. Filename string
  11. Rest []string
  12. } `positional-args:"yes" required:"yes"`
  13. }{}
  14. p := NewParser(&opts, Default)
  15. ret, err := p.ParseArgs([]string{"10", "arg_test.go", "a", "b"})
  16. if err != nil {
  17. t.Fatalf("Unexpected error: %v", err)
  18. return
  19. }
  20. if opts.Positional.Command != 10 {
  21. t.Fatalf("Expected opts.Positional.Command to be 10, but got %v", opts.Positional.Command)
  22. }
  23. if opts.Positional.Filename != "arg_test.go" {
  24. t.Fatalf("Expected opts.Positional.Filename to be \"arg_test.go\", but got %v", opts.Positional.Filename)
  25. }
  26. assertStringArray(t, opts.Positional.Rest, []string{"a", "b"})
  27. assertStringArray(t, ret, []string{})
  28. }
  29. func TestPositionalRequired(t *testing.T) {
  30. var opts = struct {
  31. Value bool `short:"v"`
  32. Positional struct {
  33. Command int
  34. Filename string
  35. Rest []string
  36. } `positional-args:"yes" required:"yes"`
  37. }{}
  38. p := NewParser(&opts, None)
  39. _, err := p.ParseArgs([]string{"10"})
  40. assertError(t, err, ErrRequired, "the required argument `Filename` was not provided")
  41. }
  42. func TestPositionalRequiredRest1Fail(t *testing.T) {
  43. var opts = struct {
  44. Value bool `short:"v"`
  45. Positional struct {
  46. Rest []string `required:"yes"`
  47. } `positional-args:"yes"`
  48. }{}
  49. p := NewParser(&opts, None)
  50. _, err := p.ParseArgs([]string{})
  51. assertError(t, err, ErrRequired, "the required argument `Rest (at least 1 argument)` was not provided")
  52. }
  53. func TestPositionalRequiredRest1Pass(t *testing.T) {
  54. var opts = struct {
  55. Value bool `short:"v"`
  56. Positional struct {
  57. Rest []string `required:"yes"`
  58. } `positional-args:"yes"`
  59. }{}
  60. p := NewParser(&opts, None)
  61. _, err := p.ParseArgs([]string{"rest1"})
  62. if err != nil {
  63. t.Fatalf("Unexpected error: %v", err)
  64. return
  65. }
  66. if len(opts.Positional.Rest) != 1 {
  67. t.Fatalf("Expected 1 positional rest argument")
  68. }
  69. assertString(t, opts.Positional.Rest[0], "rest1")
  70. }
  71. func TestPositionalRequiredRest2Fail(t *testing.T) {
  72. var opts = struct {
  73. Value bool `short:"v"`
  74. Positional struct {
  75. Rest []string `required:"2"`
  76. } `positional-args:"yes"`
  77. }{}
  78. p := NewParser(&opts, None)
  79. _, err := p.ParseArgs([]string{"rest1"})
  80. assertError(t, err, ErrRequired, "the required argument `Rest (at least 2 arguments, but got only 1)` was not provided")
  81. }
  82. func TestPositionalRequiredRest2Pass(t *testing.T) {
  83. var opts = struct {
  84. Value bool `short:"v"`
  85. Positional struct {
  86. Rest []string `required:"2"`
  87. } `positional-args:"yes"`
  88. }{}
  89. p := NewParser(&opts, None)
  90. _, err := p.ParseArgs([]string{"rest1", "rest2", "rest3"})
  91. if err != nil {
  92. t.Fatalf("Unexpected error: %v", err)
  93. return
  94. }
  95. if len(opts.Positional.Rest) != 3 {
  96. t.Fatalf("Expected 3 positional rest argument")
  97. }
  98. assertString(t, opts.Positional.Rest[0], "rest1")
  99. assertString(t, opts.Positional.Rest[1], "rest2")
  100. assertString(t, opts.Positional.Rest[2], "rest3")
  101. }
  102. func TestPositionalRequiredRestRangeFail(t *testing.T) {
  103. var opts = struct {
  104. Value bool `short:"v"`
  105. Positional struct {
  106. Rest []string `required:"1-2"`
  107. } `positional-args:"yes"`
  108. }{}
  109. p := NewParser(&opts, None)
  110. _, err := p.ParseArgs([]string{"rest1", "rest2", "rest3"})
  111. assertError(t, err, ErrRequired, "the required argument `Rest (at most 2 arguments, but got 3)` was not provided")
  112. }
  113. func TestPositionalRequiredRestRangeEmptyFail(t *testing.T) {
  114. var opts = struct {
  115. Value bool `short:"v"`
  116. Positional struct {
  117. Rest []string `required:"0-0"`
  118. } `positional-args:"yes"`
  119. }{}
  120. p := NewParser(&opts, None)
  121. _, err := p.ParseArgs([]string{"some", "thing"})
  122. assertError(t, err, ErrRequired, "the required argument `Rest (zero arguments)` was not provided")
  123. }