@@ -15,6 +15,13 @@ func TestParseToEnd(t *testing.T) {
1515 require .NoError (t , ParseToEnd (fs , []string {}))
1616 require .False (t , * debugP )
1717 require .Equal (t , 0 , fs .NFlag ())
18+ require .True (t , fs .Parsed ())
19+ })
20+ t .Run ("only double dash terminator" , func (t * testing.T ) {
21+ fs := flag .NewFlagSet ("name" , flag .ContinueOnError )
22+ require .NoError (t , ParseToEnd (fs , []string {"--" }))
23+ require .Empty (t , fs .Args ())
24+ require .True (t , fs .Parsed ())
1825 })
1926 t .Run ("no args" , func (t * testing.T ) {
2027 fs := flag .NewFlagSet ("name" , flag .ContinueOnError )
@@ -115,6 +122,11 @@ func TestParseToEnd(t *testing.T) {
115122 require .Error (t , err )
116123 require .Equal (t , err .Error (), "flag provided but not defined: -some-unknown-flag" )
117124 })
125+ t .Run ("missing flag value after positional argument" , func (t * testing.T ) {
126+ fs , _ := newFlagset ()
127+ err := ParseToEnd (fs , []string {"arg1" , "--flag1" })
128+ require .EqualError (t , err , "flag needs an argument: -flag1" )
129+ })
118130 t .Run ("only positional args" , func (t * testing.T ) {
119131 fs , c := newFlagset ()
120132 err := ParseToEnd (fs , []string {"arg1" , "arg2" , "arg3" })
@@ -152,6 +164,14 @@ func TestParseToEnd(t *testing.T) {
152164 require .Equal (t , "value2" , c .flag2 )
153165 require .Equal (t , []string {"arg1" , "arg2" , "arg3" }, fs .Args ())
154166 })
167+ t .Run ("flag-looking value after positional argument" , func (t * testing.T ) {
168+ fs , c := newFlagset ()
169+ err := ParseToEnd (fs , []string {"arg1" , "--flag1" , "--flag3" , "arg2" })
170+ require .NoError (t , err )
171+ require .Equal (t , "--flag3" , c .flag1 )
172+ require .False (t , c .flag3 )
173+ require .Equal (t , []string {"arg1" , "arg2" }, fs .Args ())
174+ })
155175 t .Run ("standalone dash is positional" , func (t * testing.T ) {
156176 fs , c := newFlagset ()
157177 args := []string {"--flag1=value1" , "-" , "arg1" }
@@ -162,15 +182,32 @@ func TestParseToEnd(t *testing.T) {
162182 })
163183 t .Run ("flags after double dash terminator" , func (t * testing.T ) {
164184 fs , c := newFlagset ()
165- // The initial f.Parse consumes --flag1 and stops at "--", leaving ["--flag3"] as remaining
166- // args (the "--" is stripped by std lib). The loop then parses --flag3 as a flag,
167- // collecting zero positional args.
168185 args := []string {"--flag1=value1" , "--" , "--flag3" }
169186 err := ParseToEnd (fs , args )
170187 require .NoError (t , err )
171188 require .Equal (t , "value1" , c .flag1 )
172- require .True (t , c .flag3 )
173- require .Equal (t , 0 , fs .NArg ())
189+ require .False (t , c .flag3 )
190+ require .Equal (t , []string {"--flag3" }, fs .Args ())
191+ })
192+ t .Run ("double dash terminator before flags" , func (t * testing.T ) {
193+ fs , c := newFlagset ()
194+ err := ParseToEnd (fs , []string {"--" , "--flag3" })
195+ require .NoError (t , err )
196+ require .False (t , c .flag3 )
197+ require .Equal (t , []string {"--flag3" }, fs .Args ())
198+ })
199+ t .Run ("unknown flag after double dash terminator" , func (t * testing.T ) {
200+ fs , _ := newFlagset ()
201+ err := ParseToEnd (fs , []string {"arg1" , "--" , "--unknown" , "arg2" })
202+ require .NoError (t , err )
203+ require .Equal (t , []string {"arg1" , "--unknown" , "arg2" }, fs .Args ())
204+ })
205+ t .Run ("second double dash is positional" , func (t * testing.T ) {
206+ fs , c := newFlagset ()
207+ err := ParseToEnd (fs , []string {"--" , "--" , "--flag3" })
208+ require .NoError (t , err )
209+ require .False (t , c .flag3 )
210+ require .Equal (t , []string {"--" , "--flag3" }, fs .Args ())
174211 })
175212 t .Run ("duplicate flags last wins" , func (t * testing.T ) {
176213 fs , c := newFlagset ()
0 commit comments