@@ -805,6 +805,76 @@ def test_invalid_name(self):
805805 self .assertEqual (str (cm .exception ),
806806 "invalid option name '--no-foo' for BooleanOptionalAction" )
807807
808+ class TestBooleanOptionalActionSingleDash (ParserTestCase ):
809+ """Tests BooleanOptionalAction with single dash"""
810+
811+ argument_signatures = [
812+ Sig ('-foo' , '-x' , action = argparse .BooleanOptionalAction ),
813+ ]
814+ failures = ['--foo' , '--no-foo' , '-no-foo' , '-no-x' , '-nox' ]
815+ successes = [
816+ ('' , NS (foo = None )),
817+ ('-foo' , NS (foo = True )),
818+ ('-nofoo' , NS (foo = False )),
819+ ('-x' , NS (foo = True )),
820+ ]
821+
822+ def test_invalid_name (self ):
823+ parser = argparse .ArgumentParser ()
824+ with self .assertRaises (ValueError ) as cm :
825+ parser .add_argument ('-nofoo' , action = argparse .BooleanOptionalAction )
826+ self .assertEqual (str (cm .exception ),
827+ "invalid option name '-nofoo' for BooleanOptionalAction" )
828+
829+ class TestBooleanOptionalActionAlternatePrefixChars (ParserTestCase ):
830+ """Tests BooleanOptionalAction with custom prefixes"""
831+
832+ parser_signature = Sig (prefix_chars = '+-' , add_help = False )
833+ argument_signatures = [Sig ('++foo' , action = argparse .BooleanOptionalAction )]
834+ failures = ['--foo' , '--no-foo' ]
835+ successes = [
836+ ('' , NS (foo = None )),
837+ ('++foo' , NS (foo = True )),
838+ ('++no-foo' , NS (foo = False )),
839+ ]
840+
841+ def test_invalid_name (self ):
842+ parser = argparse .ArgumentParser (prefix_chars = '+/' )
843+ with self .assertRaisesRegex (ValueError ,
844+ 'BooleanOptionalAction.*is not valid for positional arguments' ):
845+ parser .add_argument ('--foo' , action = argparse .BooleanOptionalAction )
846+ with self .assertRaises (ValueError ) as cm :
847+ parser .add_argument ('++no-foo' , action = argparse .BooleanOptionalAction )
848+ self .assertEqual (str (cm .exception ),
849+ "invalid option name '++no-foo' for BooleanOptionalAction" )
850+
851+ class TestBooleanOptionalActionSingleAlternatePrefixChar (ParserTestCase ):
852+ """Tests BooleanOptionalAction with single alternate prefix char"""
853+
854+ parser_signature = Sig (prefix_chars = '+/' , add_help = False )
855+ argument_signatures = [
856+ Sig ('+foo' , '+x' , action = argparse .BooleanOptionalAction ),
857+ ]
858+ failures = ['++foo' , '++no-foo' , '++nofoo' ,
859+ '-no-foo' , '-nofoo' , '+no-foo' , '-nofoo' ,
860+ '+no-x' , '+nox' , '-no-x' , '-nox' ]
861+ successes = [
862+ ('' , NS (foo = None )),
863+ ('+foo' , NS (foo = True )),
864+ ('+nofoo' , NS (foo = False )),
865+ ('+x' , NS (foo = True )),
866+ ]
867+
868+ def test_invalid_name (self ):
869+ parser = argparse .ArgumentParser (prefix_chars = '+/' )
870+ with self .assertRaisesRegex (ValueError ,
871+ 'BooleanOptionalAction.*is not valid for positional arguments' ):
872+ parser .add_argument ('-foo' , action = argparse .BooleanOptionalAction )
873+ with self .assertRaises (ValueError ) as cm :
874+ parser .add_argument ('+nofoo' , action = argparse .BooleanOptionalAction )
875+ self .assertEqual (str (cm .exception ),
876+ "invalid option name '+nofoo' for BooleanOptionalAction" )
877+
808878class TestBooleanOptionalActionRequired (ParserTestCase ):
809879 """Tests BooleanOptionalAction required"""
810880
0 commit comments