bool_slice_test.go 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. package pflag
  2. import (
  3. "fmt"
  4. "strconv"
  5. "strings"
  6. "testing"
  7. )
  8. func setUpBSFlagSet(bsp *[]bool) *FlagSet {
  9. f := NewFlagSet("test", ContinueOnError)
  10. f.BoolSliceVar(bsp, "bs", []bool{}, "Command separated list!")
  11. return f
  12. }
  13. func setUpBSFlagSetWithDefault(bsp *[]bool) *FlagSet {
  14. f := NewFlagSet("test", ContinueOnError)
  15. f.BoolSliceVar(bsp, "bs", []bool{false, true}, "Command separated list!")
  16. return f
  17. }
  18. func TestEmptyBS(t *testing.T) {
  19. var bs []bool
  20. f := setUpBSFlagSet(&bs)
  21. err := f.Parse([]string{})
  22. if err != nil {
  23. t.Fatal("expected no error; got", err)
  24. }
  25. getBS, err := f.GetBoolSlice("bs")
  26. if err != nil {
  27. t.Fatal("got an error from GetBoolSlice():", err)
  28. }
  29. if len(getBS) != 0 {
  30. t.Fatalf("got bs %v with len=%d but expected length=0", getBS, len(getBS))
  31. }
  32. }
  33. func TestBS(t *testing.T) {
  34. var bs []bool
  35. f := setUpBSFlagSet(&bs)
  36. vals := []string{"1", "F", "TRUE", "0"}
  37. arg := fmt.Sprintf("--bs=%s", strings.Join(vals, ","))
  38. err := f.Parse([]string{arg})
  39. if err != nil {
  40. t.Fatal("expected no error; got", err)
  41. }
  42. for i, v := range bs {
  43. b, err := strconv.ParseBool(vals[i])
  44. if err != nil {
  45. t.Fatalf("got error: %v", err)
  46. }
  47. if b != v {
  48. t.Fatalf("expected is[%d] to be %s but got: %t", i, vals[i], v)
  49. }
  50. }
  51. getBS, err := f.GetBoolSlice("bs")
  52. if err != nil {
  53. t.Fatalf("got error: %v", err)
  54. }
  55. for i, v := range getBS {
  56. b, err := strconv.ParseBool(vals[i])
  57. if err != nil {
  58. t.Fatalf("got error: %v", err)
  59. }
  60. if b != v {
  61. t.Fatalf("expected bs[%d] to be %s but got: %t from GetBoolSlice", i, vals[i], v)
  62. }
  63. }
  64. }
  65. func TestBSDefault(t *testing.T) {
  66. var bs []bool
  67. f := setUpBSFlagSetWithDefault(&bs)
  68. vals := []string{"false", "T"}
  69. err := f.Parse([]string{})
  70. if err != nil {
  71. t.Fatal("expected no error; got", err)
  72. }
  73. for i, v := range bs {
  74. b, err := strconv.ParseBool(vals[i])
  75. if err != nil {
  76. t.Fatalf("got error: %v", err)
  77. }
  78. if b != v {
  79. t.Fatalf("expected bs[%d] to be %t from GetBoolSlice but got: %t", i, b, v)
  80. }
  81. }
  82. getBS, err := f.GetBoolSlice("bs")
  83. if err != nil {
  84. t.Fatal("got an error from GetBoolSlice():", err)
  85. }
  86. for i, v := range getBS {
  87. b, err := strconv.ParseBool(vals[i])
  88. if err != nil {
  89. t.Fatal("got an error from GetBoolSlice():", err)
  90. }
  91. if b != v {
  92. t.Fatalf("expected bs[%d] to be %t from GetBoolSlice but got: %t", i, b, v)
  93. }
  94. }
  95. }
  96. func TestBSWithDefault(t *testing.T) {
  97. var bs []bool
  98. f := setUpBSFlagSetWithDefault(&bs)
  99. vals := []string{"FALSE", "1"}
  100. arg := fmt.Sprintf("--bs=%s", strings.Join(vals, ","))
  101. err := f.Parse([]string{arg})
  102. if err != nil {
  103. t.Fatal("expected no error; got", err)
  104. }
  105. for i, v := range bs {
  106. b, err := strconv.ParseBool(vals[i])
  107. if err != nil {
  108. t.Fatalf("got error: %v", err)
  109. }
  110. if b != v {
  111. t.Fatalf("expected bs[%d] to be %t but got: %t", i, b, v)
  112. }
  113. }
  114. getBS, err := f.GetBoolSlice("bs")
  115. if err != nil {
  116. t.Fatal("got an error from GetBoolSlice():", err)
  117. }
  118. for i, v := range getBS {
  119. b, err := strconv.ParseBool(vals[i])
  120. if err != nil {
  121. t.Fatalf("got error: %v", err)
  122. }
  123. if b != v {
  124. t.Fatalf("expected bs[%d] to be %t from GetBoolSlice but got: %t", i, b, v)
  125. }
  126. }
  127. }
  128. func TestBSCalledTwice(t *testing.T) {
  129. var bs []bool
  130. f := setUpBSFlagSet(&bs)
  131. in := []string{"T,F", "T"}
  132. expected := []bool{true, false, true}
  133. argfmt := "--bs=%s"
  134. arg1 := fmt.Sprintf(argfmt, in[0])
  135. arg2 := fmt.Sprintf(argfmt, in[1])
  136. err := f.Parse([]string{arg1, arg2})
  137. if err != nil {
  138. t.Fatal("expected no error; got", err)
  139. }
  140. for i, v := range bs {
  141. if expected[i] != v {
  142. t.Fatalf("expected bs[%d] to be %t but got %t", i, expected[i], v)
  143. }
  144. }
  145. }
  146. func TestBSBadQuoting(t *testing.T) {
  147. tests := []struct {
  148. Want []bool
  149. FlagArg []string
  150. }{
  151. {
  152. Want: []bool{true, false, true},
  153. FlagArg: []string{"1", "0", "true"},
  154. },
  155. {
  156. Want: []bool{true, false},
  157. FlagArg: []string{"True", "F"},
  158. },
  159. {
  160. Want: []bool{true, false},
  161. FlagArg: []string{"T", "0"},
  162. },
  163. {
  164. Want: []bool{true, false},
  165. FlagArg: []string{"1", "0"},
  166. },
  167. {
  168. Want: []bool{true, false, false},
  169. FlagArg: []string{"true,false", "false"},
  170. },
  171. {
  172. Want: []bool{true, false, false, true, false, true, false},
  173. FlagArg: []string{`"true,false,false,1,0, T"`, " false "},
  174. },
  175. {
  176. Want: []bool{false, false, true, false, true, false, true},
  177. FlagArg: []string{`"0, False, T,false , true,F"`, "true"},
  178. },
  179. }
  180. for i, test := range tests {
  181. var bs []bool
  182. f := setUpBSFlagSet(&bs)
  183. if err := f.Parse([]string{fmt.Sprintf("--bs=%s", strings.Join(test.FlagArg, ","))}); err != nil {
  184. t.Fatalf("flag parsing failed with error: %s\nparsing:\t%#v\nwant:\t\t%#v",
  185. err, test.FlagArg, test.Want[i])
  186. }
  187. for j, b := range bs {
  188. if b != test.Want[j] {
  189. t.Fatalf("bad value parsed for test %d on bool %d:\nwant:\t%t\ngot:\t%t", i, j, test.Want[j], b)
  190. }
  191. }
  192. }
  193. }