github.com/rakutentech/cli@v6.12.5-0.20151006231303-24468b65536e+incompatible/flags/flags_test.go (about) 1 package flags_test 2 3 import ( 4 . "github.com/cloudfoundry/cli/flags" 5 "github.com/cloudfoundry/cli/flags/flag" 6 7 . "github.com/onsi/ginkgo" 8 . "github.com/onsi/gomega" 9 ) 10 11 var _ = Describe("Flags", func() { 12 13 Describe("FlagContext", func() { 14 15 Describe("Parsing and retriving values", func() { 16 17 var ( 18 fCtx FlagContext 19 cmdFlagMap map[string]FlagSet 20 ) 21 22 BeforeEach(func() { 23 cmdFlagMap = make(map[string]FlagSet) 24 25 cmdFlagMap["name"] = &cliFlags.StringFlag{Name: "name", Usage: "test string flag"} 26 cmdFlagMap["skip"] = &cliFlags.BoolFlag{Name: "skip", Usage: "test bool flag"} 27 cmdFlagMap["instance"] = &cliFlags.IntFlag{Name: "instance", Usage: "test int flag"} 28 cmdFlagMap["skip2"] = &cliFlags.BoolFlag{Name: "skip2", Usage: "test bool flag"} 29 cmdFlagMap["slice"] = &cliFlags.StringSliceFlag{Name: "slice", Usage: "test stringSlice flag"} 30 31 fCtx = NewFlagContext(cmdFlagMap) 32 }) 33 34 It("accepts flags with either single '-' or double '-' ", func() { 35 err := fCtx.Parse("--name", "blue") 36 Ω(err).ToNot(HaveOccurred()) 37 38 err = fCtx.Parse("-name", "") 39 Ω(err).ToNot(HaveOccurred()) 40 }) 41 42 It("checks if a flag is defined in the FlagContext", func() { 43 err := fCtx.Parse("-not_defined", "") 44 Ω(err).To(HaveOccurred()) 45 46 err = fCtx.Parse("-name", "blue") 47 Ω(err).ToNot(HaveOccurred()) 48 49 err = fCtx.Parse("--skip", "") 50 Ω(err).ToNot(HaveOccurred()) 51 }) 52 53 It("sets Bool(<flag>) to return value if bool flag is provided with value true/false", func() { 54 err := fCtx.Parse("--skip=false", "-skip2", "true", "-name=johndoe") 55 Ω(err).ToNot(HaveOccurred()) 56 57 Ω(len(fCtx.Args())).To(Equal(0), "Length of Args() should be 0") 58 Ω(fCtx.Bool("skip")).To(Equal(false), "skip should be false") 59 Ω(fCtx.Bool("skip2")).To(Equal(true), "skip2 should be true") 60 Ω(fCtx.Bool("name")).To(Equal(false), "name should be false") 61 Ω(fCtx.String("name")).To(Equal("johndoe"), "name should be johndoe") 62 Ω(fCtx.Bool("non-exisit-flag")).To(Equal(false)) 63 }) 64 65 It("sets Bool(<flag>) to return true if bool flag is provided with invalid value", func() { 66 err := fCtx.Parse("--skip=Not_Valid", "skip2", "FALSE", "-name", "johndoe") 67 Ω(err).ToNot(HaveOccurred()) 68 69 Ω(fCtx.Bool("skip")).To(Equal(true), "skip should be true") 70 Ω(fCtx.Bool("skip2")).To(Equal(false), "skip2 should be false") 71 }) 72 73 It("sets Bool(<flag>) to return true when a bool flag is provided without value", func() { 74 err := fCtx.Parse("--skip", "-name", "johndoe") 75 Ω(err).ToNot(HaveOccurred()) 76 77 Ω(fCtx.Bool("skip")).To(Equal(true), "skip should be true") 78 Ω(fCtx.Bool("name")).To(Equal(false), "name should be false") 79 Ω(fCtx.Bool("non-exisit-flag")).To(Equal(false)) 80 }) 81 82 It("sets String(<flag>) to return provided value when a string flag is provided", func() { 83 err := fCtx.Parse("--skip", "-name", "doe") 84 Ω(err).ToNot(HaveOccurred()) 85 86 Ω(fCtx.String("name")).To(Equal("doe")) 87 Ω(fCtx.Bool("skip")).To(Equal(true), "skip should be true") 88 }) 89 90 It("sets StringSlice(<flag>) to return provided value when a stringSlice flag is provided", func() { 91 err := fCtx.Parse("-slice", "value1", "-slice", "value2") 92 Ω(err).ToNot(HaveOccurred()) 93 94 Ω(fCtx.StringSlice("slice")[0]).To(Equal("value1"), "slice[0] should be 'value1'") 95 Ω(fCtx.StringSlice("slice")[1]).To(Equal("value2"), "slice[1] should be 'value2'") 96 }) 97 98 It("errors when a non-boolean flag is provided without a value", func() { 99 err := fCtx.Parse("-name") 100 Ω(err).To(HaveOccurred()) 101 Ω(err.Error()).To(ContainSubstring("No value provided for flag")) 102 Ω(fCtx.String("name")).To(Equal("")) 103 }) 104 105 It("sets Int(<flag>) to return provided value when a int flag is provided", func() { 106 err := fCtx.Parse("--instance", "10") 107 Ω(err).ToNot(HaveOccurred()) 108 109 Ω(fCtx.Int("instance")).To(Equal(10)) 110 Ω(fCtx.IsSet("instance")).To(Equal(true)) 111 112 Ω(fCtx.Int("non-exist-flag")).To(Equal(0)) 113 Ω(fCtx.IsSet("non-exist-flag")).To(Equal(false)) 114 }) 115 116 It("returns any non-flag arguments in Args()", func() { 117 err := fCtx.Parse("Arg-1", "--instance", "10", "--skip", "Arg-2") 118 Ω(err).ToNot(HaveOccurred()) 119 120 Ω(len(fCtx.Args())).To(Equal(2)) 121 Ω(fCtx.Args()[0]).To(Equal("Arg-1")) 122 Ω(fCtx.Args()[1]).To(Equal("Arg-2")) 123 }) 124 125 It("accepts flag/value in the forms of '-flag=value' and '-flag value'", func() { 126 err := fCtx.Parse("-instance", "10", "--name=foo", "--skip", "Arg-1") 127 Ω(err).ToNot(HaveOccurred()) 128 129 Ω(fCtx.IsSet("instance")).To(Equal(true)) 130 Ω(fCtx.Int("instance")).To(Equal(10)) 131 132 Ω(fCtx.IsSet("name")).To(Equal(true)) 133 Ω(fCtx.String("name")).To(Equal("foo")) 134 135 Ω(fCtx.IsSet("skip")).To(Equal(true)) 136 137 Ω(len(fCtx.Args())).To(Equal(1)) 138 Ω(fCtx.Args()[0]).To(Equal("Arg-1")) 139 }) 140 141 Context("Default Flag Value", func() { 142 143 BeforeEach(func() { 144 cmdFlagMap = make(map[string]FlagSet) 145 146 cmdFlagMap["defaultStringFlag"] = &cliFlags.StringFlag{Name: "defaultStringFlag", Value: "Set by default"} 147 cmdFlagMap["defaultBoolFlag"] = &cliFlags.BoolFlag{Name: "defaultBoolFlag", Value: true} 148 cmdFlagMap["defaultIntFlag"] = &cliFlags.IntFlag{Name: "defaultIntFlag", Value: 100} 149 cmdFlagMap["defaultStringAryFlag"] = &cliFlags.StringSliceFlag{Name: "defaultStringAryFlag", Value: []string{"abc", "def"}} 150 cmdFlagMap["noDefaultStringFlag"] = &cliFlags.StringFlag{Name: "noDefaultStringFlag"} 151 152 fCtx = NewFlagContext(cmdFlagMap) 153 }) 154 155 It("sets flag with default value if 'Value' is provided", func() { 156 err := fCtx.Parse() 157 Ω(err).ToNot(HaveOccurred()) 158 159 Ω(fCtx.String("defaultStringFlag")).To(Equal("Set by default")) 160 Ω(fCtx.IsSet("defaultStringFlag")).To(BeTrue()) 161 162 Ω(fCtx.Bool("defaultBoolFlag")).To(BeTrue()) 163 Ω(fCtx.IsSet("defaultBoolFlag")).To(BeTrue()) 164 165 Ω(fCtx.Int("defaultIntFlag")).To(Equal(100)) 166 Ω(fCtx.IsSet("defaultIntFlag")).To(BeTrue()) 167 168 Ω(fCtx.StringSlice("defaultStringAryFlag")).To(Equal([]string{"abc", "def"})) 169 Ω(fCtx.IsSet("defaultStringAryFlag")).To(BeTrue()) 170 171 Ω(fCtx.String("noDefaultStringFlag")).To(Equal("")) 172 Ω(fCtx.IsSet("noDefaultStringFlag")).To(BeFalse()) 173 }) 174 175 It("overrides default value if argument is provided, except StringSlice Flag", func() { 176 err := fCtx.Parse("-defaultStringFlag=foo", "-defaultBoolFlag=false", "-defaultIntFlag=200", "-defaultStringAryFlag=foo", "-defaultStringAryFlag=bar", "-noDefaultStringFlag=baz") 177 Ω(err).ToNot(HaveOccurred()) 178 179 Ω(fCtx.String("defaultStringFlag")).To(Equal("foo")) 180 Ω(fCtx.IsSet("defaultStringFlag")).To(BeTrue()) 181 182 Ω(fCtx.Bool("defaultBoolFlag")).To(BeFalse()) 183 Ω(fCtx.IsSet("defaultBoolFlag")).To(BeTrue()) 184 185 Ω(fCtx.Int("defaultIntFlag")).To(Equal(200)) 186 Ω(fCtx.IsSet("defaultIntFlag")).To(BeTrue()) 187 188 Ω(fCtx.String("noDefaultStringFlag")).To(Equal("baz")) 189 Ω(fCtx.IsSet("noDefaultStringFlag")).To(BeTrue()) 190 }) 191 192 It("appends argument value to StringSliceFlag to the default values", func() { 193 err := fCtx.Parse("-defaultStringAryFlag=foo", "-defaultStringAryFlag=bar") 194 Ω(err).ToNot(HaveOccurred()) 195 196 Ω(fCtx.StringSlice("defaultStringAryFlag")).To(Equal([]string{"abc", "def", "foo", "bar"})) 197 Ω(fCtx.IsSet("defaultStringAryFlag")).To(BeTrue()) 198 }) 199 200 }) 201 202 Context("SkipFlagParsing", func() { 203 It("skips flag parsing and treats all arguments as values", func() { 204 fCtx.SkipFlagParsing(true) 205 err := fCtx.Parse("value1", "--name", "foo") 206 Ω(err).ToNot(HaveOccurred()) 207 208 Ω(fCtx.IsSet("name")).To(Equal(false)) 209 210 Ω(len(fCtx.Args())).To(Equal(3)) 211 Ω(fCtx.Args()[0]).To(Equal("value1")) 212 Ω(fCtx.Args()[1]).To(Equal("--name")) 213 Ω(fCtx.Args()[2]).To(Equal("foo")) 214 }) 215 }) 216 217 }) 218 219 }) 220 })