@@ -49,8 +49,14 @@ func sampleCommand(t *testing.T) *serpent.Command {
4949		Use : "root [subcommand]" ,
5050		Options : serpent.OptionSet {
5151			serpent.Option {
52- 				Name :  "verbose" ,
53- 				Flag :  "verbose" ,
52+ 				Name :    "verbose" ,
53+ 				Flag :    "verbose" ,
54+ 				Default : "false" ,
55+ 				Value :   serpent .BoolOf (& verbose ),
56+ 			},
57+ 			serpent.Option {
58+ 				Name :  "verbose-old" ,
59+ 				Flag :  "verbode-old" ,
5460				Value : serpent .BoolOf (& verbose ),
5561			},
5662			serpent.Option {
@@ -742,6 +748,12 @@ func TestCommand_DefaultsOverride(t *testing.T) {
742748						Value :   serpent .StringOf (& got ),
743749						YAML :    "url" ,
744750					},
751+ 					{
752+ 						Name :  "url-deprecated" ,
753+ 						Flag :  "url-deprecated" ,
754+ 						Env :   "URL_DEPRECATED" ,
755+ 						Value : serpent .StringOf (& got ),
756+ 					},
745757					{
746758						Name :    "config" ,
747759						Flag :    "config" ,
@@ -790,6 +802,17 @@ func TestCommand_DefaultsOverride(t *testing.T) {
790802		inv .Args  =  []string {"--config" , fi .Name (), "--url" , "good.com" }
791803	})
792804
805+ 	test ("EnvOverYAML" , "good.com" , func (t  * testing.T , inv  * serpent.Invocation ) {
806+ 		fi , err  :=  os .CreateTemp (t .TempDir (), "config.yaml" )
807+ 		require .NoError (t , err )
808+ 		defer  fi .Close ()
809+ 
810+ 		_ , err  =  fi .WriteString ("url: bad.com" )
811+ 		require .NoError (t , err )
812+ 
813+ 		inv .Environ .Set ("URL" , "good.com" )
814+ 	})
815+ 
793816	test ("YAMLOverDefault" , "good.com" , func (t  * testing.T , inv  * serpent.Invocation ) {
794817		fi , err  :=  os .CreateTemp (t .TempDir (), "config.yaml" )
795818		require .NoError (t , err )
@@ -800,4 +823,83 @@ func TestCommand_DefaultsOverride(t *testing.T) {
800823
801824		inv .Args  =  []string {"--config" , fi .Name ()}
802825	})
826+ 
827+ 	test ("AltFlagOverDefault" , "good.com" , func (t  * testing.T , inv  * serpent.Invocation ) {
828+ 		inv .Args  =  []string {"--url-deprecated" , "good.com" }
829+ 	})
830+ }
831+ 
832+ func  TestCommand_OptionsWithSharedValue (t  * testing.T ) {
833+ 	t .Parallel ()
834+ 
835+ 	var  got  string 
836+ 	makeCmd  :=  func (def , altDef  string ) * serpent.Command  {
837+ 		got  =  "" 
838+ 		return  & serpent.Command {
839+ 			Options : serpent.OptionSet {
840+ 				{
841+ 					Name :    "url" ,
842+ 					Flag :    "url" ,
843+ 					Env :     "URL" ,
844+ 					Default : def ,
845+ 					Value :   serpent .StringOf (& got ),
846+ 				},
847+ 				{
848+ 					Name :    "alt-url" ,
849+ 					Flag :    "alt-url" ,
850+ 					Env :     "ALT_URL" ,
851+ 					Default : altDef ,
852+ 					Value :   serpent .StringOf (& got ),
853+ 				},
854+ 			},
855+ 			Handler : (func (i  * serpent.Invocation ) error  {
856+ 				return  nil 
857+ 			}),
858+ 		}
859+ 	}
860+ 
861+ 	// Check proper value propagation. 
862+ 	err  :=  makeCmd ("def.com" , "def.com" ).Invoke ().Run ()
863+ 	require .NoError (t , err , "default values are same" )
864+ 	require .Equal (t , "def.com" , got )
865+ 
866+ 	err  =  makeCmd ("def.com" , "" ).Invoke ().Run ()
867+ 	require .NoError (t , err , "other default value is empty" )
868+ 	require .Equal (t , "def.com" , got )
869+ 
870+ 	err  =  makeCmd ("def.com" , "" ).Invoke ("--url" , "sup" ).Run ()
871+ 	require .NoError (t , err )
872+ 	require .Equal (t , "sup" , got )
873+ 
874+ 	err  =  makeCmd ("def.com" , "" ).Invoke ("--alt-url" , "hup" ).Run ()
875+ 	require .NoError (t , err )
876+ 	require .Equal (t , "hup" , got )
877+ 
878+ 	// Both flags are given, last wins. 
879+ 	err  =  makeCmd ("def.com" , "" ).Invoke ("--url" , "sup" , "--alt-url" , "hup" ).Run ()
880+ 	require .NoError (t , err )
881+ 	require .Equal (t , "hup" , got )
882+ 
883+ 	// Both flags are given, last wins #2. 
884+ 	err  =  makeCmd ("" , "def.com" ).Invoke ("--alt-url" , "hup" , "--url" , "sup" ).Run ()
885+ 	require .NoError (t , err )
886+ 	require .Equal (t , "sup" , got )
887+ 
888+ 	// Both flags are given, option type priority wins. 
889+ 	inv  :=  makeCmd ("def.com" , "" ).Invoke ("--alt-url" , "hup" )
890+ 	inv .Environ .Set ("URL" , "sup" )
891+ 	err  =  inv .Run ()
892+ 	require .NoError (t , err )
893+ 	require .Equal (t , "hup" , got )
894+ 
895+ 	// Both flags are given, option type priority wins #2. 
896+ 	inv  =  makeCmd ("" , "def.com" ).Invoke ("--url" , "sup" )
897+ 	inv .Environ .Set ("ALT_URL" , "hup" )
898+ 	err  =  inv .Run ()
899+ 	require .NoError (t , err )
900+ 	require .Equal (t , "sup" , got )
901+ 
902+ 	// Catch invalid configuration. 
903+ 	err  =  makeCmd ("def.com" , "alt-def.com" ).Invoke ().Run ()
904+ 	require .Error (t , err , "default values are different" )
803905}
0 commit comments