group_test.go 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. package flags
  2. import (
  3. "testing"
  4. )
  5. func TestGroupInline(t *testing.T) {
  6. var opts = struct {
  7. Value bool `short:"v"`
  8. Group struct {
  9. G bool `short:"g"`
  10. } `group:"Grouped Options"`
  11. }{}
  12. p, ret := assertParserSuccess(t, &opts, "-v", "-g")
  13. assertStringArray(t, ret, []string{})
  14. if !opts.Value {
  15. t.Errorf("Expected Value to be true")
  16. }
  17. if !opts.Group.G {
  18. t.Errorf("Expected Group.G to be true")
  19. }
  20. if p.Command.Group.Find("Grouped Options") == nil {
  21. t.Errorf("Expected to find group `Grouped Options'")
  22. }
  23. }
  24. func TestGroupAdd(t *testing.T) {
  25. var opts = struct {
  26. Value bool `short:"v"`
  27. }{}
  28. var grp = struct {
  29. G bool `short:"g"`
  30. }{}
  31. p := NewParser(&opts, Default)
  32. g, err := p.AddGroup("Grouped Options", "", &grp)
  33. if err != nil {
  34. t.Fatalf("Unexpected error: %v", err)
  35. return
  36. }
  37. ret, err := p.ParseArgs([]string{"-v", "-g", "rest"})
  38. if err != nil {
  39. t.Fatalf("Unexpected error: %v", err)
  40. return
  41. }
  42. assertStringArray(t, ret, []string{"rest"})
  43. if !opts.Value {
  44. t.Errorf("Expected Value to be true")
  45. }
  46. if !grp.G {
  47. t.Errorf("Expected Group.G to be true")
  48. }
  49. if p.Command.Group.Find("Grouped Options") != g {
  50. t.Errorf("Expected to find group `Grouped Options'")
  51. }
  52. if p.Groups()[1] != g {
  53. t.Errorf("Expected group %#v, but got %#v", g, p.Groups()[0])
  54. }
  55. if g.Options()[0].ShortName != 'g' {
  56. t.Errorf("Expected short name `g' but got %v", g.Options()[0].ShortName)
  57. }
  58. }
  59. func TestGroupNestedInline(t *testing.T) {
  60. var opts = struct {
  61. Value bool `short:"v"`
  62. Group struct {
  63. G bool `short:"g"`
  64. Nested struct {
  65. N string `long:"n"`
  66. } `group:"Nested Options"`
  67. } `group:"Grouped Options"`
  68. }{}
  69. p, ret := assertParserSuccess(t, &opts, "-v", "-g", "--n", "n", "rest")
  70. assertStringArray(t, ret, []string{"rest"})
  71. if !opts.Value {
  72. t.Errorf("Expected Value to be true")
  73. }
  74. if !opts.Group.G {
  75. t.Errorf("Expected Group.G to be true")
  76. }
  77. assertString(t, opts.Group.Nested.N, "n")
  78. if p.Command.Group.Find("Grouped Options") == nil {
  79. t.Errorf("Expected to find group `Grouped Options'")
  80. }
  81. if p.Command.Group.Find("Nested Options") == nil {
  82. t.Errorf("Expected to find group `Nested Options'")
  83. }
  84. }
  85. func TestGroupNestedInlineNamespace(t *testing.T) {
  86. var opts = struct {
  87. Opt string `long:"opt"`
  88. Group struct {
  89. Opt string `long:"opt"`
  90. Group struct {
  91. Opt string `long:"opt"`
  92. } `group:"Subsubgroup" namespace:"sap"`
  93. } `group:"Subgroup" namespace:"sip"`
  94. }{}
  95. p, ret := assertParserSuccess(t, &opts, "--opt", "a", "--sip.opt", "b", "--sip.sap.opt", "c", "rest")
  96. assertStringArray(t, ret, []string{"rest"})
  97. assertString(t, opts.Opt, "a")
  98. assertString(t, opts.Group.Opt, "b")
  99. assertString(t, opts.Group.Group.Opt, "c")
  100. for _, name := range []string{"Subgroup", "Subsubgroup"} {
  101. if p.Command.Group.Find(name) == nil {
  102. t.Errorf("Expected to find group '%s'", name)
  103. }
  104. }
  105. }
  106. func TestDuplicateShortFlags(t *testing.T) {
  107. var opts struct {
  108. Verbose []bool `short:"v" long:"verbose" description:"Show verbose debug information"`
  109. Variables []string `short:"v" long:"variable" description:"Set a variable value."`
  110. }
  111. args := []string{
  112. "--verbose",
  113. "-v", "123",
  114. "-v", "456",
  115. }
  116. _, err := ParseArgs(&opts, args)
  117. if err == nil {
  118. t.Errorf("Expected an error with type ErrDuplicatedFlag")
  119. } else {
  120. err2 := err.(*Error)
  121. if err2.Type != ErrDuplicatedFlag {
  122. t.Errorf("Expected an error with type ErrDuplicatedFlag")
  123. }
  124. }
  125. }
  126. func TestDuplicateLongFlags(t *testing.T) {
  127. var opts struct {
  128. Test1 []bool `short:"a" long:"testing" description:"Test 1"`
  129. Test2 []string `short:"b" long:"testing" description:"Test 2."`
  130. }
  131. args := []string{
  132. "--testing",
  133. }
  134. _, err := ParseArgs(&opts, args)
  135. if err == nil {
  136. t.Errorf("Expected an error with type ErrDuplicatedFlag")
  137. } else {
  138. err2 := err.(*Error)
  139. if err2.Type != ErrDuplicatedFlag {
  140. t.Errorf("Expected an error with type ErrDuplicatedFlag")
  141. }
  142. }
  143. }
  144. func TestFindOptionByLongFlag(t *testing.T) {
  145. var opts struct {
  146. Testing bool `long:"testing" description:"Testing"`
  147. }
  148. p := NewParser(&opts, Default)
  149. opt := p.FindOptionByLongName("testing")
  150. if opt == nil {
  151. t.Errorf("Expected option, but found none")
  152. }
  153. assertString(t, opt.LongName, "testing")
  154. }
  155. func TestFindOptionByShortFlag(t *testing.T) {
  156. var opts struct {
  157. Testing bool `short:"t" description:"Testing"`
  158. }
  159. p := NewParser(&opts, Default)
  160. opt := p.FindOptionByShortName('t')
  161. if opt == nil {
  162. t.Errorf("Expected option, but found none")
  163. }
  164. if opt.ShortName != 't' {
  165. t.Errorf("Expected 't', but got %v", opt.ShortName)
  166. }
  167. }
  168. func TestFindOptionByLongFlagInSubGroup(t *testing.T) {
  169. var opts struct {
  170. Group struct {
  171. Testing bool `long:"testing" description:"Testing"`
  172. } `group:"sub-group"`
  173. }
  174. p := NewParser(&opts, Default)
  175. opt := p.FindOptionByLongName("testing")
  176. if opt == nil {
  177. t.Errorf("Expected option, but found none")
  178. }
  179. assertString(t, opt.LongName, "testing")
  180. }
  181. func TestFindOptionByShortFlagInSubGroup(t *testing.T) {
  182. var opts struct {
  183. Group struct {
  184. Testing bool `short:"t" description:"Testing"`
  185. } `group:"sub-group"`
  186. }
  187. p := NewParser(&opts, Default)
  188. opt := p.FindOptionByShortName('t')
  189. if opt == nil {
  190. t.Errorf("Expected option, but found none")
  191. }
  192. if opt.ShortName != 't' {
  193. t.Errorf("Expected 't', but got %v", opt.ShortName)
  194. }
  195. }