@@ -626,3 +626,152 @@ fn vec_type_default_value() {
626626 Opt :: try_parse_from( [ "" , "-a" , "foo,baz" ] ) . unwrap( )
627627 ) ;
628628}
629+
630+ #[ test]
631+ fn unit_fallback ( ) {
632+ #[ derive( clap:: ValueEnum , PartialEq , Debug , Clone ) ]
633+ enum ArgChoice {
634+ Foo ,
635+ #[ clap( fallback) ]
636+ Fallback ,
637+ }
638+
639+ #[ derive( Parser , PartialEq , Debug ) ]
640+ struct Opt {
641+ #[ arg( value_enum) ]
642+ arg : ArgChoice ,
643+ }
644+
645+ assert_eq ! (
646+ Opt {
647+ arg: ArgChoice :: Foo
648+ } ,
649+ Opt :: try_parse_from( [ "" , "foo" ] ) . unwrap( )
650+ ) ;
651+ assert_eq ! (
652+ Opt {
653+ arg: ArgChoice :: Fallback
654+ } ,
655+ Opt :: try_parse_from( [ "" , "not-foo" ] ) . unwrap( )
656+ ) ;
657+ }
658+
659+ #[ test]
660+ fn empty_tuple_fallback ( ) {
661+ #[ derive( clap:: ValueEnum , PartialEq , Debug , Clone ) ]
662+ enum ArgChoice {
663+ Foo ,
664+ #[ clap( fallback) ]
665+ Fallback ( ) ,
666+ }
667+
668+ #[ derive( Parser , PartialEq , Debug ) ]
669+ struct Opt {
670+ #[ arg( value_enum) ]
671+ arg : ArgChoice ,
672+ }
673+
674+ assert_eq ! (
675+ Opt {
676+ arg: ArgChoice :: Foo
677+ } ,
678+ Opt :: try_parse_from( [ "" , "foo" ] ) . unwrap( )
679+ ) ;
680+ assert_eq ! (
681+ Opt {
682+ arg: ArgChoice :: Fallback ( )
683+ } ,
684+ Opt :: try_parse_from( [ "" , "not-foo" ] ) . unwrap( )
685+ ) ;
686+ }
687+
688+ #[ test]
689+ fn empty_struct_fallback ( ) {
690+ #[ derive( clap:: ValueEnum , PartialEq , Debug , Clone ) ]
691+ enum ArgChoice {
692+ Foo ,
693+ #[ clap( fallback) ]
694+ Fallback { } ,
695+ }
696+
697+ #[ derive( Parser , PartialEq , Debug ) ]
698+ struct Opt {
699+ #[ arg( value_enum) ]
700+ arg : ArgChoice ,
701+ }
702+
703+ assert_eq ! (
704+ Opt {
705+ arg: ArgChoice :: Foo
706+ } ,
707+ Opt :: try_parse_from( [ "" , "foo" ] ) . unwrap( )
708+ ) ;
709+ assert_eq ! (
710+ Opt {
711+ arg: ArgChoice :: Fallback { }
712+ } ,
713+ Opt :: try_parse_from( [ "" , "not-foo" ] ) . unwrap( )
714+ ) ;
715+ }
716+
717+ #[ test]
718+ fn non_empty_struct_fallback ( ) {
719+ #[ derive( clap:: ValueEnum , PartialEq , Debug , Clone ) ]
720+ enum ArgChoice {
721+ Foo ,
722+ #[ clap( fallback) ]
723+ Fallback {
724+ value : String ,
725+ } ,
726+ }
727+
728+ #[ derive( Parser , PartialEq , Debug ) ]
729+ struct Opt {
730+ #[ arg( value_enum) ]
731+ arg : ArgChoice ,
732+ }
733+
734+ assert_eq ! (
735+ Opt {
736+ arg: ArgChoice :: Foo
737+ } ,
738+ Opt :: try_parse_from( [ "" , "foo" ] ) . unwrap( )
739+ ) ;
740+ assert_eq ! (
741+ Opt {
742+ arg: ArgChoice :: Fallback {
743+ value: String :: from( "not-foo" )
744+ }
745+ } ,
746+ Opt :: try_parse_from( [ "" , "not-foo" ] ) . unwrap( )
747+ ) ;
748+ }
749+
750+ #[ test]
751+ fn non_empty_tuple_fallback ( ) {
752+ #[ derive( clap:: ValueEnum , PartialEq , Debug , Clone ) ]
753+ enum ArgChoice {
754+ Foo ,
755+ #[ clap( fallback) ]
756+ Fallback ( String ) ,
757+ }
758+
759+ #[ derive( Parser , PartialEq , Debug ) ]
760+ struct Opt {
761+ #[ arg( value_enum) ]
762+ arg : ArgChoice ,
763+ }
764+
765+ assert_eq ! (
766+ Opt {
767+ arg: ArgChoice :: Foo
768+ } ,
769+ Opt :: try_parse_from( [ "" , "foo" ] ) . unwrap( )
770+ ) ;
771+ assert_eq ! (
772+ Opt {
773+ arg: ArgChoice :: Fallback ( String :: from( "not-foo" ) )
774+ } ,
775+ Opt :: try_parse_from( [ "" , "not-foo" ] ) . unwrap( )
776+ ) ;
777+ }
0 commit comments