1ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# Author: Steven J. Bethard <steven.bethard@gmail.com>.
2ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport codecs
4ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport inspect
5ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport os
6ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport shutil
7ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport stat
8ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport sys
9ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport textwrap
10ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport tempfile
11ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport unittest
12ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport argparse
13ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
14ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehfrom StringIO import StringIO
15ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
16ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass StdIOBuffer(StringIO):
17ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    pass
18ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
19ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehfrom test import test_support
20ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
21ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestCase(unittest.TestCase):
22ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
23ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def assertEqual(self, obj1, obj2):
24ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        if obj1 != obj2:
25ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            print('')
26ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            print(repr(obj1))
27ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            print(repr(obj2))
28ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            print(obj1)
29ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            print(obj2)
30ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        super(TestCase, self).assertEqual(obj1, obj2)
31ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
32ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def setUp(self):
33ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # The tests assume that line wrapping occurs at 80 columns, but this
34ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # behaviour can be overridden by setting the COLUMNS environment
35ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # variable.  To ensure that this assumption is true, unset COLUMNS.
36ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        env = test_support.EnvironmentVarGuard()
37ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        env.unset("COLUMNS")
38ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.addCleanup(env.__exit__)
39ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
40ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
41ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TempDirMixin(object):
42ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
43ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def setUp(self):
44ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.temp_dir = tempfile.mkdtemp()
45ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.old_dir = os.getcwd()
46ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        os.chdir(self.temp_dir)
47ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
48ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def tearDown(self):
49ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        os.chdir(self.old_dir)
50ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        shutil.rmtree(self.temp_dir, True)
51ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
52ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def create_readonly_file(self, filename):
53ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        file_path = os.path.join(self.temp_dir, filename)
54ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        with open(file_path, 'w') as file:
55ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            file.write(filename)
56ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        os.chmod(file_path, stat.S_IREAD)
57ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
58ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass Sig(object):
59ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
60ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def __init__(self, *args, **kwargs):
61ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.args = args
62ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.kwargs = kwargs
63ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
64ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
65ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass NS(object):
66ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
67ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def __init__(self, **kwargs):
68ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.__dict__.update(kwargs)
69ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
70ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def __repr__(self):
71ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        sorted_items = sorted(self.__dict__.items())
72ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        kwarg_str = ', '.join(['%s=%r' % tup for tup in sorted_items])
73ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        return '%s(%s)' % (type(self).__name__, kwarg_str)
74ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
75ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    __hash__ = None
76ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
77ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def __eq__(self, other):
78ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        return vars(self) == vars(other)
79ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
80ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def __ne__(self, other):
81ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        return not (self == other)
82ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
83ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
84ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass ArgumentParserError(Exception):
85ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
86ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def __init__(self, message, stdout=None, stderr=None, error_code=None):
87ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Exception.__init__(self, message, stdout, stderr)
88ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.message = message
89ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.stdout = stdout
90ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.stderr = stderr
91ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.error_code = error_code
92ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
93ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
94ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehdef stderr_to_parser_error(parse_args, *args, **kwargs):
95ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    # if this is being called recursively and stderr or stdout is already being
96ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    # redirected, simply call the function and let the enclosing function
97ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    # catch the exception
98ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    if isinstance(sys.stderr, StdIOBuffer) or isinstance(sys.stdout, StdIOBuffer):
99ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        return parse_args(*args, **kwargs)
100ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
101ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    # if this is not being called recursively, redirect stderr and
102ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    # use it as the ArgumentParserError message
103ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    old_stdout = sys.stdout
104ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    old_stderr = sys.stderr
105ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    sys.stdout = StdIOBuffer()
106ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    sys.stderr = StdIOBuffer()
107ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    try:
108ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        try:
109ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            result = parse_args(*args, **kwargs)
110ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            for key in list(vars(result)):
111ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                if getattr(result, key) is sys.stdout:
112ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    setattr(result, key, old_stdout)
113ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                if getattr(result, key) is sys.stderr:
114ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    setattr(result, key, old_stderr)
115ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            return result
116ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        except SystemExit:
117ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            code = sys.exc_info()[1].code
118ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            stdout = sys.stdout.getvalue()
119ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            stderr = sys.stderr.getvalue()
120ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            raise ArgumentParserError("SystemExit", stdout, stderr, code)
121ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    finally:
122ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        sys.stdout = old_stdout
123ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        sys.stderr = old_stderr
124ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
125ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
126ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass ErrorRaisingArgumentParser(argparse.ArgumentParser):
127ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
128ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def parse_args(self, *args, **kwargs):
129ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parse_args = super(ErrorRaisingArgumentParser, self).parse_args
130ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        return stderr_to_parser_error(parse_args, *args, **kwargs)
131ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
132ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def exit(self, *args, **kwargs):
133ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        exit = super(ErrorRaisingArgumentParser, self).exit
134ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        return stderr_to_parser_error(exit, *args, **kwargs)
135ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
136ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def error(self, *args, **kwargs):
137ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        error = super(ErrorRaisingArgumentParser, self).error
138ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        return stderr_to_parser_error(error, *args, **kwargs)
139ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
140ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
141ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass ParserTesterMetaclass(type):
142ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Adds parser tests using the class attributes.
143ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
144ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    Classes of this type should specify the following attributes:
145ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
146ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures -- a list of Sig objects which specify
147ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        the signatures of Argument objects to be created
148ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures -- a list of args lists that should cause the parser
149ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        to fail
150ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes -- a list of (initial_args, options, remaining_args) tuples
151ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        where initial_args specifies the string args to be parsed,
152ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        options is a dict that should match the vars() of the options
153ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parsed out of initial_args, and remaining_args should be any
154ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        remaining unparsed arguments
155ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """
156ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
157ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def __init__(cls, name, bases, bodydict):
158ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        if name == 'ParserTestCase':
159ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            return
160ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
161ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # default parser signature is empty
162ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        if not hasattr(cls, 'parser_signature'):
163ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            cls.parser_signature = Sig()
164ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        if not hasattr(cls, 'parser_class'):
165ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            cls.parser_class = ErrorRaisingArgumentParser
166ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
167ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # ---------------------------------------
168ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # functions for adding optional arguments
169ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # ---------------------------------------
170ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        def no_groups(parser, argument_signatures):
171ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            """Add all arguments directly to the parser"""
172ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            for sig in argument_signatures:
173ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                parser.add_argument(*sig.args, **sig.kwargs)
174ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
175ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        def one_group(parser, argument_signatures):
176ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            """Add all arguments under a single group in the parser"""
177ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            group = parser.add_argument_group('foo')
178ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            for sig in argument_signatures:
179ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                group.add_argument(*sig.args, **sig.kwargs)
180ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
181ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        def many_groups(parser, argument_signatures):
182ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            """Add each argument in its own group to the parser"""
183ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            for i, sig in enumerate(argument_signatures):
184ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                group = parser.add_argument_group('foo:%i' % i)
185ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                group.add_argument(*sig.args, **sig.kwargs)
186ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
187ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # --------------------------
188ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # functions for parsing args
189ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # --------------------------
190ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        def listargs(parser, args):
191ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            """Parse the args by passing in a list"""
192ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            return parser.parse_args(args)
193ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
194ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        def sysargs(parser, args):
195ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            """Parse the args by defaulting to sys.argv"""
196ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            old_sys_argv = sys.argv
197ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            sys.argv = [old_sys_argv[0]] + args
198ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            try:
199ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                return parser.parse_args()
200ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            finally:
201ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                sys.argv = old_sys_argv
202ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
203ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # class that holds the combination of one optional argument
204ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # addition method and one arg parsing method
205ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        class AddTests(object):
206ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
207ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            def __init__(self, tester_cls, add_arguments, parse_args):
208ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                self._add_arguments = add_arguments
209ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                self._parse_args = parse_args
210ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
211ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                add_arguments_name = self._add_arguments.__name__
212ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                parse_args_name = self._parse_args.__name__
213ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                for test_func in [self.test_failures, self.test_successes]:
214ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    func_name = test_func.__name__
215ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    names = func_name, add_arguments_name, parse_args_name
216ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    test_name = '_'.join(names)
217ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
218ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    def wrapper(self, test_func=test_func):
219ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                        test_func(self)
220ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    try:
221ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                        wrapper.__name__ = test_name
222ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    except TypeError:
223ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                        pass
224ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    setattr(tester_cls, test_name, wrapper)
225ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
226ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            def _get_parser(self, tester):
227ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                args = tester.parser_signature.args
228ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                kwargs = tester.parser_signature.kwargs
229ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                parser = tester.parser_class(*args, **kwargs)
230ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                self._add_arguments(parser, tester.argument_signatures)
231ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                return parser
232ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
233ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            def test_failures(self, tester):
234ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                parser = self._get_parser(tester)
235ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                for args_str in tester.failures:
236ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    args = args_str.split()
237ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    raises = tester.assertRaises
238ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    raises(ArgumentParserError, parser.parse_args, args)
239ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
240ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            def test_successes(self, tester):
241ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                parser = self._get_parser(tester)
242ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                for args, expected_ns in tester.successes:
243ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    if isinstance(args, str):
244ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                        args = args.split()
245ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    result_ns = self._parse_args(parser, args)
246ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    tester.assertEqual(expected_ns, result_ns)
247ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
248ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # add tests for each combination of an optionals adding method
249ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # and an arg parsing method
250ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for add_arguments in [no_groups, one_group, many_groups]:
251ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            for parse_args in [listargs, sysargs]:
252ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                AddTests(cls, add_arguments, parse_args)
253ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
254ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehbases = TestCase,
255ffab958fd8d42ed7227d83007350e61555a1fa36Andrew HsiehParserTestCase = ParserTesterMetaclass('ParserTestCase', bases, {})
256ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
257ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# ===============
258ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# Optionals tests
259ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# ===============
260ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
261ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestOptionalsSingleDash(ParserTestCase):
262ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test an Optional with a single-dash option string"""
263ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
264ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [Sig('-x')]
265ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['-x', 'a', '--foo', '-x --foo', '-x -y']
266ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
267ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('', NS(x=None)),
268ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-x a', NS(x='a')),
269ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-xa', NS(x='a')),
270ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-x -1', NS(x='-1')),
271ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-x-1', NS(x='-1')),
272ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
273ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
274ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
275ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestOptionalsSingleDashCombined(ParserTestCase):
276ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test an Optional with a single-dash option string"""
277ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
278ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [
279ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('-x', action='store_true'),
280ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('-yyy', action='store_const', const=42),
281ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('-z'),
282ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
283ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['a', '--foo', '-xa', '-x --foo', '-x -z', '-z -x',
284ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                '-yx', '-yz a', '-yyyx', '-yyyza', '-xyza']
285ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
286ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('', NS(x=False, yyy=None, z=None)),
287ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-x', NS(x=True, yyy=None, z=None)),
288ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-za', NS(x=False, yyy=None, z='a')),
289ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-z a', NS(x=False, yyy=None, z='a')),
290ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-xza', NS(x=True, yyy=None, z='a')),
291ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-xz a', NS(x=True, yyy=None, z='a')),
292ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-x -za', NS(x=True, yyy=None, z='a')),
293ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-x -z a', NS(x=True, yyy=None, z='a')),
294ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-y', NS(x=False, yyy=42, z=None)),
295ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-yyy', NS(x=False, yyy=42, z=None)),
296ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-x -yyy -za', NS(x=True, yyy=42, z='a')),
297ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-x -yyy -z a', NS(x=True, yyy=42, z='a')),
298ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
299ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
300ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
301ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestOptionalsSingleDashLong(ParserTestCase):
302ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test an Optional with a multi-character single-dash option string"""
303ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
304ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [Sig('-foo')]
305ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['-foo', 'a', '--foo', '-foo --foo', '-foo -y', '-fooa']
306ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
307ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('', NS(foo=None)),
308ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-foo a', NS(foo='a')),
309ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-foo -1', NS(foo='-1')),
310ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-fo a', NS(foo='a')),
311ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-f a', NS(foo='a')),
312ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
313ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
314ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
315ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestOptionalsSingleDashSubsetAmbiguous(ParserTestCase):
316ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test Optionals where option strings are subsets of each other"""
317ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
318ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [Sig('-f'), Sig('-foobar'), Sig('-foorab')]
319ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['-f', '-foo', '-fo', '-foo b', '-foob', '-fooba', '-foora']
320ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
321ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('', NS(f=None, foobar=None, foorab=None)),
322ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-f a', NS(f='a', foobar=None, foorab=None)),
323ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-fa', NS(f='a', foobar=None, foorab=None)),
324ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-foa', NS(f='oa', foobar=None, foorab=None)),
325ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-fooa', NS(f='ooa', foobar=None, foorab=None)),
326ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-foobar a', NS(f=None, foobar='a', foorab=None)),
327ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-foorab a', NS(f=None, foobar=None, foorab='a')),
328ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
329ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
330ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
331ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestOptionalsSingleDashAmbiguous(ParserTestCase):
332ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test Optionals that partially match but are not subsets"""
333ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
334ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [Sig('-foobar'), Sig('-foorab')]
335ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['-f', '-f a', '-fa', '-foa', '-foo', '-fo', '-foo b']
336ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
337ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('', NS(foobar=None, foorab=None)),
338ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-foob a', NS(foobar='a', foorab=None)),
339ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-foor a', NS(foobar=None, foorab='a')),
340ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-fooba a', NS(foobar='a', foorab=None)),
341ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-foora a', NS(foobar=None, foorab='a')),
342ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-foobar a', NS(foobar='a', foorab=None)),
343ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-foorab a', NS(foobar=None, foorab='a')),
344ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
345ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
346ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
347ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestOptionalsNumeric(ParserTestCase):
348ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test an Optional with a short opt string"""
349ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
350ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [Sig('-1', dest='one')]
351ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['-1', 'a', '-1 --foo', '-1 -y', '-1 -1', '-1 -2']
352ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
353ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('', NS(one=None)),
354ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-1 a', NS(one='a')),
355ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-1a', NS(one='a')),
356ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-1-2', NS(one='-2')),
357ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
358ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
359ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
360ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestOptionalsDoubleDash(ParserTestCase):
361ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test an Optional with a double-dash option string"""
362ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
363ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [Sig('--foo')]
364ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['--foo', '-f', '-f a', 'a', '--foo -x', '--foo --bar']
365ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
366ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('', NS(foo=None)),
367ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('--foo a', NS(foo='a')),
368ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('--foo=a', NS(foo='a')),
369ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('--foo -2.5', NS(foo='-2.5')),
370ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('--foo=-2.5', NS(foo='-2.5')),
371ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
372ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
373ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
374ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestOptionalsDoubleDashPartialMatch(ParserTestCase):
375ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Tests partial matching with a double-dash option string"""
376ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
377ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [
378ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('--badger', action='store_true'),
379ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('--bat'),
380ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
381ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['--bar', '--b', '--ba', '--b=2', '--ba=4', '--badge 5']
382ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
383ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('', NS(badger=False, bat=None)),
384ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('--bat X', NS(badger=False, bat='X')),
385ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('--bad', NS(badger=True, bat=None)),
386ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('--badg', NS(badger=True, bat=None)),
387ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('--badge', NS(badger=True, bat=None)),
388ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('--badger', NS(badger=True, bat=None)),
389ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
390ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
391ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
392ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestOptionalsDoubleDashPrefixMatch(ParserTestCase):
393ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Tests when one double-dash option string is a prefix of another"""
394ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
395ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [
396ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('--badger', action='store_true'),
397ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('--ba'),
398ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
399ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['--bar', '--b', '--ba', '--b=2', '--badge 5']
400ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
401ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('', NS(badger=False, ba=None)),
402ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('--ba X', NS(badger=False, ba='X')),
403ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('--ba=X', NS(badger=False, ba='X')),
404ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('--bad', NS(badger=True, ba=None)),
405ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('--badg', NS(badger=True, ba=None)),
406ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('--badge', NS(badger=True, ba=None)),
407ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('--badger', NS(badger=True, ba=None)),
408ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
409ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
410ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
411ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestOptionalsSingleDoubleDash(ParserTestCase):
412ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test an Optional with single- and double-dash option strings"""
413ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
414ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [
415ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('-f', action='store_true'),
416ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('--bar'),
417ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('-baz', action='store_const', const=42),
418ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
419ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['--bar', '-fbar', '-fbaz', '-bazf', '-b B', 'B']
420ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
421ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('', NS(f=False, bar=None, baz=None)),
422ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-f', NS(f=True, bar=None, baz=None)),
423ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('--ba B', NS(f=False, bar='B', baz=None)),
424ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-f --bar B', NS(f=True, bar='B', baz=None)),
425ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-f -b', NS(f=True, bar=None, baz=42)),
426ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-ba -f', NS(f=True, bar=None, baz=42)),
427ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
428ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
429ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
430ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestOptionalsAlternatePrefixChars(ParserTestCase):
431ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test an Optional with option strings with custom prefixes"""
432ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
433ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    parser_signature = Sig(prefix_chars='+:/', add_help=False)
434ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [
435ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('+f', action='store_true'),
436ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('::bar'),
437ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('/baz', action='store_const', const=42),
438ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
439ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['--bar', '-fbar', '-b B', 'B', '-f', '--bar B', '-baz', '-h', '--help', '+h', '::help', '/help']
440ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
441ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('', NS(f=False, bar=None, baz=None)),
442ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('+f', NS(f=True, bar=None, baz=None)),
443ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('::ba B', NS(f=False, bar='B', baz=None)),
444ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('+f ::bar B', NS(f=True, bar='B', baz=None)),
445ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('+f /b', NS(f=True, bar=None, baz=42)),
446ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('/ba +f', NS(f=True, bar=None, baz=42)),
447ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
448ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
449ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
450ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestOptionalsAlternatePrefixCharsAddedHelp(ParserTestCase):
451ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """When ``-`` not in prefix_chars, default operators created for help
452ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh       should use the prefix_chars in use rather than - or --
453ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh       http://bugs.python.org/issue9444"""
454ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
455ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    parser_signature = Sig(prefix_chars='+:/', add_help=True)
456ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [
457ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('+f', action='store_true'),
458ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('::bar'),
459ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('/baz', action='store_const', const=42),
460ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
461ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['--bar', '-fbar', '-b B', 'B', '-f', '--bar B', '-baz']
462ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
463ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('', NS(f=False, bar=None, baz=None)),
464ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('+f', NS(f=True, bar=None, baz=None)),
465ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('::ba B', NS(f=False, bar='B', baz=None)),
466ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('+f ::bar B', NS(f=True, bar='B', baz=None)),
467ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('+f /b', NS(f=True, bar=None, baz=42)),
468ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('/ba +f', NS(f=True, bar=None, baz=42))
469ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
470ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
471ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
472ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestOptionalsAlternatePrefixCharsMultipleShortArgs(ParserTestCase):
473ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Verify that Optionals must be called with their defined prefixes"""
474ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
475ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    parser_signature = Sig(prefix_chars='+-', add_help=False)
476ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [
477ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('-x', action='store_true'),
478ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('+y', action='store_true'),
479ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('+z', action='store_true'),
480ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
481ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['-w',
482ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                '-xyz',
483ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                '+x',
484ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                '-y',
485ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                '+xyz',
486ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
487ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
488ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('', NS(x=False, y=False, z=False)),
489ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-x', NS(x=True, y=False, z=False)),
490ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('+y -x', NS(x=True, y=True, z=False)),
491ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('+yz -x', NS(x=True, y=True, z=True)),
492ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
493ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
494ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
495ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestOptionalsShortLong(ParserTestCase):
496ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test a combination of single- and double-dash option strings"""
497ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
498ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [
499ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('-v', '--verbose', '-n', '--noisy', action='store_true'),
500ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
501ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['--x --verbose', '-N', 'a', '-v x']
502ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
503ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('', NS(verbose=False)),
504ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-v', NS(verbose=True)),
505ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('--verbose', NS(verbose=True)),
506ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-n', NS(verbose=True)),
507ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('--noisy', NS(verbose=True)),
508ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
509ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
510ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
511ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestOptionalsDest(ParserTestCase):
512ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Tests various means of setting destination"""
513ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
514ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [Sig('--foo-bar'), Sig('--baz', dest='zabbaz')]
515ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['a']
516ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
517ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('--foo-bar f', NS(foo_bar='f', zabbaz=None)),
518ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('--baz g', NS(foo_bar=None, zabbaz='g')),
519ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('--foo-bar h --baz i', NS(foo_bar='h', zabbaz='i')),
520ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('--baz j --foo-bar k', NS(foo_bar='k', zabbaz='j')),
521ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
522ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
523ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
524ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestOptionalsDefault(ParserTestCase):
525ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Tests specifying a default for an Optional"""
526ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
527ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [Sig('-x'), Sig('-y', default=42)]
528ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['a']
529ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
530ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('', NS(x=None, y=42)),
531ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-xx', NS(x='x', y=42)),
532ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-yy', NS(x=None, y='y')),
533ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
534ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
535ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
536ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestOptionalsNargsDefault(ParserTestCase):
537ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Tests not specifying the number of args for an Optional"""
538ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
539ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [Sig('-x')]
540ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['a', '-x']
541ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
542ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('', NS(x=None)),
543ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-x a', NS(x='a')),
544ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
545ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
546ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
547ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestOptionalsNargs1(ParserTestCase):
548ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Tests specifying the 1 arg for an Optional"""
549ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
550ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [Sig('-x', nargs=1)]
551ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['a', '-x']
552ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
553ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('', NS(x=None)),
554ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-x a', NS(x=['a'])),
555ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
556ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
557ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
558ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestOptionalsNargs3(ParserTestCase):
559ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Tests specifying the 3 args for an Optional"""
560ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
561ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [Sig('-x', nargs=3)]
562ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['a', '-x', '-x a', '-x a b', 'a -x', 'a -x b']
563ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
564ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('', NS(x=None)),
565ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-x a b c', NS(x=['a', 'b', 'c'])),
566ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
567ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
568ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
569ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestOptionalsNargsOptional(ParserTestCase):
570ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Tests specifying an Optional arg for an Optional"""
571ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
572ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [
573ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('-w', nargs='?'),
574ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('-x', nargs='?', const=42),
575ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('-y', nargs='?', default='spam'),
576ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('-z', nargs='?', type=int, const='42', default='84'),
577ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
578ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['2']
579ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
580ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('', NS(w=None, x=None, y='spam', z=84)),
581ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-w', NS(w=None, x=None, y='spam', z=84)),
582ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-w 2', NS(w='2', x=None, y='spam', z=84)),
583ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-x', NS(w=None, x=42, y='spam', z=84)),
584ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-x 2', NS(w=None, x='2', y='spam', z=84)),
585ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-y', NS(w=None, x=None, y=None, z=84)),
586ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-y 2', NS(w=None, x=None, y='2', z=84)),
587ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-z', NS(w=None, x=None, y='spam', z=42)),
588ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-z 2', NS(w=None, x=None, y='spam', z=2)),
589ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
590ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
591ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
592ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestOptionalsNargsZeroOrMore(ParserTestCase):
593ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Tests specifying an args for an Optional that accepts zero or more"""
594ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
595ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [
596ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('-x', nargs='*'),
597ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('-y', nargs='*', default='spam'),
598ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
599ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['a']
600ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
601ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('', NS(x=None, y='spam')),
602ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-x', NS(x=[], y='spam')),
603ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-x a', NS(x=['a'], y='spam')),
604ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-x a b', NS(x=['a', 'b'], y='spam')),
605ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-y', NS(x=None, y=[])),
606ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-y a', NS(x=None, y=['a'])),
607ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-y a b', NS(x=None, y=['a', 'b'])),
608ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
609ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
610ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
611ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestOptionalsNargsOneOrMore(ParserTestCase):
612ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Tests specifying an args for an Optional that accepts one or more"""
613ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
614ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [
615ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('-x', nargs='+'),
616ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('-y', nargs='+', default='spam'),
617ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
618ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['a', '-x', '-y', 'a -x', 'a -y b']
619ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
620ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('', NS(x=None, y='spam')),
621ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-x a', NS(x=['a'], y='spam')),
622ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-x a b', NS(x=['a', 'b'], y='spam')),
623ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-y a', NS(x=None, y=['a'])),
624ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-y a b', NS(x=None, y=['a', 'b'])),
625ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
626ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
627ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
628ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestOptionalsChoices(ParserTestCase):
629ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Tests specifying the choices for an Optional"""
630ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
631ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [
632ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('-f', choices='abc'),
633ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('-g', type=int, choices=range(5))]
634ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['a', '-f d', '-fad', '-ga', '-g 6']
635ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
636ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('', NS(f=None, g=None)),
637ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-f a', NS(f='a', g=None)),
638ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-f c', NS(f='c', g=None)),
639ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-g 0', NS(f=None, g=0)),
640ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-g 03', NS(f=None, g=3)),
641ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-fb -g4', NS(f='b', g=4)),
642ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
643ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
644ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
645ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestOptionalsRequired(ParserTestCase):
646ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Tests the an optional action that is required"""
647ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
648ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [
649ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('-x', type=int, required=True),
650ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
651ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['a', '']
652ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
653ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-x 1', NS(x=1)),
654ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-x42', NS(x=42)),
655ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
656ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
657ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
658ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestOptionalsActionStore(ParserTestCase):
659ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Tests the store action for an Optional"""
660ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
661ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [Sig('-x', action='store')]
662ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['a', 'a -x']
663ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
664ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('', NS(x=None)),
665ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-xfoo', NS(x='foo')),
666ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
667ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
668ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
669ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestOptionalsActionStoreConst(ParserTestCase):
670ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Tests the store_const action for an Optional"""
671ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
672ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [Sig('-y', action='store_const', const=object)]
673ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['a']
674ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
675ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('', NS(y=None)),
676ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-y', NS(y=object)),
677ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
678ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
679ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
680ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestOptionalsActionStoreFalse(ParserTestCase):
681ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Tests the store_false action for an Optional"""
682ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
683ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [Sig('-z', action='store_false')]
684ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['a', '-za', '-z a']
685ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
686ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('', NS(z=True)),
687ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-z', NS(z=False)),
688ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
689ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
690ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
691ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestOptionalsActionStoreTrue(ParserTestCase):
692ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Tests the store_true action for an Optional"""
693ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
694ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [Sig('--apple', action='store_true')]
695ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['a', '--apple=b', '--apple b']
696ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
697ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('', NS(apple=False)),
698ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('--apple', NS(apple=True)),
699ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
700ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
701ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
702ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestOptionalsActionAppend(ParserTestCase):
703ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Tests the append action for an Optional"""
704ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
705ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [Sig('--baz', action='append')]
706ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['a', '--baz', 'a --baz', '--baz a b']
707ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
708ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('', NS(baz=None)),
709ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('--baz a', NS(baz=['a'])),
710ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('--baz a --baz b', NS(baz=['a', 'b'])),
711ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
712ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
713ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
714ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestOptionalsActionAppendWithDefault(ParserTestCase):
715ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Tests the append action for an Optional"""
716ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
717ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [Sig('--baz', action='append', default=['X'])]
718ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['a', '--baz', 'a --baz', '--baz a b']
719ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
720ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('', NS(baz=['X'])),
721ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('--baz a', NS(baz=['X', 'a'])),
722ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('--baz a --baz b', NS(baz=['X', 'a', 'b'])),
723ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
724ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
725ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
726ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestOptionalsActionAppendConst(ParserTestCase):
727ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Tests the append_const action for an Optional"""
728ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
729ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [
730ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('-b', action='append_const', const=Exception),
731ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('-c', action='append', dest='b'),
732ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
733ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['a', '-c', 'a -c', '-bx', '-b x']
734ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
735ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('', NS(b=None)),
736ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-b', NS(b=[Exception])),
737ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-b -cx -b -cyz', NS(b=[Exception, 'x', Exception, 'yz'])),
738ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
739ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
740ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
741ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestOptionalsActionAppendConstWithDefault(ParserTestCase):
742ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Tests the append_const action for an Optional"""
743ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
744ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [
745ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('-b', action='append_const', const=Exception, default=['X']),
746ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('-c', action='append', dest='b'),
747ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
748ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['a', '-c', 'a -c', '-bx', '-b x']
749ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
750ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('', NS(b=['X'])),
751ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-b', NS(b=['X', Exception])),
752ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-b -cx -b -cyz', NS(b=['X', Exception, 'x', Exception, 'yz'])),
753ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
754ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
755ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
756ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestOptionalsActionCount(ParserTestCase):
757ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Tests the count action for an Optional"""
758ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
759ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [Sig('-x', action='count')]
760ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['a', '-x a', '-x b', '-x a -x b']
761ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
762ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('', NS(x=None)),
763ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-x', NS(x=1)),
764ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
765ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
766ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
767ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# ================
768ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# Positional tests
769ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# ================
770ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
771ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestPositionalsNargsNone(ParserTestCase):
772ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test a Positional that doesn't specify nargs"""
773ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
774ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [Sig('foo')]
775ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['', '-x', 'a b']
776ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
777ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('a', NS(foo='a')),
778ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
779ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
780ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
781ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestPositionalsNargs1(ParserTestCase):
782ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test a Positional that specifies an nargs of 1"""
783ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
784ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [Sig('foo', nargs=1)]
785ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['', '-x', 'a b']
786ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
787ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('a', NS(foo=['a'])),
788ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
789ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
790ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
791ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestPositionalsNargs2(ParserTestCase):
792ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test a Positional that specifies an nargs of 2"""
793ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
794ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [Sig('foo', nargs=2)]
795ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['', 'a', '-x', 'a b c']
796ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
797ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('a b', NS(foo=['a', 'b'])),
798ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
799ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
800ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
801ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestPositionalsNargsZeroOrMore(ParserTestCase):
802ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test a Positional that specifies unlimited nargs"""
803ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
804ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [Sig('foo', nargs='*')]
805ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['-x']
806ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
807ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('', NS(foo=[])),
808ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('a', NS(foo=['a'])),
809ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('a b', NS(foo=['a', 'b'])),
810ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
811ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
812ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
813ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestPositionalsNargsZeroOrMoreDefault(ParserTestCase):
814ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test a Positional that specifies unlimited nargs and a default"""
815ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
816ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [Sig('foo', nargs='*', default='bar')]
817ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['-x']
818ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
819ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('', NS(foo='bar')),
820ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('a', NS(foo=['a'])),
821ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('a b', NS(foo=['a', 'b'])),
822ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
823ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
824ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
825ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestPositionalsNargsOneOrMore(ParserTestCase):
826ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test a Positional that specifies one or more nargs"""
827ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
828ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [Sig('foo', nargs='+')]
829ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['', '-x']
830ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
831ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('a', NS(foo=['a'])),
832ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('a b', NS(foo=['a', 'b'])),
833ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
834ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
835ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
836ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestPositionalsNargsOptional(ParserTestCase):
837ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Tests an Optional Positional"""
838ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
839ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [Sig('foo', nargs='?')]
840ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['-x', 'a b']
841ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
842ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('', NS(foo=None)),
843ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('a', NS(foo='a')),
844ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
845ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
846ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
847ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestPositionalsNargsOptionalDefault(ParserTestCase):
848ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Tests an Optional Positional with a default value"""
849ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
850ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [Sig('foo', nargs='?', default=42)]
851ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['-x', 'a b']
852ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
853ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('', NS(foo=42)),
854ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('a', NS(foo='a')),
855ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
856ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
857ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
858ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestPositionalsNargsOptionalConvertedDefault(ParserTestCase):
859ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Tests an Optional Positional with a default value
860ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    that needs to be converted to the appropriate type.
861ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """
862ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
863ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [
864ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('foo', nargs='?', type=int, default='42'),
865ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
866ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['-x', 'a b', '1 2']
867ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
868ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('', NS(foo=42)),
869ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('1', NS(foo=1)),
870ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
871ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
872ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
873ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestPositionalsNargsNoneNone(ParserTestCase):
874ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test two Positionals that don't specify nargs"""
875ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
876ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [Sig('foo'), Sig('bar')]
877ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['', '-x', 'a', 'a b c']
878ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
879ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('a b', NS(foo='a', bar='b')),
880ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
881ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
882ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
883ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestPositionalsNargsNone1(ParserTestCase):
884ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test a Positional with no nargs followed by one with 1"""
885ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
886ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [Sig('foo'), Sig('bar', nargs=1)]
887ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['', '--foo', 'a', 'a b c']
888ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
889ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('a b', NS(foo='a', bar=['b'])),
890ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
891ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
892ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
893ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestPositionalsNargs2None(ParserTestCase):
894ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test a Positional with 2 nargs followed by one with none"""
895ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
896ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [Sig('foo', nargs=2), Sig('bar')]
897ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['', '--foo', 'a', 'a b', 'a b c d']
898ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
899ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('a b c', NS(foo=['a', 'b'], bar='c')),
900ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
901ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
902ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
903ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestPositionalsNargsNoneZeroOrMore(ParserTestCase):
904ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test a Positional with no nargs followed by one with unlimited"""
905ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
906ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [Sig('foo'), Sig('bar', nargs='*')]
907ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['', '--foo']
908ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
909ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('a', NS(foo='a', bar=[])),
910ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('a b', NS(foo='a', bar=['b'])),
911ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('a b c', NS(foo='a', bar=['b', 'c'])),
912ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
913ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
914ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
915ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestPositionalsNargsNoneOneOrMore(ParserTestCase):
916ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test a Positional with no nargs followed by one with one or more"""
917ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
918ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [Sig('foo'), Sig('bar', nargs='+')]
919ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['', '--foo', 'a']
920ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
921ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('a b', NS(foo='a', bar=['b'])),
922ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('a b c', NS(foo='a', bar=['b', 'c'])),
923ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
924ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
925ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
926ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestPositionalsNargsNoneOptional(ParserTestCase):
927ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test a Positional with no nargs followed by one with an Optional"""
928ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
929ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [Sig('foo'), Sig('bar', nargs='?')]
930ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['', '--foo', 'a b c']
931ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
932ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('a', NS(foo='a', bar=None)),
933ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('a b', NS(foo='a', bar='b')),
934ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
935ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
936ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
937ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestPositionalsNargsZeroOrMoreNone(ParserTestCase):
938ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test a Positional with unlimited nargs followed by one with none"""
939ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
940ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [Sig('foo', nargs='*'), Sig('bar')]
941ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['', '--foo']
942ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
943ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('a', NS(foo=[], bar='a')),
944ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('a b', NS(foo=['a'], bar='b')),
945ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('a b c', NS(foo=['a', 'b'], bar='c')),
946ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
947ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
948ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
949ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestPositionalsNargsOneOrMoreNone(ParserTestCase):
950ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test a Positional with one or more nargs followed by one with none"""
951ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
952ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [Sig('foo', nargs='+'), Sig('bar')]
953ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['', '--foo', 'a']
954ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
955ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('a b', NS(foo=['a'], bar='b')),
956ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('a b c', NS(foo=['a', 'b'], bar='c')),
957ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
958ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
959ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
960ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestPositionalsNargsOptionalNone(ParserTestCase):
961ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test a Positional with an Optional nargs followed by one with none"""
962ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
963ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [Sig('foo', nargs='?', default=42), Sig('bar')]
964ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['', '--foo', 'a b c']
965ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
966ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('a', NS(foo=42, bar='a')),
967ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('a b', NS(foo='a', bar='b')),
968ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
969ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
970ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
971ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestPositionalsNargs2ZeroOrMore(ParserTestCase):
972ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test a Positional with 2 nargs followed by one with unlimited"""
973ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
974ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [Sig('foo', nargs=2), Sig('bar', nargs='*')]
975ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['', '--foo', 'a']
976ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
977ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('a b', NS(foo=['a', 'b'], bar=[])),
978ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('a b c', NS(foo=['a', 'b'], bar=['c'])),
979ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
980ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
981ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
982ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestPositionalsNargs2OneOrMore(ParserTestCase):
983ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test a Positional with 2 nargs followed by one with one or more"""
984ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
985ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [Sig('foo', nargs=2), Sig('bar', nargs='+')]
986ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['', '--foo', 'a', 'a b']
987ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
988ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('a b c', NS(foo=['a', 'b'], bar=['c'])),
989ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
990ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
991ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
992ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestPositionalsNargs2Optional(ParserTestCase):
993ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test a Positional with 2 nargs followed by one optional"""
994ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
995ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [Sig('foo', nargs=2), Sig('bar', nargs='?')]
996ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['', '--foo', 'a', 'a b c d']
997ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
998ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('a b', NS(foo=['a', 'b'], bar=None)),
999ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('a b c', NS(foo=['a', 'b'], bar='c')),
1000ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
1001ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1002ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1003ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestPositionalsNargsZeroOrMore1(ParserTestCase):
1004ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test a Positional with unlimited nargs followed by one with 1"""
1005ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1006ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [Sig('foo', nargs='*'), Sig('bar', nargs=1)]
1007ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['', '--foo', ]
1008ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
1009ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('a', NS(foo=[], bar=['a'])),
1010ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('a b', NS(foo=['a'], bar=['b'])),
1011ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('a b c', NS(foo=['a', 'b'], bar=['c'])),
1012ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
1013ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1014ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1015ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestPositionalsNargsOneOrMore1(ParserTestCase):
1016ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test a Positional with one or more nargs followed by one with 1"""
1017ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1018ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [Sig('foo', nargs='+'), Sig('bar', nargs=1)]
1019ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['', '--foo', 'a']
1020ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
1021ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('a b', NS(foo=['a'], bar=['b'])),
1022ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('a b c', NS(foo=['a', 'b'], bar=['c'])),
1023ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
1024ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1025ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1026ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestPositionalsNargsOptional1(ParserTestCase):
1027ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test a Positional with an Optional nargs followed by one with 1"""
1028ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1029ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [Sig('foo', nargs='?'), Sig('bar', nargs=1)]
1030ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['', '--foo', 'a b c']
1031ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
1032ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('a', NS(foo=None, bar=['a'])),
1033ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('a b', NS(foo='a', bar=['b'])),
1034ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
1035ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1036ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1037ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestPositionalsNargsNoneZeroOrMore1(ParserTestCase):
1038ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test three Positionals: no nargs, unlimited nargs and 1 nargs"""
1039ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1040ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [
1041ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('foo'),
1042ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('bar', nargs='*'),
1043ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('baz', nargs=1),
1044ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
1045ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['', '--foo', 'a']
1046ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
1047ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('a b', NS(foo='a', bar=[], baz=['b'])),
1048ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('a b c', NS(foo='a', bar=['b'], baz=['c'])),
1049ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
1050ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1051ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1052ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestPositionalsNargsNoneOneOrMore1(ParserTestCase):
1053ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test three Positionals: no nargs, one or more nargs and 1 nargs"""
1054ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1055ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [
1056ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('foo'),
1057ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('bar', nargs='+'),
1058ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('baz', nargs=1),
1059ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
1060ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['', '--foo', 'a', 'b']
1061ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
1062ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('a b c', NS(foo='a', bar=['b'], baz=['c'])),
1063ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('a b c d', NS(foo='a', bar=['b', 'c'], baz=['d'])),
1064ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
1065ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1066ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1067ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestPositionalsNargsNoneOptional1(ParserTestCase):
1068ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test three Positionals: no nargs, optional narg and 1 nargs"""
1069ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1070ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [
1071ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('foo'),
1072ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('bar', nargs='?', default=0.625),
1073ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('baz', nargs=1),
1074ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
1075ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['', '--foo', 'a']
1076ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
1077ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('a b', NS(foo='a', bar=0.625, baz=['b'])),
1078ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('a b c', NS(foo='a', bar='b', baz=['c'])),
1079ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
1080ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1081ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1082ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestPositionalsNargsOptionalOptional(ParserTestCase):
1083ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test two optional nargs"""
1084ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1085ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [
1086ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('foo', nargs='?'),
1087ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('bar', nargs='?', default=42),
1088ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
1089ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['--foo', 'a b c']
1090ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
1091ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('', NS(foo=None, bar=42)),
1092ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('a', NS(foo='a', bar=42)),
1093ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('a b', NS(foo='a', bar='b')),
1094ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
1095ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1096ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1097ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestPositionalsNargsOptionalZeroOrMore(ParserTestCase):
1098ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test an Optional narg followed by unlimited nargs"""
1099ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1100ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [Sig('foo', nargs='?'), Sig('bar', nargs='*')]
1101ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['--foo']
1102ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
1103ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('', NS(foo=None, bar=[])),
1104ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('a', NS(foo='a', bar=[])),
1105ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('a b', NS(foo='a', bar=['b'])),
1106ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('a b c', NS(foo='a', bar=['b', 'c'])),
1107ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
1108ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1109ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1110ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestPositionalsNargsOptionalOneOrMore(ParserTestCase):
1111ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test an Optional narg followed by one or more nargs"""
1112ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1113ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [Sig('foo', nargs='?'), Sig('bar', nargs='+')]
1114ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['', '--foo']
1115ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
1116ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('a', NS(foo=None, bar=['a'])),
1117ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('a b', NS(foo='a', bar=['b'])),
1118ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('a b c', NS(foo='a', bar=['b', 'c'])),
1119ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
1120ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1121ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1122ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestPositionalsChoicesString(ParserTestCase):
1123ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test a set of single-character choices"""
1124ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1125ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [Sig('spam', choices=set('abcdefg'))]
1126ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['', '--foo', 'h', '42', 'ef']
1127ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
1128ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('a', NS(spam='a')),
1129ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('g', NS(spam='g')),
1130ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
1131ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1132ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1133ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestPositionalsChoicesInt(ParserTestCase):
1134ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test a set of integer choices"""
1135ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1136ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [Sig('spam', type=int, choices=range(20))]
1137ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['', '--foo', 'h', '42', 'ef']
1138ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
1139ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('4', NS(spam=4)),
1140ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('15', NS(spam=15)),
1141ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
1142ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1143ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1144ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestPositionalsActionAppend(ParserTestCase):
1145ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test the 'append' action"""
1146ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1147ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [
1148ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('spam', action='append'),
1149ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('spam', action='append', nargs=2),
1150ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
1151ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['', '--foo', 'a', 'a b', 'a b c d']
1152ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
1153ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('a b c', NS(spam=['a', ['b', 'c']])),
1154ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
1155ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1156ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# ========================================
1157ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# Combined optionals and positionals tests
1158ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# ========================================
1159ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1160ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestOptionalsNumericAndPositionals(ParserTestCase):
1161ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Tests negative number args when numeric options are present"""
1162ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1163ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [
1164ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('x', nargs='?'),
1165ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('-4', dest='y', action='store_true'),
1166ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
1167ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['-2', '-315']
1168ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
1169ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('', NS(x=None, y=False)),
1170ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('a', NS(x='a', y=False)),
1171ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-4', NS(x=None, y=True)),
1172ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-4 a', NS(x='a', y=True)),
1173ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
1174ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1175ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1176ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestOptionalsAlmostNumericAndPositionals(ParserTestCase):
1177ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Tests negative number args when almost numeric options are present"""
1178ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1179ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [
1180ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('x', nargs='?'),
1181ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('-k4', dest='y', action='store_true'),
1182ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
1183ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['-k3']
1184ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
1185ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('', NS(x=None, y=False)),
1186ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-2', NS(x='-2', y=False)),
1187ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('a', NS(x='a', y=False)),
1188ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-k4', NS(x=None, y=True)),
1189ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-k4 a', NS(x='a', y=True)),
1190ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
1191ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1192ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1193ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestEmptyAndSpaceContainingArguments(ParserTestCase):
1194ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1195ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [
1196ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('x', nargs='?'),
1197ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('-y', '--yyy', dest='y'),
1198ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
1199ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['-y']
1200ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
1201ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ([''], NS(x='', y=None)),
1202ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        (['a badger'], NS(x='a badger', y=None)),
1203ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        (['-a badger'], NS(x='-a badger', y=None)),
1204ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        (['-y', ''], NS(x=None, y='')),
1205ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        (['-y', 'a badger'], NS(x=None, y='a badger')),
1206ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        (['-y', '-a badger'], NS(x=None, y='-a badger')),
1207ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        (['--yyy=a badger'], NS(x=None, y='a badger')),
1208ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        (['--yyy=-a badger'], NS(x=None, y='-a badger')),
1209ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
1210ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1211ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1212ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestPrefixCharacterOnlyArguments(ParserTestCase):
1213ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1214ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    parser_signature = Sig(prefix_chars='-+')
1215ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [
1216ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('-', dest='x', nargs='?', const='badger'),
1217ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('+', dest='y', type=int, default=42),
1218ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('-+-', dest='z', action='store_true'),
1219ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
1220ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['-y', '+ -']
1221ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
1222ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('', NS(x=None, y=42, z=False)),
1223ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-', NS(x='badger', y=42, z=False)),
1224ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('- X', NS(x='X', y=42, z=False)),
1225ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('+ -3', NS(x=None, y=-3, z=False)),
1226ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-+-', NS(x=None, y=42, z=True)),
1227ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('- ===', NS(x='===', y=42, z=False)),
1228ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
1229ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1230ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1231ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestNargsZeroOrMore(ParserTestCase):
1232ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Tests specifying an args for an Optional that accepts zero or more"""
1233ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1234ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [Sig('-x', nargs='*'), Sig('y', nargs='*')]
1235ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = []
1236ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
1237ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('', NS(x=None, y=[])),
1238ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-x', NS(x=[], y=[])),
1239ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-x a', NS(x=['a'], y=[])),
1240ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-x a -- b', NS(x=['a'], y=['b'])),
1241ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('a', NS(x=None, y=['a'])),
1242ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('a -x', NS(x=[], y=['a'])),
1243ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('a -x b', NS(x=['b'], y=['a'])),
1244ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
1245ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1246ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1247ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestNargsRemainder(ParserTestCase):
1248ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Tests specifying a positional with nargs=REMAINDER"""
1249ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1250ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [Sig('x'), Sig('y', nargs='...'), Sig('-z')]
1251ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['', '-z', '-z Z']
1252ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
1253ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('X', NS(x='X', y=[], z=None)),
1254ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-z Z X', NS(x='X', y=[], z='Z')),
1255ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('X A B -z Z', NS(x='X', y=['A', 'B', '-z', 'Z'], z=None)),
1256ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('X Y --foo', NS(x='X', y=['Y', '--foo'], z=None)),
1257ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
1258ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1259ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1260ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestOptionLike(ParserTestCase):
1261ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Tests options that may or may not be arguments"""
1262ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1263ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [
1264ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('-x', type=float),
1265ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('-3', type=float, dest='y'),
1266ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('z', nargs='*'),
1267ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
1268ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['-x', '-y2.5', '-xa', '-x -a',
1269ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                '-x -3', '-x -3.5', '-3 -3.5',
1270ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                '-x -2.5', '-x -2.5 a', '-3 -.5',
1271ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                'a x -1', '-x -1 a', '-3 -1 a']
1272ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
1273ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('', NS(x=None, y=None, z=[])),
1274ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-x 2.5', NS(x=2.5, y=None, z=[])),
1275ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-x 2.5 a', NS(x=2.5, y=None, z=['a'])),
1276ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-3.5', NS(x=None, y=0.5, z=[])),
1277ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-3-.5', NS(x=None, y=-0.5, z=[])),
1278ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-3 .5', NS(x=None, y=0.5, z=[])),
1279ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('a -3.5', NS(x=None, y=0.5, z=['a'])),
1280ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('a', NS(x=None, y=None, z=['a'])),
1281ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('a -x 1', NS(x=1.0, y=None, z=['a'])),
1282ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-x 1 a', NS(x=1.0, y=None, z=['a'])),
1283ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-3 1 a', NS(x=None, y=1.0, z=['a'])),
1284ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
1285ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1286ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1287ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestDefaultSuppress(ParserTestCase):
1288ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test actions with suppressed defaults"""
1289ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1290ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [
1291ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('foo', nargs='?', default=argparse.SUPPRESS),
1292ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('bar', nargs='*', default=argparse.SUPPRESS),
1293ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('--baz', action='store_true', default=argparse.SUPPRESS),
1294ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
1295ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['-x']
1296ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
1297ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('', NS()),
1298ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('a', NS(foo='a')),
1299ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('a b', NS(foo='a', bar=['b'])),
1300ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('--baz', NS(baz=True)),
1301ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('a --baz', NS(foo='a', baz=True)),
1302ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('--baz a b', NS(foo='a', bar=['b'], baz=True)),
1303ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
1304ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1305ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1306ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestParserDefaultSuppress(ParserTestCase):
1307ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test actions with a parser-level default of SUPPRESS"""
1308ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1309ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    parser_signature = Sig(argument_default=argparse.SUPPRESS)
1310ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [
1311ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('foo', nargs='?'),
1312ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('bar', nargs='*'),
1313ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('--baz', action='store_true'),
1314ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
1315ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['-x']
1316ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
1317ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('', NS()),
1318ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('a', NS(foo='a')),
1319ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('a b', NS(foo='a', bar=['b'])),
1320ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('--baz', NS(baz=True)),
1321ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('a --baz', NS(foo='a', baz=True)),
1322ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('--baz a b', NS(foo='a', bar=['b'], baz=True)),
1323ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
1324ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1325ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1326ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestParserDefault42(ParserTestCase):
1327ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test actions with a parser-level default of 42"""
1328ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1329ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    parser_signature = Sig(argument_default=42, version='1.0')
1330ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [
1331ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('foo', nargs='?'),
1332ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('bar', nargs='*'),
1333ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('--baz', action='store_true'),
1334ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
1335ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['-x']
1336ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
1337ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('', NS(foo=42, bar=42, baz=42)),
1338ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('a', NS(foo='a', bar=42, baz=42)),
1339ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('a b', NS(foo='a', bar=['b'], baz=42)),
1340ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('--baz', NS(foo=42, bar=42, baz=True)),
1341ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('a --baz', NS(foo='a', bar=42, baz=True)),
1342ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('--baz a b', NS(foo='a', bar=['b'], baz=True)),
1343ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
1344ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1345ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1346ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestArgumentsFromFile(TempDirMixin, ParserTestCase):
1347ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test reading arguments from a file"""
1348ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1349ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def setUp(self):
1350ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        super(TestArgumentsFromFile, self).setUp()
1351ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        file_texts = [
1352ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            ('hello', 'hello world!\n'),
1353ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            ('recursive', '-a\n'
1354ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                          'A\n'
1355ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                          '@hello'),
1356ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            ('invalid', '@no-such-path\n'),
1357ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ]
1358ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for path, text in file_texts:
1359ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            file = open(path, 'w')
1360ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            file.write(text)
1361ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            file.close()
1362ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1363ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    parser_signature = Sig(fromfile_prefix_chars='@')
1364ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [
1365ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('-a'),
1366ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('x'),
1367ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('y', nargs='+'),
1368ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
1369ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['', '-b', 'X', '@invalid', '@missing']
1370ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
1371ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('X Y', NS(a=None, x='X', y=['Y'])),
1372ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('X -a A Y Z', NS(a='A', x='X', y=['Y', 'Z'])),
1373ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('@hello X', NS(a=None, x='hello world!', y=['X'])),
1374ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('X @hello', NS(a=None, x='X', y=['hello world!'])),
1375ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-a B @recursive Y Z', NS(a='A', x='hello world!', y=['Y', 'Z'])),
1376ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('X @recursive Z -a B', NS(a='B', x='X', y=['hello world!', 'Z'])),
1377ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        (["-a", "", "X", "Y"], NS(a='', x='X', y=['Y'])),
1378ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
1379ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1380ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1381ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestArgumentsFromFileConverter(TempDirMixin, ParserTestCase):
1382ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test reading arguments from a file"""
1383ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1384ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def setUp(self):
1385ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        super(TestArgumentsFromFileConverter, self).setUp()
1386ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        file_texts = [
1387ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            ('hello', 'hello world!\n'),
1388ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ]
1389ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for path, text in file_texts:
1390ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            file = open(path, 'w')
1391ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            file.write(text)
1392ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            file.close()
1393ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1394ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    class FromFileConverterArgumentParser(ErrorRaisingArgumentParser):
1395ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1396ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        def convert_arg_line_to_args(self, arg_line):
1397ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            for arg in arg_line.split():
1398ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                if not arg.strip():
1399ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    continue
1400ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                yield arg
1401ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    parser_class = FromFileConverterArgumentParser
1402ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    parser_signature = Sig(fromfile_prefix_chars='@')
1403ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [
1404ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('y', nargs='+'),
1405ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
1406ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = []
1407ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
1408ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('@hello X', NS(y=['hello', 'world!', 'X'])),
1409ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
1410ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1411ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1412ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# =====================
1413ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# Type conversion tests
1414ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# =====================
1415ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1416ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestFileTypeRepr(TestCase):
1417ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1418ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_r(self):
1419ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        type = argparse.FileType('r')
1420ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual("FileType('r')", repr(type))
1421ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1422ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_wb_1(self):
1423ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        type = argparse.FileType('wb', 1)
1424ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual("FileType('wb', 1)", repr(type))
1425ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1426ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1427ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass RFile(object):
1428ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    seen = {}
1429ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1430ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def __init__(self, name):
1431ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.name = name
1432ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1433ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    __hash__ = None
1434ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1435ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def __eq__(self, other):
1436ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        if other in self.seen:
1437ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            text = self.seen[other]
1438ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        else:
1439ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            text = self.seen[other] = other.read()
1440ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            other.close()
1441ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        if not isinstance(text, str):
1442ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            text = text.decode('ascii')
1443ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        return self.name == other.name == text
1444ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1445ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1446ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestFileTypeR(TempDirMixin, ParserTestCase):
1447ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test the FileType option/argument type for reading files"""
1448ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1449ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def setUp(self):
1450ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        super(TestFileTypeR, self).setUp()
1451ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for file_name in ['foo', 'bar']:
1452ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            file = open(os.path.join(self.temp_dir, file_name), 'w')
1453ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            file.write(file_name)
1454ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            file.close()
1455ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.create_readonly_file('readonly')
1456ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1457ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [
1458ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('-x', type=argparse.FileType()),
1459ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('spam', type=argparse.FileType('r')),
1460ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
1461ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['-x', '-x bar', 'non-existent-file.txt']
1462ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
1463ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('foo', NS(x=None, spam=RFile('foo'))),
1464ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-x foo bar', NS(x=RFile('foo'), spam=RFile('bar'))),
1465ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('bar -x foo', NS(x=RFile('foo'), spam=RFile('bar'))),
1466ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-x - -', NS(x=sys.stdin, spam=sys.stdin)),
1467ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('readonly', NS(x=None, spam=RFile('readonly'))),
1468ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
1469ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1470ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestFileTypeDefaults(TempDirMixin, ParserTestCase):
1471ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test that a file is not created unless the default is needed"""
1472ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def setUp(self):
1473ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        super(TestFileTypeDefaults, self).setUp()
1474ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        file = open(os.path.join(self.temp_dir, 'good'), 'w')
1475ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        file.write('good')
1476ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        file.close()
1477ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1478ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [
1479ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('-c', type=argparse.FileType('r'), default='no-file.txt'),
1480ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
1481ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    # should provoke no such file error
1482ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['']
1483ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    # should not provoke error because default file is created
1484ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [('-c good', NS(c=RFile('good')))]
1485ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1486ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1487ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestFileTypeRB(TempDirMixin, ParserTestCase):
1488ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test the FileType option/argument type for reading files"""
1489ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1490ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def setUp(self):
1491ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        super(TestFileTypeRB, self).setUp()
1492ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for file_name in ['foo', 'bar']:
1493ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            file = open(os.path.join(self.temp_dir, file_name), 'w')
1494ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            file.write(file_name)
1495ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            file.close()
1496ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1497ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [
1498ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('-x', type=argparse.FileType('rb')),
1499ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('spam', type=argparse.FileType('rb')),
1500ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
1501ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['-x', '-x bar']
1502ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
1503ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('foo', NS(x=None, spam=RFile('foo'))),
1504ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-x foo bar', NS(x=RFile('foo'), spam=RFile('bar'))),
1505ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('bar -x foo', NS(x=RFile('foo'), spam=RFile('bar'))),
1506ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-x - -', NS(x=sys.stdin, spam=sys.stdin)),
1507ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
1508ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1509ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1510ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass WFile(object):
1511ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    seen = set()
1512ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1513ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def __init__(self, name):
1514ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.name = name
1515ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1516ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    __hash__ = None
1517ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1518ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def __eq__(self, other):
1519ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        if other not in self.seen:
1520ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            text = 'Check that file is writable.'
1521ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            if 'b' in other.mode:
1522ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                text = text.encode('ascii')
1523ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            other.write(text)
1524ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            other.close()
1525ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.seen.add(other)
1526ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        return self.name == other.name
1527ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1528ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1529ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh@unittest.skipIf(hasattr(os, 'geteuid') and os.geteuid() == 0,
1530ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                 "non-root user required")
1531ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestFileTypeW(TempDirMixin, ParserTestCase):
1532ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test the FileType option/argument type for writing files"""
1533ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1534ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def setUp(self):
1535ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        super(TestFileTypeW, self).setUp()
1536ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.create_readonly_file('readonly')
1537ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1538ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [
1539ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('-x', type=argparse.FileType('w')),
1540ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('spam', type=argparse.FileType('w')),
1541ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
1542ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['-x', '-x bar']
1543ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['-x', '-x bar', 'readonly']
1544ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
1545ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('foo', NS(x=None, spam=WFile('foo'))),
1546ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-x foo bar', NS(x=WFile('foo'), spam=WFile('bar'))),
1547ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('bar -x foo', NS(x=WFile('foo'), spam=WFile('bar'))),
1548ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-x - -', NS(x=sys.stdout, spam=sys.stdout)),
1549ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
1550ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1551ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1552ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestFileTypeWB(TempDirMixin, ParserTestCase):
1553ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1554ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [
1555ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('-x', type=argparse.FileType('wb')),
1556ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('spam', type=argparse.FileType('wb')),
1557ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
1558ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['-x', '-x bar']
1559ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
1560ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('foo', NS(x=None, spam=WFile('foo'))),
1561ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-x foo bar', NS(x=WFile('foo'), spam=WFile('bar'))),
1562ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('bar -x foo', NS(x=WFile('foo'), spam=WFile('bar'))),
1563ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-x - -', NS(x=sys.stdout, spam=sys.stdout)),
1564ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
1565ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1566ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1567ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestTypeCallable(ParserTestCase):
1568ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test some callables as option/argument types"""
1569ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1570ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [
1571ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('--eggs', type=complex),
1572ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('spam', type=float),
1573ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
1574ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['a', '42j', '--eggs a', '--eggs 2i']
1575ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
1576ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('--eggs=42 42', NS(eggs=42, spam=42.0)),
1577ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('--eggs 2j -- -1.5', NS(eggs=2j, spam=-1.5)),
1578ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('1024.675', NS(eggs=None, spam=1024.675)),
1579ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
1580ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1581ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1582ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestTypeUserDefined(ParserTestCase):
1583ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test a user-defined option/argument type"""
1584ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1585ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    class MyType(TestCase):
1586ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1587ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        def __init__(self, value):
1588ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.value = value
1589ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1590ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        __hash__ = None
1591ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1592ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        def __eq__(self, other):
1593ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            return (type(self), self.value) == (type(other), other.value)
1594ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1595ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [
1596ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('-x', type=MyType),
1597ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('spam', type=MyType),
1598ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
1599ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = []
1600ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
1601ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('a -x b', NS(x=MyType('b'), spam=MyType('a'))),
1602ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-xf g', NS(x=MyType('f'), spam=MyType('g'))),
1603ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
1604ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1605ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1606ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestTypeClassicClass(ParserTestCase):
1607ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test a classic class type"""
1608ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1609ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    class C:
1610ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1611ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        def __init__(self, value):
1612ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.value = value
1613ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1614ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        __hash__ = None
1615ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1616ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        def __eq__(self, other):
1617ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            return (type(self), self.value) == (type(other), other.value)
1618ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1619ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [
1620ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('-x', type=C),
1621ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('spam', type=C),
1622ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
1623ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = []
1624ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
1625ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('a -x b', NS(x=C('b'), spam=C('a'))),
1626ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-xf g', NS(x=C('f'), spam=C('g'))),
1627ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
1628ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1629ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1630ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestTypeRegistration(TestCase):
1631ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test a user-defined type by registering it"""
1632ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1633ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test(self):
1634ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1635ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        def get_my_type(string):
1636ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            return 'my_type{%s}' % string
1637ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1638ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser = argparse.ArgumentParser()
1639ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser.register('type', 'my_type', get_my_type)
1640ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser.add_argument('-x', type='my_type')
1641ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser.add_argument('y', type='my_type')
1642ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1643ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(parser.parse_args('1'.split()),
1644ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                         NS(x=None, y='my_type{1}'))
1645ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(parser.parse_args('-x 1 42'.split()),
1646ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                         NS(x='my_type{1}', y='my_type{42}'))
1647ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1648ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1649ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# ============
1650ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# Action tests
1651ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# ============
1652ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1653ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestActionUserDefined(ParserTestCase):
1654ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test a user-defined option/argument action"""
1655ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1656ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    class OptionalAction(argparse.Action):
1657ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1658ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        def __call__(self, parser, namespace, value, option_string=None):
1659ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            try:
1660ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                # check destination and option string
1661ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                assert self.dest == 'spam', 'dest: %s' % self.dest
1662ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                assert option_string == '-s', 'flag: %s' % option_string
1663ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                # when option is before argument, badger=2, and when
1664ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                # option is after argument, badger=<whatever was set>
1665ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                expected_ns = NS(spam=0.25)
1666ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                if value in [0.125, 0.625]:
1667ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    expected_ns.badger = 2
1668ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                elif value in [2.0]:
1669ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    expected_ns.badger = 84
1670ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                else:
1671ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    raise AssertionError('value: %s' % value)
1672ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                assert expected_ns == namespace, ('expected %s, got %s' %
1673ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                                  (expected_ns, namespace))
1674ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            except AssertionError:
1675ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                e = sys.exc_info()[1]
1676ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                raise ArgumentParserError('opt_action failed: %s' % e)
1677ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            setattr(namespace, 'spam', value)
1678ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1679ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    class PositionalAction(argparse.Action):
1680ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1681ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        def __call__(self, parser, namespace, value, option_string=None):
1682ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            try:
1683ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                assert option_string is None, ('option_string: %s' %
1684ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                               option_string)
1685ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                # check destination
1686ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                assert self.dest == 'badger', 'dest: %s' % self.dest
1687ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                # when argument is before option, spam=0.25, and when
1688ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                # option is after argument, spam=<whatever was set>
1689ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                expected_ns = NS(badger=2)
1690ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                if value in [42, 84]:
1691ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    expected_ns.spam = 0.25
1692ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                elif value in [1]:
1693ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    expected_ns.spam = 0.625
1694ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                elif value in [2]:
1695ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    expected_ns.spam = 0.125
1696ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                else:
1697ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    raise AssertionError('value: %s' % value)
1698ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                assert expected_ns == namespace, ('expected %s, got %s' %
1699ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                                  (expected_ns, namespace))
1700ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            except AssertionError:
1701ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                e = sys.exc_info()[1]
1702ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                raise ArgumentParserError('arg_action failed: %s' % e)
1703ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            setattr(namespace, 'badger', value)
1704ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1705ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [
1706ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('-s', dest='spam', action=OptionalAction,
1707ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            type=float, default=0.25),
1708ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('badger', action=PositionalAction,
1709ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            type=int, nargs='?', default=2),
1710ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
1711ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = []
1712ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
1713ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-s0.125', NS(spam=0.125, badger=2)),
1714ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('42', NS(spam=0.25, badger=42)),
1715ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-s 0.625 1', NS(spam=0.625, badger=1)),
1716ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('84 -s2', NS(spam=2.0, badger=84)),
1717ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
1718ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1719ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1720ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestActionRegistration(TestCase):
1721ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test a user-defined action supplied by registering it"""
1722ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1723ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    class MyAction(argparse.Action):
1724ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1725ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        def __call__(self, parser, namespace, values, option_string=None):
1726ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            setattr(namespace, self.dest, 'foo[%s]' % values)
1727ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1728ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test(self):
1729ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1730ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser = argparse.ArgumentParser()
1731ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser.register('action', 'my_action', self.MyAction)
1732ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser.add_argument('badger', action='my_action')
1733ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1734ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(parser.parse_args(['1']), NS(badger='foo[1]'))
1735ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(parser.parse_args(['42']), NS(badger='foo[42]'))
1736ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1737ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1738ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# ================
1739ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# Subparsers tests
1740ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# ================
1741ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1742ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestAddSubparsers(TestCase):
1743ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test the add_subparsers method"""
1744ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1745ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def assertArgumentParserError(self, *args, **kwargs):
1746ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertRaises(ArgumentParserError, *args, **kwargs)
1747ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1748ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def _get_parser(self, subparser_help=False, prefix_chars=None):
1749ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # create a parser with a subparsers argument
1750ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        if prefix_chars:
1751ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            parser = ErrorRaisingArgumentParser(
1752ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                prog='PROG', description='main description', prefix_chars=prefix_chars)
1753ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            parser.add_argument(
1754ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                prefix_chars[0] * 2 + 'foo', action='store_true', help='foo help')
1755ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        else:
1756ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            parser = ErrorRaisingArgumentParser(
1757ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                prog='PROG', description='main description')
1758ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            parser.add_argument(
1759ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                '--foo', action='store_true', help='foo help')
1760ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser.add_argument(
1761ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            'bar', type=float, help='bar help')
1762ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1763ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # check that only one subparsers argument can be added
1764ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        subparsers = parser.add_subparsers(help='command help')
1765ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertArgumentParserError(parser.add_subparsers)
1766ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1767ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # add first sub-parser
1768ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser1_kwargs = dict(description='1 description')
1769ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        if subparser_help:
1770ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            parser1_kwargs['help'] = '1 help'
1771ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser1 = subparsers.add_parser('1', **parser1_kwargs)
1772ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser1.add_argument('-w', type=int, help='w help')
1773ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser1.add_argument('x', choices='abc', help='x help')
1774ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1775ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # add second sub-parser
1776ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser2_kwargs = dict(description='2 description')
1777ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        if subparser_help:
1778ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            parser2_kwargs['help'] = '2 help'
1779ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser2 = subparsers.add_parser('2', **parser2_kwargs)
1780ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser2.add_argument('-y', choices='123', help='y help')
1781ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser2.add_argument('z', type=complex, nargs='*', help='z help')
1782ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1783ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # add third sub-parser
1784ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser3_kwargs = dict(description='3 description')
1785ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        if subparser_help:
1786ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            parser3_kwargs['help'] = '3 help'
1787ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser3 = subparsers.add_parser('3', **parser3_kwargs)
1788ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser3.add_argument('t', type=int, help='t help')
1789ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser3.add_argument('u', nargs='...', help='u help')
1790ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1791ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # return the main parser
1792ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        return parser
1793ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1794ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def setUp(self):
1795ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        super(TestAddSubparsers, self).setUp()
1796ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.parser = self._get_parser()
1797ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.command_help_parser = self._get_parser(subparser_help=True)
1798ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1799ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_parse_args_failures(self):
1800ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # check some failure cases:
1801ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for args_str in ['', 'a', 'a a', '0.5 a', '0.5 1',
1802ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                         '0.5 1 -y', '0.5 2 -w']:
1803ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            args = args_str.split()
1804ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertArgumentParserError(self.parser.parse_args, args)
1805ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1806ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_parse_args(self):
1807ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # check some non-failure cases:
1808ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(
1809ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.parser.parse_args('0.5 1 b -w 7'.split()),
1810ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            NS(foo=False, bar=0.5, w=7, x='b'),
1811ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        )
1812ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(
1813ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.parser.parse_args('0.25 --foo 2 -y 2 3j -- -1j'.split()),
1814ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            NS(foo=True, bar=0.25, y='2', z=[3j, -1j]),
1815ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        )
1816ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(
1817ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.parser.parse_args('--foo 0.125 1 c'.split()),
1818ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            NS(foo=True, bar=0.125, w=None, x='c'),
1819ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        )
1820ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(
1821ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.parser.parse_args('-1.5 3 11 -- a --foo 7 -- b'.split()),
1822ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            NS(foo=False, bar=-1.5, t=11, u=['a', '--foo', '7', '--', 'b']),
1823ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        )
1824ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1825ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_parse_known_args(self):
1826ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(
1827ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.parser.parse_known_args('0.5 1 b -w 7'.split()),
1828ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            (NS(foo=False, bar=0.5, w=7, x='b'), []),
1829ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        )
1830ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(
1831ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.parser.parse_known_args('0.5 -p 1 b -w 7'.split()),
1832ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            (NS(foo=False, bar=0.5, w=7, x='b'), ['-p']),
1833ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        )
1834ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(
1835ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.parser.parse_known_args('0.5 1 b -w 7 -p'.split()),
1836ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            (NS(foo=False, bar=0.5, w=7, x='b'), ['-p']),
1837ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        )
1838ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(
1839ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.parser.parse_known_args('0.5 1 b -q -rs -w 7'.split()),
1840ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            (NS(foo=False, bar=0.5, w=7, x='b'), ['-q', '-rs']),
1841ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        )
1842ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(
1843ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.parser.parse_known_args('0.5 -W 1 b -X Y -w 7 Z'.split()),
1844ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            (NS(foo=False, bar=0.5, w=7, x='b'), ['-W', '-X', 'Y', 'Z']),
1845ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        )
1846ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1847ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_dest(self):
1848ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser = ErrorRaisingArgumentParser()
1849ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser.add_argument('--foo', action='store_true')
1850ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        subparsers = parser.add_subparsers(dest='bar')
1851ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser1 = subparsers.add_parser('1')
1852ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser1.add_argument('baz')
1853ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(NS(foo=False, bar='1', baz='2'),
1854ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                         parser.parse_args('1 2'.split()))
1855ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1856ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_help(self):
1857ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(self.parser.format_usage(),
1858ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                         'usage: PROG [-h] [--foo] bar {1,2,3} ...\n')
1859ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(self.parser.format_help(), textwrap.dedent('''\
1860ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            usage: PROG [-h] [--foo] bar {1,2,3} ...
1861ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1862ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            main description
1863ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1864ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            positional arguments:
1865ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh              bar         bar help
1866ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh              {1,2,3}     command help
1867ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1868ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            optional arguments:
1869ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh              -h, --help  show this help message and exit
1870ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh              --foo       foo help
1871ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            '''))
1872ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1873ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_help_extra_prefix_chars(self):
1874ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # Make sure - is still used for help if it is a non-first prefix char
1875ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser = self._get_parser(prefix_chars='+:-')
1876ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(parser.format_usage(),
1877ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                         'usage: PROG [-h] [++foo] bar {1,2,3} ...\n')
1878ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(parser.format_help(), textwrap.dedent('''\
1879ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            usage: PROG [-h] [++foo] bar {1,2,3} ...
1880ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1881ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            main description
1882ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1883ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            positional arguments:
1884ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh              bar         bar help
1885ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh              {1,2,3}     command help
1886ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1887ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            optional arguments:
1888ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh              -h, --help  show this help message and exit
1889ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh              ++foo       foo help
1890ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            '''))
1891ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1892ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1893ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_help_alternate_prefix_chars(self):
1894ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser = self._get_parser(prefix_chars='+:/')
1895ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(parser.format_usage(),
1896ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                         'usage: PROG [+h] [++foo] bar {1,2,3} ...\n')
1897ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(parser.format_help(), textwrap.dedent('''\
1898ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            usage: PROG [+h] [++foo] bar {1,2,3} ...
1899ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1900ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            main description
1901ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1902ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            positional arguments:
1903ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh              bar         bar help
1904ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh              {1,2,3}     command help
1905ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1906ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            optional arguments:
1907ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh              +h, ++help  show this help message and exit
1908ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh              ++foo       foo help
1909ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            '''))
1910ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1911ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_parser_command_help(self):
1912ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(self.command_help_parser.format_usage(),
1913ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                         'usage: PROG [-h] [--foo] bar {1,2,3} ...\n')
1914ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(self.command_help_parser.format_help(),
1915ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                         textwrap.dedent('''\
1916ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            usage: PROG [-h] [--foo] bar {1,2,3} ...
1917ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1918ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            main description
1919ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1920ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            positional arguments:
1921ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh              bar         bar help
1922ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh              {1,2,3}     command help
1923ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                1         1 help
1924ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                2         2 help
1925ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                3         3 help
1926ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1927ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            optional arguments:
1928ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh              -h, --help  show this help message and exit
1929ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh              --foo       foo help
1930ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            '''))
1931ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1932ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_subparser_title_help(self):
1933ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser = ErrorRaisingArgumentParser(prog='PROG',
1934ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                            description='main description')
1935ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser.add_argument('--foo', action='store_true', help='foo help')
1936ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser.add_argument('bar', help='bar help')
1937ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        subparsers = parser.add_subparsers(title='subcommands',
1938ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                           description='command help',
1939ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                           help='additional text')
1940ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser1 = subparsers.add_parser('1')
1941ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser2 = subparsers.add_parser('2')
1942ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(parser.format_usage(),
1943ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                         'usage: PROG [-h] [--foo] bar {1,2} ...\n')
1944ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(parser.format_help(), textwrap.dedent('''\
1945ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            usage: PROG [-h] [--foo] bar {1,2} ...
1946ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1947ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            main description
1948ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1949ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            positional arguments:
1950ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh              bar         bar help
1951ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1952ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            optional arguments:
1953ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh              -h, --help  show this help message and exit
1954ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh              --foo       foo help
1955ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1956ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            subcommands:
1957ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh              command help
1958ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1959ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh              {1,2}       additional text
1960ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            '''))
1961ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1962ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def _test_subparser_help(self, args_str, expected_help):
1963ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        try:
1964ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.parser.parse_args(args_str.split())
1965ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        except ArgumentParserError:
1966ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            err = sys.exc_info()[1]
1967ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            if err.stdout != expected_help:
1968ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                print(repr(expected_help))
1969ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                print(repr(err.stdout))
1970ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertEqual(err.stdout, expected_help)
1971ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1972ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_subparser1_help(self):
1973ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self._test_subparser_help('5.0 1 -h', textwrap.dedent('''\
1974ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            usage: PROG bar 1 [-h] [-w W] {a,b,c}
1975ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1976ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            1 description
1977ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1978ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            positional arguments:
1979ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh              {a,b,c}     x help
1980ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1981ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            optional arguments:
1982ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh              -h, --help  show this help message and exit
1983ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh              -w W        w help
1984ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            '''))
1985ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1986ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_subparser2_help(self):
1987ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self._test_subparser_help('5.0 2 -h', textwrap.dedent('''\
1988ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            usage: PROG bar 2 [-h] [-y {1,2,3}] [z [z ...]]
1989ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1990ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            2 description
1991ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1992ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            positional arguments:
1993ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh              z           z help
1994ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
1995ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            optional arguments:
1996ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh              -h, --help  show this help message and exit
1997ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh              -y {1,2,3}  y help
1998ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            '''))
1999ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2000ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# ============
2001ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# Groups tests
2002ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# ============
2003ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2004ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestPositionalsGroups(TestCase):
2005ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Tests that order of group positionals matches construction order"""
2006ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2007ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_nongroup_first(self):
2008ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser = ErrorRaisingArgumentParser()
2009ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser.add_argument('foo')
2010ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        group = parser.add_argument_group('g')
2011ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        group.add_argument('bar')
2012ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser.add_argument('baz')
2013ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        expected = NS(foo='1', bar='2', baz='3')
2014ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        result = parser.parse_args('1 2 3'.split())
2015ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(expected, result)
2016ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2017ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_group_first(self):
2018ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser = ErrorRaisingArgumentParser()
2019ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        group = parser.add_argument_group('xxx')
2020ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        group.add_argument('foo')
2021ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser.add_argument('bar')
2022ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser.add_argument('baz')
2023ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        expected = NS(foo='1', bar='2', baz='3')
2024ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        result = parser.parse_args('1 2 3'.split())
2025ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(expected, result)
2026ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2027ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_interleaved_groups(self):
2028ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser = ErrorRaisingArgumentParser()
2029ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        group = parser.add_argument_group('xxx')
2030ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser.add_argument('foo')
2031ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        group.add_argument('bar')
2032ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser.add_argument('baz')
2033ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        group = parser.add_argument_group('yyy')
2034ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        group.add_argument('frell')
2035ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        expected = NS(foo='1', bar='2', baz='3', frell='4')
2036ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        result = parser.parse_args('1 2 3 4'.split())
2037ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(expected, result)
2038ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2039ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# ===================
2040ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# Parent parser tests
2041ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# ===================
2042ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2043ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestParentParsers(TestCase):
2044ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Tests that parsers can be created with parent parsers"""
2045ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2046ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def assertArgumentParserError(self, *args, **kwargs):
2047ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertRaises(ArgumentParserError, *args, **kwargs)
2048ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2049ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def setUp(self):
2050ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        super(TestParentParsers, self).setUp()
2051ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.wxyz_parent = ErrorRaisingArgumentParser(add_help=False)
2052ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.wxyz_parent.add_argument('--w')
2053ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        x_group = self.wxyz_parent.add_argument_group('x')
2054ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        x_group.add_argument('-y')
2055ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.wxyz_parent.add_argument('z')
2056ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2057ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.abcd_parent = ErrorRaisingArgumentParser(add_help=False)
2058ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.abcd_parent.add_argument('a')
2059ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.abcd_parent.add_argument('-b')
2060ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        c_group = self.abcd_parent.add_argument_group('c')
2061ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        c_group.add_argument('--d')
2062ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2063ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.w_parent = ErrorRaisingArgumentParser(add_help=False)
2064ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.w_parent.add_argument('--w')
2065ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2066ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.z_parent = ErrorRaisingArgumentParser(add_help=False)
2067ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.z_parent.add_argument('z')
2068ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2069ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # parents with mutually exclusive groups
2070ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.ab_mutex_parent = ErrorRaisingArgumentParser(add_help=False)
2071ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        group = self.ab_mutex_parent.add_mutually_exclusive_group()
2072ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        group.add_argument('-a', action='store_true')
2073ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        group.add_argument('-b', action='store_true')
2074ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2075ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.main_program = os.path.basename(sys.argv[0])
2076ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2077ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_single_parent(self):
2078ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser = ErrorRaisingArgumentParser(parents=[self.wxyz_parent])
2079ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(parser.parse_args('-y 1 2 --w 3'.split()),
2080ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                         NS(w='3', y='1', z='2'))
2081ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2082ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_single_parent_mutex(self):
2083ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self._test_mutex_ab(self.ab_mutex_parent.parse_args)
2084ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser = ErrorRaisingArgumentParser(parents=[self.ab_mutex_parent])
2085ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self._test_mutex_ab(parser.parse_args)
2086ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2087ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_single_granparent_mutex(self):
2088ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parents = [self.ab_mutex_parent]
2089ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser = ErrorRaisingArgumentParser(add_help=False, parents=parents)
2090ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser = ErrorRaisingArgumentParser(parents=[parser])
2091ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self._test_mutex_ab(parser.parse_args)
2092ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2093ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def _test_mutex_ab(self, parse_args):
2094ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(parse_args([]), NS(a=False, b=False))
2095ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(parse_args(['-a']), NS(a=True, b=False))
2096ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(parse_args(['-b']), NS(a=False, b=True))
2097ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertArgumentParserError(parse_args, ['-a', '-b'])
2098ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertArgumentParserError(parse_args, ['-b', '-a'])
2099ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertArgumentParserError(parse_args, ['-c'])
2100ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertArgumentParserError(parse_args, ['-a', '-c'])
2101ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertArgumentParserError(parse_args, ['-b', '-c'])
2102ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2103ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_multiple_parents(self):
2104ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parents = [self.abcd_parent, self.wxyz_parent]
2105ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser = ErrorRaisingArgumentParser(parents=parents)
2106ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(parser.parse_args('--d 1 --w 2 3 4'.split()),
2107ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                         NS(a='3', b=None, d='1', w='2', y=None, z='4'))
2108ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2109ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_multiple_parents_mutex(self):
2110ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parents = [self.ab_mutex_parent, self.wxyz_parent]
2111ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser = ErrorRaisingArgumentParser(parents=parents)
2112ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(parser.parse_args('-a --w 2 3'.split()),
2113ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                         NS(a=True, b=False, w='2', y=None, z='3'))
2114ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertArgumentParserError(
2115ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            parser.parse_args, '-a --w 2 3 -b'.split())
2116ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertArgumentParserError(
2117ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            parser.parse_args, '-a -b --w 2 3'.split())
2118ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2119ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_conflicting_parents(self):
2120ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertRaises(
2121ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            argparse.ArgumentError,
2122ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            argparse.ArgumentParser,
2123ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            parents=[self.w_parent, self.wxyz_parent])
2124ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2125ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_conflicting_parents_mutex(self):
2126ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertRaises(
2127ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            argparse.ArgumentError,
2128ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            argparse.ArgumentParser,
2129ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            parents=[self.abcd_parent, self.ab_mutex_parent])
2130ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2131ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_same_argument_name_parents(self):
2132ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parents = [self.wxyz_parent, self.z_parent]
2133ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser = ErrorRaisingArgumentParser(parents=parents)
2134ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(parser.parse_args('1 2'.split()),
2135ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                         NS(w=None, y=None, z='2'))
2136ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2137ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_subparser_parents(self):
2138ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser = ErrorRaisingArgumentParser()
2139ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        subparsers = parser.add_subparsers()
2140ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        abcde_parser = subparsers.add_parser('bar', parents=[self.abcd_parent])
2141ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        abcde_parser.add_argument('e')
2142ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(parser.parse_args('bar -b 1 --d 2 3 4'.split()),
2143ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                         NS(a='3', b='1', d='2', e='4'))
2144ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2145ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_subparser_parents_mutex(self):
2146ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser = ErrorRaisingArgumentParser()
2147ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        subparsers = parser.add_subparsers()
2148ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parents = [self.ab_mutex_parent]
2149ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        abc_parser = subparsers.add_parser('foo', parents=parents)
2150ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        c_group = abc_parser.add_argument_group('c_group')
2151ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        c_group.add_argument('c')
2152ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parents = [self.wxyz_parent, self.ab_mutex_parent]
2153ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        wxyzabe_parser = subparsers.add_parser('bar', parents=parents)
2154ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        wxyzabe_parser.add_argument('e')
2155ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(parser.parse_args('foo -a 4'.split()),
2156ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                         NS(a=True, b=False, c='4'))
2157ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(parser.parse_args('bar -b  --w 2 3 4'.split()),
2158ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                         NS(a=False, b=True, w='2', y=None, z='3', e='4'))
2159ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertArgumentParserError(
2160ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            parser.parse_args, 'foo -a -b 4'.split())
2161ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertArgumentParserError(
2162ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            parser.parse_args, 'bar -b -a 4'.split())
2163ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2164ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_parent_help(self):
2165ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parents = [self.abcd_parent, self.wxyz_parent]
2166ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser = ErrorRaisingArgumentParser(parents=parents)
2167ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser_help = parser.format_help()
2168ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        progname = self.main_program
2169ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(parser_help, textwrap.dedent('''\
2170ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            usage: {}{}[-h] [-b B] [--d D] [--w W] [-y Y] a z
2171ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2172ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            positional arguments:
2173ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh              a
2174ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh              z
2175ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2176ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            optional arguments:
2177ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh              -h, --help  show this help message and exit
2178ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh              -b B
2179ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh              --w W
2180ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2181ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            c:
2182ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh              --d D
2183ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2184ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            x:
2185ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh              -y Y
2186ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''.format(progname, ' ' if progname else '' )))
2187ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2188ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_groups_parents(self):
2189ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parent = ErrorRaisingArgumentParser(add_help=False)
2190ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        g = parent.add_argument_group(title='g', description='gd')
2191ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        g.add_argument('-w')
2192ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        g.add_argument('-x')
2193ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        m = parent.add_mutually_exclusive_group()
2194ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        m.add_argument('-y')
2195ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        m.add_argument('-z')
2196ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser = ErrorRaisingArgumentParser(parents=[parent])
2197ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2198ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertRaises(ArgumentParserError, parser.parse_args,
2199ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            ['-y', 'Y', '-z', 'Z'])
2200ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2201ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser_help = parser.format_help()
2202ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        progname = self.main_program
2203ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(parser_help, textwrap.dedent('''\
2204ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            usage: {}{}[-h] [-w W] [-x X] [-y Y | -z Z]
2205ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2206ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            optional arguments:
2207ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh              -h, --help  show this help message and exit
2208ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh              -y Y
2209ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh              -z Z
2210ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2211ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            g:
2212ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh              gd
2213ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2214ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh              -w W
2215ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh              -x X
2216ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''.format(progname, ' ' if progname else '' )))
2217ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2218ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# ==============================
2219ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# Mutually exclusive group tests
2220ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# ==============================
2221ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2222ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestMutuallyExclusiveGroupErrors(TestCase):
2223ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2224ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_invalid_add_argument_group(self):
2225ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser = ErrorRaisingArgumentParser()
2226ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        raises = self.assertRaises
2227ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        raises(TypeError, parser.add_mutually_exclusive_group, title='foo')
2228ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2229ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_invalid_add_argument(self):
2230ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser = ErrorRaisingArgumentParser()
2231ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        group = parser.add_mutually_exclusive_group()
2232ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        add_argument = group.add_argument
2233ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        raises = self.assertRaises
2234ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        raises(ValueError, add_argument, '--foo', required=True)
2235ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        raises(ValueError, add_argument, 'bar')
2236ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        raises(ValueError, add_argument, 'bar', nargs='+')
2237ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        raises(ValueError, add_argument, 'bar', nargs=1)
2238ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        raises(ValueError, add_argument, 'bar', nargs=argparse.PARSER)
2239ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2240ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_help(self):
2241ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser = ErrorRaisingArgumentParser(prog='PROG')
2242ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        group1 = parser.add_mutually_exclusive_group()
2243ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        group1.add_argument('--foo', action='store_true')
2244ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        group1.add_argument('--bar', action='store_false')
2245ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        group2 = parser.add_mutually_exclusive_group()
2246ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        group2.add_argument('--soup', action='store_true')
2247ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        group2.add_argument('--nuts', action='store_false')
2248ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        expected = '''\
2249ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            usage: PROG [-h] [--foo | --bar] [--soup | --nuts]
2250ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2251ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            optional arguments:
2252ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh              -h, --help  show this help message and exit
2253ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh              --foo
2254ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh              --bar
2255ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh              --soup
2256ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh              --nuts
2257ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh              '''
2258ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(parser.format_help(), textwrap.dedent(expected))
2259ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2260ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass MEMixin(object):
2261ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2262ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_failures_when_not_required(self):
2263ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parse_args = self.get_parser(required=False).parse_args
2264ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        error = ArgumentParserError
2265ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for args_string in self.failures:
2266ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertRaises(error, parse_args, args_string.split())
2267ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2268ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_failures_when_required(self):
2269ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parse_args = self.get_parser(required=True).parse_args
2270ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        error = ArgumentParserError
2271ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for args_string in self.failures + ['']:
2272ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertRaises(error, parse_args, args_string.split())
2273ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2274ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_successes_when_not_required(self):
2275ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parse_args = self.get_parser(required=False).parse_args
2276ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        successes = self.successes + self.successes_when_not_required
2277ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for args_string, expected_ns in successes:
2278ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            actual_ns = parse_args(args_string.split())
2279ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertEqual(actual_ns, expected_ns)
2280ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2281ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_successes_when_required(self):
2282ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parse_args = self.get_parser(required=True).parse_args
2283ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for args_string, expected_ns in self.successes:
2284ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            actual_ns = parse_args(args_string.split())
2285ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertEqual(actual_ns, expected_ns)
2286ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2287ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_usage_when_not_required(self):
2288ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        format_usage = self.get_parser(required=False).format_usage
2289ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        expected_usage = self.usage_when_not_required
2290ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(format_usage(), textwrap.dedent(expected_usage))
2291ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2292ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_usage_when_required(self):
2293ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        format_usage = self.get_parser(required=True).format_usage
2294ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        expected_usage = self.usage_when_required
2295ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(format_usage(), textwrap.dedent(expected_usage))
2296ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2297ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_help_when_not_required(self):
2298ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        format_help = self.get_parser(required=False).format_help
2299ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        help = self.usage_when_not_required + self.help
2300ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(format_help(), textwrap.dedent(help))
2301ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2302ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_help_when_required(self):
2303ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        format_help = self.get_parser(required=True).format_help
2304ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        help = self.usage_when_required + self.help
2305ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(format_help(), textwrap.dedent(help))
2306ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2307ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2308ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestMutuallyExclusiveSimple(MEMixin, TestCase):
2309ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2310ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def get_parser(self, required=None):
2311ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser = ErrorRaisingArgumentParser(prog='PROG')
2312ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        group = parser.add_mutually_exclusive_group(required=required)
2313ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        group.add_argument('--bar', help='bar help')
2314ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        group.add_argument('--baz', nargs='?', const='Z', help='baz help')
2315ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        return parser
2316ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2317ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['--bar X --baz Y', '--bar X --baz']
2318ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
2319ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('--bar X', NS(bar='X', baz=None)),
2320ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('--bar X --bar Z', NS(bar='Z', baz=None)),
2321ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('--baz Y', NS(bar=None, baz='Y')),
2322ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('--baz', NS(bar=None, baz='Z')),
2323ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
2324ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes_when_not_required = [
2325ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('', NS(bar=None, baz=None)),
2326ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
2327ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2328ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    usage_when_not_required = '''\
2329ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        usage: PROG [-h] [--bar BAR | --baz [BAZ]]
2330ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
2331ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    usage_when_required = '''\
2332ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        usage: PROG [-h] (--bar BAR | --baz [BAZ])
2333ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
2334ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    help = '''\
2335ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2336ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        optional arguments:
2337ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -h, --help   show this help message and exit
2338ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          --bar BAR    bar help
2339ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          --baz [BAZ]  baz help
2340ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
2341ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2342ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2343ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestMutuallyExclusiveLong(MEMixin, TestCase):
2344ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2345ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def get_parser(self, required=None):
2346ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser = ErrorRaisingArgumentParser(prog='PROG')
2347ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser.add_argument('--abcde', help='abcde help')
2348ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser.add_argument('--fghij', help='fghij help')
2349ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        group = parser.add_mutually_exclusive_group(required=required)
2350ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        group.add_argument('--klmno', help='klmno help')
2351ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        group.add_argument('--pqrst', help='pqrst help')
2352ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        return parser
2353ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2354ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['--klmno X --pqrst Y']
2355ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
2356ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('--klmno X', NS(abcde=None, fghij=None, klmno='X', pqrst=None)),
2357ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('--abcde Y --klmno X',
2358ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            NS(abcde='Y', fghij=None, klmno='X', pqrst=None)),
2359ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('--pqrst X', NS(abcde=None, fghij=None, klmno=None, pqrst='X')),
2360ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('--pqrst X --fghij Y',
2361ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            NS(abcde=None, fghij='Y', klmno=None, pqrst='X')),
2362ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
2363ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes_when_not_required = [
2364ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('', NS(abcde=None, fghij=None, klmno=None, pqrst=None)),
2365ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
2366ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2367ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    usage_when_not_required = '''\
2368ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    usage: PROG [-h] [--abcde ABCDE] [--fghij FGHIJ]
2369ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                [--klmno KLMNO | --pqrst PQRST]
2370ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    '''
2371ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    usage_when_required = '''\
2372ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    usage: PROG [-h] [--abcde ABCDE] [--fghij FGHIJ]
2373ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                (--klmno KLMNO | --pqrst PQRST)
2374ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    '''
2375ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    help = '''\
2376ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2377ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    optional arguments:
2378ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh      -h, --help     show this help message and exit
2379ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh      --abcde ABCDE  abcde help
2380ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh      --fghij FGHIJ  fghij help
2381ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh      --klmno KLMNO  klmno help
2382ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh      --pqrst PQRST  pqrst help
2383ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    '''
2384ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2385ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2386ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestMutuallyExclusiveFirstSuppressed(MEMixin, TestCase):
2387ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2388ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def get_parser(self, required):
2389ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser = ErrorRaisingArgumentParser(prog='PROG')
2390ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        group = parser.add_mutually_exclusive_group(required=required)
2391ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        group.add_argument('-x', help=argparse.SUPPRESS)
2392ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        group.add_argument('-y', action='store_false', help='y help')
2393ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        return parser
2394ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2395ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['-x X -y']
2396ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
2397ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-x X', NS(x='X', y=True)),
2398ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-x X -x Y', NS(x='Y', y=True)),
2399ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-y', NS(x=None, y=False)),
2400ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
2401ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes_when_not_required = [
2402ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('', NS(x=None, y=True)),
2403ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
2404ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2405ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    usage_when_not_required = '''\
2406ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        usage: PROG [-h] [-y]
2407ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
2408ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    usage_when_required = '''\
2409ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        usage: PROG [-h] -y
2410ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
2411ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    help = '''\
2412ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2413ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        optional arguments:
2414ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -h, --help  show this help message and exit
2415ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -y          y help
2416ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
2417ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2418ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2419ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestMutuallyExclusiveManySuppressed(MEMixin, TestCase):
2420ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2421ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def get_parser(self, required):
2422ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser = ErrorRaisingArgumentParser(prog='PROG')
2423ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        group = parser.add_mutually_exclusive_group(required=required)
2424ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        add = group.add_argument
2425ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        add('--spam', action='store_true', help=argparse.SUPPRESS)
2426ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        add('--badger', action='store_false', help=argparse.SUPPRESS)
2427ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        add('--bladder', help=argparse.SUPPRESS)
2428ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        return parser
2429ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2430ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = [
2431ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '--spam --badger',
2432ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '--badger --bladder B',
2433ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '--bladder B --spam',
2434ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
2435ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
2436ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('--spam', NS(spam=True, badger=True, bladder=None)),
2437ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('--badger', NS(spam=False, badger=False, bladder=None)),
2438ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('--bladder B', NS(spam=False, badger=True, bladder='B')),
2439ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('--spam --spam', NS(spam=True, badger=True, bladder=None)),
2440ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
2441ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes_when_not_required = [
2442ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('', NS(spam=False, badger=True, bladder=None)),
2443ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
2444ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2445ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    usage_when_required = usage_when_not_required = '''\
2446ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        usage: PROG [-h]
2447ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
2448ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    help = '''\
2449ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2450ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        optional arguments:
2451ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -h, --help  show this help message and exit
2452ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
2453ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2454ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2455ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestMutuallyExclusiveOptionalAndPositional(MEMixin, TestCase):
2456ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2457ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def get_parser(self, required):
2458ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser = ErrorRaisingArgumentParser(prog='PROG')
2459ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        group = parser.add_mutually_exclusive_group(required=required)
2460ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        group.add_argument('--foo', action='store_true', help='FOO')
2461ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        group.add_argument('--spam', help='SPAM')
2462ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        group.add_argument('badger', nargs='*', default='X', help='BADGER')
2463ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        return parser
2464ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2465ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = [
2466ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '--foo --spam S',
2467ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '--spam S X',
2468ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        'X --foo',
2469ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        'X Y Z --spam S',
2470ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '--foo X Y',
2471ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
2472ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
2473ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('--foo', NS(foo=True, spam=None, badger='X')),
2474ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('--spam S', NS(foo=False, spam='S', badger='X')),
2475ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('X', NS(foo=False, spam=None, badger=['X'])),
2476ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('X Y Z', NS(foo=False, spam=None, badger=['X', 'Y', 'Z'])),
2477ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
2478ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes_when_not_required = [
2479ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('', NS(foo=False, spam=None, badger='X')),
2480ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
2481ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2482ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    usage_when_not_required = '''\
2483ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        usage: PROG [-h] [--foo | --spam SPAM | badger [badger ...]]
2484ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
2485ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    usage_when_required = '''\
2486ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        usage: PROG [-h] (--foo | --spam SPAM | badger [badger ...])
2487ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
2488ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    help = '''\
2489ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2490ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        positional arguments:
2491ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          badger       BADGER
2492ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2493ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        optional arguments:
2494ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -h, --help   show this help message and exit
2495ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          --foo        FOO
2496ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          --spam SPAM  SPAM
2497ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
2498ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2499ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2500ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestMutuallyExclusiveOptionalsMixed(MEMixin, TestCase):
2501ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2502ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def get_parser(self, required):
2503ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser = ErrorRaisingArgumentParser(prog='PROG')
2504ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser.add_argument('-x', action='store_true', help='x help')
2505ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        group = parser.add_mutually_exclusive_group(required=required)
2506ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        group.add_argument('-a', action='store_true', help='a help')
2507ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        group.add_argument('-b', action='store_true', help='b help')
2508ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser.add_argument('-y', action='store_true', help='y help')
2509ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        group.add_argument('-c', action='store_true', help='c help')
2510ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        return parser
2511ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2512ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['-a -b', '-b -c', '-a -c', '-a -b -c']
2513ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
2514ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-a', NS(a=True, b=False, c=False, x=False, y=False)),
2515ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-b', NS(a=False, b=True, c=False, x=False, y=False)),
2516ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-c', NS(a=False, b=False, c=True, x=False, y=False)),
2517ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-a -x', NS(a=True, b=False, c=False, x=True, y=False)),
2518ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-y -b', NS(a=False, b=True, c=False, x=False, y=True)),
2519ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-x -y -c', NS(a=False, b=False, c=True, x=True, y=True)),
2520ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
2521ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes_when_not_required = [
2522ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('', NS(a=False, b=False, c=False, x=False, y=False)),
2523ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-x', NS(a=False, b=False, c=False, x=True, y=False)),
2524ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('-y', NS(a=False, b=False, c=False, x=False, y=True)),
2525ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
2526ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2527ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    usage_when_required = usage_when_not_required = '''\
2528ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        usage: PROG [-h] [-x] [-a] [-b] [-y] [-c]
2529ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
2530ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    help = '''\
2531ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2532ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        optional arguments:
2533ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -h, --help  show this help message and exit
2534ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -x          x help
2535ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -a          a help
2536ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -b          b help
2537ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -y          y help
2538ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -c          c help
2539ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
2540ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2541ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2542ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestMutuallyExclusiveInGroup(MEMixin, TestCase):
2543ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2544ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def get_parser(self, required=None):
2545ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser = ErrorRaisingArgumentParser(prog='PROG')
2546ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        titled_group = parser.add_argument_group(
2547ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            title='Titled group', description='Group description')
2548ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        mutex_group = \
2549ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            titled_group.add_mutually_exclusive_group(required=required)
2550ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        mutex_group.add_argument('--bar', help='bar help')
2551ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        mutex_group.add_argument('--baz', help='baz help')
2552ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        return parser
2553ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2554ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['--bar X --baz Y', '--baz X --bar Y']
2555ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
2556ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('--bar X', NS(bar='X', baz=None)),
2557ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('--baz Y', NS(bar=None, baz='Y')),
2558ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
2559ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes_when_not_required = [
2560ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('', NS(bar=None, baz=None)),
2561ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
2562ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2563ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    usage_when_not_required = '''\
2564ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        usage: PROG [-h] [--bar BAR | --baz BAZ]
2565ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
2566ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    usage_when_required = '''\
2567ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        usage: PROG [-h] (--bar BAR | --baz BAZ)
2568ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
2569ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    help = '''\
2570ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2571ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        optional arguments:
2572ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -h, --help  show this help message and exit
2573ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2574ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Titled group:
2575ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          Group description
2576ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2577ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          --bar BAR   bar help
2578ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          --baz BAZ   baz help
2579ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
2580ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2581ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2582ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestMutuallyExclusiveOptionalsAndPositionalsMixed(MEMixin, TestCase):
2583ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2584ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def get_parser(self, required):
2585ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser = ErrorRaisingArgumentParser(prog='PROG')
2586ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser.add_argument('x', help='x help')
2587ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser.add_argument('-y', action='store_true', help='y help')
2588ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        group = parser.add_mutually_exclusive_group(required=required)
2589ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        group.add_argument('a', nargs='?', help='a help')
2590ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        group.add_argument('-b', action='store_true', help='b help')
2591ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        group.add_argument('-c', action='store_true', help='c help')
2592ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        return parser
2593ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2594ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    failures = ['X A -b', '-b -c', '-c X A']
2595ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes = [
2596ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('X A', NS(a='A', b=False, c=False, x='X', y=False)),
2597ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('X -b', NS(a=None, b=True, c=False, x='X', y=False)),
2598ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('X -c', NS(a=None, b=False, c=True, x='X', y=False)),
2599ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('X A -y', NS(a='A', b=False, c=False, x='X', y=True)),
2600ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('X -y -b', NS(a=None, b=True, c=False, x='X', y=True)),
2601ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
2602ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    successes_when_not_required = [
2603ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('X', NS(a=None, b=False, c=False, x='X', y=False)),
2604ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ('X -y', NS(a=None, b=False, c=False, x='X', y=True)),
2605ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
2606ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2607ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    usage_when_required = usage_when_not_required = '''\
2608ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        usage: PROG [-h] [-y] [-b] [-c] x [a]
2609ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
2610ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    help = '''\
2611ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2612ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        positional arguments:
2613ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          x           x help
2614ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          a           a help
2615ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2616ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        optional arguments:
2617ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -h, --help  show this help message and exit
2618ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -y          y help
2619ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -b          b help
2620ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -c          c help
2621ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
2622ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2623ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# =================================================
2624ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# Mutually exclusive group in parent parser tests
2625ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# =================================================
2626ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2627ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass MEPBase(object):
2628ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2629ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def get_parser(self, required=None):
2630ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parent = super(MEPBase, self).get_parser(required=required)
2631ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser = ErrorRaisingArgumentParser(
2632ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            prog=parent.prog, add_help=False, parents=[parent])
2633ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        return parser
2634ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2635ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2636ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestMutuallyExclusiveGroupErrorsParent(
2637ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    MEPBase, TestMutuallyExclusiveGroupErrors):
2638ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    pass
2639ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2640ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2641ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestMutuallyExclusiveSimpleParent(
2642ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    MEPBase, TestMutuallyExclusiveSimple):
2643ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    pass
2644ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2645ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2646ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestMutuallyExclusiveLongParent(
2647ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    MEPBase, TestMutuallyExclusiveLong):
2648ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    pass
2649ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2650ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2651ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestMutuallyExclusiveFirstSuppressedParent(
2652ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    MEPBase, TestMutuallyExclusiveFirstSuppressed):
2653ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    pass
2654ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2655ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2656ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestMutuallyExclusiveManySuppressedParent(
2657ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    MEPBase, TestMutuallyExclusiveManySuppressed):
2658ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    pass
2659ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2660ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2661ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestMutuallyExclusiveOptionalAndPositionalParent(
2662ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    MEPBase, TestMutuallyExclusiveOptionalAndPositional):
2663ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    pass
2664ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2665ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2666ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestMutuallyExclusiveOptionalsMixedParent(
2667ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    MEPBase, TestMutuallyExclusiveOptionalsMixed):
2668ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    pass
2669ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2670ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2671ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestMutuallyExclusiveOptionalsAndPositionalsMixedParent(
2672ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    MEPBase, TestMutuallyExclusiveOptionalsAndPositionalsMixed):
2673ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    pass
2674ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2675ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# =================
2676ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# Set default tests
2677ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# =================
2678ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2679ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestSetDefaults(TestCase):
2680ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2681ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_set_defaults_no_args(self):
2682ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser = ErrorRaisingArgumentParser()
2683ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser.set_defaults(x='foo')
2684ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser.set_defaults(y='bar', z=1)
2685ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(NS(x='foo', y='bar', z=1),
2686ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                         parser.parse_args([]))
2687ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(NS(x='foo', y='bar', z=1),
2688ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                         parser.parse_args([], NS()))
2689ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(NS(x='baz', y='bar', z=1),
2690ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                         parser.parse_args([], NS(x='baz')))
2691ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(NS(x='baz', y='bar', z=2),
2692ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                         parser.parse_args([], NS(x='baz', z=2)))
2693ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2694ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_set_defaults_with_args(self):
2695ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser = ErrorRaisingArgumentParser()
2696ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser.set_defaults(x='foo', y='bar')
2697ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser.add_argument('-x', default='xfoox')
2698ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(NS(x='xfoox', y='bar'),
2699ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                         parser.parse_args([]))
2700ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(NS(x='xfoox', y='bar'),
2701ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                         parser.parse_args([], NS()))
2702ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(NS(x='baz', y='bar'),
2703ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                         parser.parse_args([], NS(x='baz')))
2704ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(NS(x='1', y='bar'),
2705ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                         parser.parse_args('-x 1'.split()))
2706ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(NS(x='1', y='bar'),
2707ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                         parser.parse_args('-x 1'.split(), NS()))
2708ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(NS(x='1', y='bar'),
2709ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                         parser.parse_args('-x 1'.split(), NS(x='baz')))
2710ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2711ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_set_defaults_subparsers(self):
2712ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser = ErrorRaisingArgumentParser()
2713ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser.set_defaults(x='foo')
2714ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        subparsers = parser.add_subparsers()
2715ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser_a = subparsers.add_parser('a')
2716ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser_a.set_defaults(y='bar')
2717ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(NS(x='foo', y='bar'),
2718ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                         parser.parse_args('a'.split()))
2719ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2720ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_set_defaults_parents(self):
2721ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parent = ErrorRaisingArgumentParser(add_help=False)
2722ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parent.set_defaults(x='foo')
2723ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser = ErrorRaisingArgumentParser(parents=[parent])
2724ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(NS(x='foo'), parser.parse_args([]))
2725ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2726ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_set_defaults_same_as_add_argument(self):
2727ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser = ErrorRaisingArgumentParser()
2728ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser.set_defaults(w='W', x='X', y='Y', z='Z')
2729ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser.add_argument('-w')
2730ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser.add_argument('-x', default='XX')
2731ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser.add_argument('y', nargs='?')
2732ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser.add_argument('z', nargs='?', default='ZZ')
2733ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2734ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # defaults set previously
2735ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(NS(w='W', x='XX', y='Y', z='ZZ'),
2736ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                         parser.parse_args([]))
2737ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2738ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # reset defaults
2739ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser.set_defaults(w='WW', x='X', y='YY', z='Z')
2740ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(NS(w='WW', x='X', y='YY', z='Z'),
2741ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                         parser.parse_args([]))
2742ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2743ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_set_defaults_same_as_add_argument_group(self):
2744ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser = ErrorRaisingArgumentParser()
2745ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser.set_defaults(w='W', x='X', y='Y', z='Z')
2746ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        group = parser.add_argument_group('foo')
2747ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        group.add_argument('-w')
2748ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        group.add_argument('-x', default='XX')
2749ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        group.add_argument('y', nargs='?')
2750ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        group.add_argument('z', nargs='?', default='ZZ')
2751ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2752ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2753ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # defaults set previously
2754ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(NS(w='W', x='XX', y='Y', z='ZZ'),
2755ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                         parser.parse_args([]))
2756ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2757ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # reset defaults
2758ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser.set_defaults(w='WW', x='X', y='YY', z='Z')
2759ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(NS(w='WW', x='X', y='YY', z='Z'),
2760ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                         parser.parse_args([]))
2761ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2762ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# =================
2763ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# Get default tests
2764ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# =================
2765ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2766ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestGetDefault(TestCase):
2767ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2768ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_get_default(self):
2769ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser = ErrorRaisingArgumentParser()
2770ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(None, parser.get_default("foo"))
2771ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(None, parser.get_default("bar"))
2772ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2773ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser.add_argument("--foo")
2774ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(None, parser.get_default("foo"))
2775ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(None, parser.get_default("bar"))
2776ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2777ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser.add_argument("--bar", type=int, default=42)
2778ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(None, parser.get_default("foo"))
2779ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(42, parser.get_default("bar"))
2780ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2781ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser.set_defaults(foo="badger")
2782ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual("badger", parser.get_default("foo"))
2783ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(42, parser.get_default("bar"))
2784ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2785ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# ==========================
2786ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# Namespace 'contains' tests
2787ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# ==========================
2788ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2789ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestNamespaceContainsSimple(TestCase):
2790ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2791ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_empty(self):
2792ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ns = argparse.Namespace()
2793ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual('' in ns, False)
2794ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual('' not in ns, True)
2795ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual('x' in ns, False)
2796ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2797ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_non_empty(self):
2798ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ns = argparse.Namespace(x=1, y=2)
2799ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual('x' in ns, True)
2800ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual('x' not in ns, False)
2801ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual('y' in ns, True)
2802ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual('' in ns, False)
2803ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual('xx' in ns, False)
2804ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual('z' in ns, False)
2805ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2806ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# =====================
2807ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# Help formatting tests
2808ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# =====================
2809ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2810ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestHelpFormattingMetaclass(type):
2811ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2812ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def __init__(cls, name, bases, bodydict):
2813ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        if name == 'HelpTestCase':
2814ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            return
2815ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2816ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        class AddTests(object):
2817ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2818ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            def __init__(self, test_class, func_suffix, std_name):
2819ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                self.func_suffix = func_suffix
2820ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                self.std_name = std_name
2821ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2822ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                for test_func in [self.test_format,
2823ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                  self.test_print,
2824ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                  self.test_print_file]:
2825ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    test_name = '%s_%s' % (test_func.__name__, func_suffix)
2826ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2827ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    def test_wrapper(self, test_func=test_func):
2828ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                        test_func(self)
2829ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    try:
2830ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                        test_wrapper.__name__ = test_name
2831ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    except TypeError:
2832ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                        pass
2833ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    setattr(test_class, test_name, test_wrapper)
2834ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2835ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            def _get_parser(self, tester):
2836ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                parser = argparse.ArgumentParser(
2837ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    *tester.parser_signature.args,
2838ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    **tester.parser_signature.kwargs)
2839ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                for argument_sig in getattr(tester, 'argument_signatures', []):
2840ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    parser.add_argument(*argument_sig.args,
2841ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                        **argument_sig.kwargs)
2842ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                group_sigs = getattr(tester, 'argument_group_signatures', [])
2843ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                for group_sig, argument_sigs in group_sigs:
2844ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    group = parser.add_argument_group(*group_sig.args,
2845ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                                      **group_sig.kwargs)
2846ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    for argument_sig in argument_sigs:
2847ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                        group.add_argument(*argument_sig.args,
2848ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                           **argument_sig.kwargs)
2849ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                subparsers_sigs = getattr(tester, 'subparsers_signatures', [])
2850ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                if subparsers_sigs:
2851ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    subparsers = parser.add_subparsers()
2852ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    for subparser_sig in subparsers_sigs:
2853ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                        subparsers.add_parser(*subparser_sig.args,
2854ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                               **subparser_sig.kwargs)
2855ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                return parser
2856ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2857ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            def _test(self, tester, parser_text):
2858ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                expected_text = getattr(tester, self.func_suffix)
2859ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                expected_text = textwrap.dedent(expected_text)
2860ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                if expected_text != parser_text:
2861ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    print(repr(expected_text))
2862ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    print(repr(parser_text))
2863ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    for char1, char2 in zip(expected_text, parser_text):
2864ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                        if char1 != char2:
2865ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                            print('first diff: %r %r' % (char1, char2))
2866ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                            break
2867ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                tester.assertEqual(expected_text, parser_text)
2868ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2869ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            def test_format(self, tester):
2870ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                parser = self._get_parser(tester)
2871ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                format = getattr(parser, 'format_%s' % self.func_suffix)
2872ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                self._test(tester, format())
2873ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2874ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            def test_print(self, tester):
2875ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                parser = self._get_parser(tester)
2876ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                print_ = getattr(parser, 'print_%s' % self.func_suffix)
2877ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                old_stream = getattr(sys, self.std_name)
2878ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                setattr(sys, self.std_name, StdIOBuffer())
2879ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                try:
2880ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    print_()
2881ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    parser_text = getattr(sys, self.std_name).getvalue()
2882ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                finally:
2883ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    setattr(sys, self.std_name, old_stream)
2884ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                self._test(tester, parser_text)
2885ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2886ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            def test_print_file(self, tester):
2887ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                parser = self._get_parser(tester)
2888ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                print_ = getattr(parser, 'print_%s' % self.func_suffix)
2889ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                sfile = StdIOBuffer()
2890ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                print_(sfile)
2891ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                parser_text = sfile.getvalue()
2892ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                self._test(tester, parser_text)
2893ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2894ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # add tests for {format,print}_{usage,help,version}
2895ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for func_suffix, std_name in [('usage', 'stdout'),
2896ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                      ('help', 'stdout'),
2897ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                      ('version', 'stderr')]:
2898ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            AddTests(cls, func_suffix, std_name)
2899ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2900ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehbases = TestCase,
2901ffab958fd8d42ed7227d83007350e61555a1fa36Andrew HsiehHelpTestCase = TestHelpFormattingMetaclass('HelpTestCase', bases, {})
2902ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2903ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2904ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestHelpBiggerOptionals(HelpTestCase):
2905ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Make sure that argument help aligns when options are longer"""
2906ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2907ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    parser_signature = Sig(prog='PROG', description='DESCRIPTION',
2908ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                           epilog='EPILOG', version='0.1')
2909ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [
2910ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('-x', action='store_true', help='X HELP'),
2911ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('--y', help='Y HELP'),
2912ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('foo', help='FOO HELP'),
2913ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('bar', help='BAR HELP'),
2914ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
2915ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_group_signatures = []
2916ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    usage = '''\
2917ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        usage: PROG [-h] [-v] [-x] [--y Y] foo bar
2918ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
2919ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    help = usage + '''\
2920ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2921ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        DESCRIPTION
2922ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2923ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        positional arguments:
2924ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          foo            FOO HELP
2925ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          bar            BAR HELP
2926ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2927ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        optional arguments:
2928ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -h, --help     show this help message and exit
2929ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -v, --version  show program's version number and exit
2930ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -x             X HELP
2931ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          --y Y          Y HELP
2932ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2933ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        EPILOG
2934ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    '''
2935ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    version = '''\
2936ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        0.1
2937ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
2938ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2939ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2940ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestHelpBiggerOptionalGroups(HelpTestCase):
2941ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Make sure that argument help aligns when options are longer"""
2942ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2943ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    parser_signature = Sig(prog='PROG', description='DESCRIPTION',
2944ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                           epilog='EPILOG', version='0.1')
2945ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [
2946ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('-x', action='store_true', help='X HELP'),
2947ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('--y', help='Y HELP'),
2948ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('foo', help='FOO HELP'),
2949ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('bar', help='BAR HELP'),
2950ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
2951ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_group_signatures = [
2952ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        (Sig('GROUP TITLE', description='GROUP DESCRIPTION'), [
2953ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            Sig('baz', help='BAZ HELP'),
2954ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            Sig('-z', nargs='+', help='Z HELP')]),
2955ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
2956ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    usage = '''\
2957ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        usage: PROG [-h] [-v] [-x] [--y Y] [-z Z [Z ...]] foo bar baz
2958ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
2959ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    help = usage + '''\
2960ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2961ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        DESCRIPTION
2962ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2963ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        positional arguments:
2964ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          foo            FOO HELP
2965ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          bar            BAR HELP
2966ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2967ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        optional arguments:
2968ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -h, --help     show this help message and exit
2969ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -v, --version  show program's version number and exit
2970ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -x             X HELP
2971ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          --y Y          Y HELP
2972ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2973ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        GROUP TITLE:
2974ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          GROUP DESCRIPTION
2975ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2976ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          baz            BAZ HELP
2977ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -z Z [Z ...]   Z HELP
2978ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2979ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        EPILOG
2980ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    '''
2981ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    version = '''\
2982ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        0.1
2983ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
2984ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2985ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2986ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestHelpBiggerPositionals(HelpTestCase):
2987ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Make sure that help aligns when arguments are longer"""
2988ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
2989ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    parser_signature = Sig(usage='USAGE', description='DESCRIPTION')
2990ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [
2991ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('-x', action='store_true', help='X HELP'),
2992ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('--y', help='Y HELP'),
2993ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('ekiekiekifekang', help='EKI HELP'),
2994ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('bar', help='BAR HELP'),
2995ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
2996ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_group_signatures = []
2997ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    usage = '''\
2998ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        usage: USAGE
2999ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
3000ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    help = usage + '''\
3001ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3002ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        DESCRIPTION
3003ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3004ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        positional arguments:
3005ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          ekiekiekifekang  EKI HELP
3006ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          bar              BAR HELP
3007ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3008ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        optional arguments:
3009ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -h, --help       show this help message and exit
3010ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -x               X HELP
3011ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          --y Y            Y HELP
3012ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
3013ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3014ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    version = ''
3015ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3016ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3017ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestHelpReformatting(HelpTestCase):
3018ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Make sure that text after short names starts on the first line"""
3019ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3020ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    parser_signature = Sig(
3021ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        prog='PROG',
3022ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        description='   oddly    formatted\n'
3023ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    'description\n'
3024ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    '\n'
3025ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    'that is so long that it should go onto multiple '
3026ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    'lines when wrapped')
3027ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [
3028ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('-x', metavar='XX', help='oddly\n'
3029ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                     '    formatted -x help'),
3030ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('y', metavar='yyy', help='normal y help'),
3031ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
3032ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_group_signatures = [
3033ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        (Sig('title', description='\n'
3034ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                  '    oddly formatted group\n'
3035ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                  '\n'
3036ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                  'description'),
3037ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh         [Sig('-a', action='store_true',
3038ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh              help=' oddly \n'
3039ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                   'formatted    -a  help  \n'
3040ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                   '    again, so long that it should be wrapped over '
3041ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                   'multiple lines')]),
3042ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
3043ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    usage = '''\
3044ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        usage: PROG [-h] [-x XX] [-a] yyy
3045ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
3046ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    help = usage + '''\
3047ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3048ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        oddly formatted description that is so long that it should go onto \
3049ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehmultiple
3050ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        lines when wrapped
3051ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3052ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        positional arguments:
3053ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          yyy         normal y help
3054ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3055ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        optional arguments:
3056ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -h, --help  show this help message and exit
3057ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -x XX       oddly formatted -x help
3058ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3059ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        title:
3060ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          oddly formatted group description
3061ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3062ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -a          oddly formatted -a help again, so long that it should \
3063ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehbe wrapped
3064ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                      over multiple lines
3065ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
3066ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    version = ''
3067ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3068ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3069ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestHelpWrappingShortNames(HelpTestCase):
3070ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Make sure that text after short names starts on the first line"""
3071ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3072ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    parser_signature = Sig(prog='PROG', description= 'D\nD' * 30)
3073ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [
3074ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('-x', metavar='XX', help='XHH HX' * 20),
3075ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('y', metavar='yyy', help='YH YH' * 20),
3076ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
3077ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_group_signatures = [
3078ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        (Sig('ALPHAS'), [
3079ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            Sig('-a', action='store_true', help='AHHH HHA' * 10)]),
3080ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
3081ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    usage = '''\
3082ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        usage: PROG [-h] [-x XX] [-a] yyy
3083ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
3084ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    help = usage + '''\
3085ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3086ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        D DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD \
3087ffab958fd8d42ed7227d83007350e61555a1fa36Andrew HsiehDD DD DD
3088ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        DD DD DD DD D
3089ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3090ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        positional arguments:
3091ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          yyy         YH YHYH YHYH YHYH YHYH YHYH YHYH YHYH YHYH YHYH YHYH \
3092ffab958fd8d42ed7227d83007350e61555a1fa36Andrew HsiehYHYH YHYH
3093ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                      YHYH YHYH YHYH YHYH YHYH YHYH YHYH YH
3094ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3095ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        optional arguments:
3096ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -h, --help  show this help message and exit
3097ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -x XX       XHH HXXHH HXXHH HXXHH HXXHH HXXHH HXXHH HXXHH HXXHH \
3098ffab958fd8d42ed7227d83007350e61555a1fa36Andrew HsiehHXXHH HXXHH
3099ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                      HXXHH HXXHH HXXHH HXXHH HXXHH HXXHH HXXHH HXXHH HXXHH HX
3100ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3101ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ALPHAS:
3102ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -a          AHHH HHAAHHH HHAAHHH HHAAHHH HHAAHHH HHAAHHH HHAAHHH \
3103ffab958fd8d42ed7227d83007350e61555a1fa36Andrew HsiehHHAAHHH
3104ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                      HHAAHHH HHAAHHH HHA
3105ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
3106ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    version = ''
3107ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3108ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3109ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestHelpWrappingLongNames(HelpTestCase):
3110ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Make sure that text after long names starts on the next line"""
3111ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3112ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    parser_signature = Sig(usage='USAGE', description= 'D D' * 30,
3113ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                           version='V V'*30)
3114ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [
3115ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('-x', metavar='X' * 25, help='XH XH' * 20),
3116ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('y', metavar='y' * 25, help='YH YH' * 20),
3117ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
3118ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_group_signatures = [
3119ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        (Sig('ALPHAS'), [
3120ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            Sig('-a', metavar='A' * 25, help='AH AH' * 20),
3121ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            Sig('z', metavar='z' * 25, help='ZH ZH' * 20)]),
3122ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
3123ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    usage = '''\
3124ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        usage: USAGE
3125ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
3126ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    help = usage + '''\
3127ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3128ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        D DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD \
3129ffab958fd8d42ed7227d83007350e61555a1fa36Andrew HsiehDD DD DD
3130ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        DD DD DD DD D
3131ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3132ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        positional arguments:
3133ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          yyyyyyyyyyyyyyyyyyyyyyyyy
3134ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                YH YHYH YHYH YHYH YHYH YHYH YHYH YHYH YHYH \
3135ffab958fd8d42ed7227d83007350e61555a1fa36Andrew HsiehYHYH YHYH
3136ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                YHYH YHYH YHYH YHYH YHYH YHYH YHYH YHYH YHYH YH
3137ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3138ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        optional arguments:
3139ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -h, --help            show this help message and exit
3140ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -v, --version         show program's version number and exit
3141ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -x XXXXXXXXXXXXXXXXXXXXXXXXX
3142ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                XH XHXH XHXH XHXH XHXH XHXH XHXH XHXH XHXH \
3143ffab958fd8d42ed7227d83007350e61555a1fa36Andrew HsiehXHXH XHXH
3144ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                XHXH XHXH XHXH XHXH XHXH XHXH XHXH XHXH XHXH XH
3145ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3146ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ALPHAS:
3147ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -a AAAAAAAAAAAAAAAAAAAAAAAAA
3148ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                AH AHAH AHAH AHAH AHAH AHAH AHAH AHAH AHAH \
3149ffab958fd8d42ed7227d83007350e61555a1fa36Andrew HsiehAHAH AHAH
3150ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                AHAH AHAH AHAH AHAH AHAH AHAH AHAH AHAH AHAH AH
3151ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          zzzzzzzzzzzzzzzzzzzzzzzzz
3152ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                ZH ZHZH ZHZH ZHZH ZHZH ZHZH ZHZH ZHZH ZHZH \
3153ffab958fd8d42ed7227d83007350e61555a1fa36Andrew HsiehZHZH ZHZH
3154ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                ZHZH ZHZH ZHZH ZHZH ZHZH ZHZH ZHZH ZHZH ZHZH ZH
3155ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
3156ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    version = '''\
3157ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        V VV VV VV VV VV VV VV VV VV VV VV VV VV VV VV VV VV VV VV VV VV VV \
3158ffab958fd8d42ed7227d83007350e61555a1fa36Andrew HsiehVV VV VV
3159ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        VV VV VV VV V
3160ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
3161ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3162ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3163ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestHelpUsage(HelpTestCase):
3164ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test basic usage messages"""
3165ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3166ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    parser_signature = Sig(prog='PROG')
3167ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [
3168ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('-w', nargs='+', help='w'),
3169ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('-x', nargs='*', help='x'),
3170ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('a', help='a'),
3171ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('b', help='b', nargs=2),
3172ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('c', help='c', nargs='?'),
3173ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
3174ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_group_signatures = [
3175ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        (Sig('group'), [
3176ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            Sig('-y', nargs='?', help='y'),
3177ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            Sig('-z', nargs=3, help='z'),
3178ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            Sig('d', help='d', nargs='*'),
3179ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            Sig('e', help='e', nargs='+'),
3180ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ])
3181ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
3182ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    usage = '''\
3183ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        usage: PROG [-h] [-w W [W ...]] [-x [X [X ...]]] [-y [Y]] [-z Z Z Z]
3184ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    a b b [c] [d [d ...]] e [e ...]
3185ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
3186ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    help = usage + '''\
3187ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3188ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        positional arguments:
3189ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          a               a
3190ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          b               b
3191ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          c               c
3192ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3193ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        optional arguments:
3194ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -h, --help      show this help message and exit
3195ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -w W [W ...]    w
3196ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -x [X [X ...]]  x
3197ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3198ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        group:
3199ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -y [Y]          y
3200ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -z Z Z Z        z
3201ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          d               d
3202ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          e               e
3203ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
3204ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    version = ''
3205ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3206ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3207ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestHelpOnlyUserGroups(HelpTestCase):
3208ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test basic usage messages"""
3209ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3210ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    parser_signature = Sig(prog='PROG', add_help=False)
3211ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = []
3212ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_group_signatures = [
3213ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        (Sig('xxxx'), [
3214ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            Sig('-x', help='x'),
3215ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            Sig('a', help='a'),
3216ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ]),
3217ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        (Sig('yyyy'), [
3218ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            Sig('b', help='b'),
3219ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            Sig('-y', help='y'),
3220ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ]),
3221ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
3222ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    usage = '''\
3223ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        usage: PROG [-x X] [-y Y] a b
3224ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
3225ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    help = usage + '''\
3226ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3227ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        xxxx:
3228ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -x X  x
3229ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          a     a
3230ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3231ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        yyyy:
3232ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          b     b
3233ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -y Y  y
3234ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
3235ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    version = ''
3236ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3237ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3238ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestHelpUsageLongProg(HelpTestCase):
3239ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test usage messages where the prog is long"""
3240ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3241ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    parser_signature = Sig(prog='P' * 60)
3242ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [
3243ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('-w', metavar='W'),
3244ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('-x', metavar='X'),
3245ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('a'),
3246ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('b'),
3247ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
3248ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_group_signatures = []
3249ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    usage = '''\
3250ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        usage: PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
3251ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh               [-h] [-w W] [-x X] a b
3252ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
3253ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    help = usage + '''\
3254ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3255ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        positional arguments:
3256ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          a
3257ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          b
3258ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3259ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        optional arguments:
3260ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -h, --help  show this help message and exit
3261ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -w W
3262ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -x X
3263ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
3264ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    version = ''
3265ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3266ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3267ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestHelpUsageLongProgOptionsWrap(HelpTestCase):
3268ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test usage messages where the prog is long and the optionals wrap"""
3269ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3270ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    parser_signature = Sig(prog='P' * 60)
3271ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [
3272ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('-w', metavar='W' * 25),
3273ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('-x', metavar='X' * 25),
3274ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('-y', metavar='Y' * 25),
3275ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('-z', metavar='Z' * 25),
3276ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('a'),
3277ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('b'),
3278ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
3279ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_group_signatures = []
3280ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    usage = '''\
3281ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        usage: PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
3282ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh               [-h] [-w WWWWWWWWWWWWWWWWWWWWWWWWW] \
3283ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh[-x XXXXXXXXXXXXXXXXXXXXXXXXX]
3284ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh               [-y YYYYYYYYYYYYYYYYYYYYYYYYY] [-z ZZZZZZZZZZZZZZZZZZZZZZZZZ]
3285ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh               a b
3286ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
3287ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    help = usage + '''\
3288ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3289ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        positional arguments:
3290ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          a
3291ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          b
3292ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3293ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        optional arguments:
3294ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -h, --help            show this help message and exit
3295ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -w WWWWWWWWWWWWWWWWWWWWWWWWW
3296ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -x XXXXXXXXXXXXXXXXXXXXXXXXX
3297ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -y YYYYYYYYYYYYYYYYYYYYYYYYY
3298ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -z ZZZZZZZZZZZZZZZZZZZZZZZZZ
3299ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
3300ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    version = ''
3301ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3302ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3303ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestHelpUsageLongProgPositionalsWrap(HelpTestCase):
3304ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test usage messages where the prog is long and the positionals wrap"""
3305ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3306ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    parser_signature = Sig(prog='P' * 60, add_help=False)
3307ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [
3308ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('a' * 25),
3309ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('b' * 25),
3310ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('c' * 25),
3311ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
3312ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_group_signatures = []
3313ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    usage = '''\
3314ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        usage: PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
3315ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh               aaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbb
3316ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh               ccccccccccccccccccccccccc
3317ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
3318ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    help = usage + '''\
3319ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3320ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        positional arguments:
3321ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          aaaaaaaaaaaaaaaaaaaaaaaaa
3322ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          bbbbbbbbbbbbbbbbbbbbbbbbb
3323ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          ccccccccccccccccccccccccc
3324ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
3325ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    version = ''
3326ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3327ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3328ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestHelpUsageOptionalsWrap(HelpTestCase):
3329ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test usage messages where the optionals wrap"""
3330ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3331ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    parser_signature = Sig(prog='PROG')
3332ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [
3333ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('-w', metavar='W' * 25),
3334ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('-x', metavar='X' * 25),
3335ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('-y', metavar='Y' * 25),
3336ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('-z', metavar='Z' * 25),
3337ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('a'),
3338ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('b'),
3339ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('c'),
3340ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
3341ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_group_signatures = []
3342ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    usage = '''\
3343ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        usage: PROG [-h] [-w WWWWWWWWWWWWWWWWWWWWWWWWW] \
3344ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh[-x XXXXXXXXXXXXXXXXXXXXXXXXX]
3345ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    [-y YYYYYYYYYYYYYYYYYYYYYYYYY] \
3346ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh[-z ZZZZZZZZZZZZZZZZZZZZZZZZZ]
3347ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    a b c
3348ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
3349ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    help = usage + '''\
3350ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3351ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        positional arguments:
3352ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          a
3353ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          b
3354ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          c
3355ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3356ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        optional arguments:
3357ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -h, --help            show this help message and exit
3358ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -w WWWWWWWWWWWWWWWWWWWWWWWWW
3359ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -x XXXXXXXXXXXXXXXXXXXXXXXXX
3360ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -y YYYYYYYYYYYYYYYYYYYYYYYYY
3361ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -z ZZZZZZZZZZZZZZZZZZZZZZZZZ
3362ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
3363ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    version = ''
3364ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3365ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3366ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestHelpUsagePositionalsWrap(HelpTestCase):
3367ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test usage messages where the positionals wrap"""
3368ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3369ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    parser_signature = Sig(prog='PROG')
3370ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [
3371ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('-x'),
3372ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('-y'),
3373ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('-z'),
3374ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('a' * 25),
3375ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('b' * 25),
3376ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('c' * 25),
3377ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
3378ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_group_signatures = []
3379ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    usage = '''\
3380ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        usage: PROG [-h] [-x X] [-y Y] [-z Z]
3381ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    aaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbb
3382ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    ccccccccccccccccccccccccc
3383ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
3384ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    help = usage + '''\
3385ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3386ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        positional arguments:
3387ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          aaaaaaaaaaaaaaaaaaaaaaaaa
3388ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          bbbbbbbbbbbbbbbbbbbbbbbbb
3389ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          ccccccccccccccccccccccccc
3390ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3391ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        optional arguments:
3392ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -h, --help            show this help message and exit
3393ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -x X
3394ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -y Y
3395ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -z Z
3396ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
3397ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    version = ''
3398ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3399ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3400ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestHelpUsageOptionalsPositionalsWrap(HelpTestCase):
3401ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test usage messages where the optionals and positionals wrap"""
3402ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3403ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    parser_signature = Sig(prog='PROG')
3404ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [
3405ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('-x', metavar='X' * 25),
3406ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('-y', metavar='Y' * 25),
3407ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('-z', metavar='Z' * 25),
3408ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('a' * 25),
3409ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('b' * 25),
3410ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('c' * 25),
3411ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
3412ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_group_signatures = []
3413ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    usage = '''\
3414ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        usage: PROG [-h] [-x XXXXXXXXXXXXXXXXXXXXXXXXX] \
3415ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh[-y YYYYYYYYYYYYYYYYYYYYYYYYY]
3416ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    [-z ZZZZZZZZZZZZZZZZZZZZZZZZZ]
3417ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    aaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbb
3418ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    ccccccccccccccccccccccccc
3419ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
3420ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    help = usage + '''\
3421ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3422ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        positional arguments:
3423ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          aaaaaaaaaaaaaaaaaaaaaaaaa
3424ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          bbbbbbbbbbbbbbbbbbbbbbbbb
3425ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          ccccccccccccccccccccccccc
3426ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3427ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        optional arguments:
3428ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -h, --help            show this help message and exit
3429ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -x XXXXXXXXXXXXXXXXXXXXXXXXX
3430ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -y YYYYYYYYYYYYYYYYYYYYYYYYY
3431ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -z ZZZZZZZZZZZZZZZZZZZZZZZZZ
3432ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
3433ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    version = ''
3434ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3435ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3436ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestHelpUsageOptionalsOnlyWrap(HelpTestCase):
3437ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test usage messages where there are only optionals and they wrap"""
3438ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3439ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    parser_signature = Sig(prog='PROG')
3440ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [
3441ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('-x', metavar='X' * 25),
3442ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('-y', metavar='Y' * 25),
3443ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('-z', metavar='Z' * 25),
3444ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
3445ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_group_signatures = []
3446ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    usage = '''\
3447ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        usage: PROG [-h] [-x XXXXXXXXXXXXXXXXXXXXXXXXX] \
3448ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh[-y YYYYYYYYYYYYYYYYYYYYYYYYY]
3449ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    [-z ZZZZZZZZZZZZZZZZZZZZZZZZZ]
3450ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
3451ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    help = usage + '''\
3452ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3453ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        optional arguments:
3454ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -h, --help            show this help message and exit
3455ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -x XXXXXXXXXXXXXXXXXXXXXXXXX
3456ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -y YYYYYYYYYYYYYYYYYYYYYYYYY
3457ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -z ZZZZZZZZZZZZZZZZZZZZZZZZZ
3458ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
3459ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    version = ''
3460ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3461ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3462ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestHelpUsagePositionalsOnlyWrap(HelpTestCase):
3463ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test usage messages where there are only positionals and they wrap"""
3464ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3465ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    parser_signature = Sig(prog='PROG', add_help=False)
3466ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [
3467ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('a' * 25),
3468ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('b' * 25),
3469ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('c' * 25),
3470ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
3471ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_group_signatures = []
3472ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    usage = '''\
3473ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        usage: PROG aaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbb
3474ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    ccccccccccccccccccccccccc
3475ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
3476ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    help = usage + '''\
3477ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3478ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        positional arguments:
3479ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          aaaaaaaaaaaaaaaaaaaaaaaaa
3480ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          bbbbbbbbbbbbbbbbbbbbbbbbb
3481ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          ccccccccccccccccccccccccc
3482ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
3483ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    version = ''
3484ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3485ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3486ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestHelpVariableExpansion(HelpTestCase):
3487ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test that variables are expanded properly in help messages"""
3488ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3489ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    parser_signature = Sig(prog='PROG')
3490ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [
3491ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('-x', type=int,
3492ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            help='x %(prog)s %(default)s %(type)s %%'),
3493ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('-y', action='store_const', default=42, const='XXX',
3494ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            help='y %(prog)s %(default)s %(const)s'),
3495ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('--foo', choices='abc',
3496ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            help='foo %(prog)s %(default)s %(choices)s'),
3497ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('--bar', default='baz', choices=[1, 2], metavar='BBB',
3498ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            help='bar %(prog)s %(default)s %(dest)s'),
3499ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('spam', help='spam %(prog)s %(default)s'),
3500ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('badger', default=0.5, help='badger %(prog)s %(default)s'),
3501ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
3502ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_group_signatures = [
3503ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        (Sig('group'), [
3504ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            Sig('-a', help='a %(prog)s %(default)s'),
3505ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            Sig('-b', default=-1, help='b %(prog)s %(default)s'),
3506ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ])
3507ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
3508ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    usage = ('''\
3509ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        usage: PROG [-h] [-x X] [-y] [--foo {a,b,c}] [--bar BBB] [-a A] [-b B]
3510ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    spam badger
3511ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ''')
3512ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    help = usage + '''\
3513ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3514ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        positional arguments:
3515ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          spam           spam PROG None
3516ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          badger         badger PROG 0.5
3517ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3518ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        optional arguments:
3519ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -h, --help     show this help message and exit
3520ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -x X           x PROG None int %
3521ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -y             y PROG 42 XXX
3522ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          --foo {a,b,c}  foo PROG None a, b, c
3523ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          --bar BBB      bar PROG baz bar
3524ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3525ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        group:
3526ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -a A           a PROG None
3527ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -b B           b PROG -1
3528ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
3529ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    version = ''
3530ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3531ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3532ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestHelpVariableExpansionUsageSupplied(HelpTestCase):
3533ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test that variables are expanded properly when usage= is present"""
3534ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3535ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    parser_signature = Sig(prog='PROG', usage='%(prog)s FOO')
3536ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = []
3537ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_group_signatures = []
3538ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    usage = ('''\
3539ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        usage: PROG FOO
3540ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ''')
3541ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    help = usage + '''\
3542ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3543ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        optional arguments:
3544ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -h, --help  show this help message and exit
3545ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
3546ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    version = ''
3547ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3548ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3549ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestHelpVariableExpansionNoArguments(HelpTestCase):
3550ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test that variables are expanded properly with no arguments"""
3551ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3552ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    parser_signature = Sig(prog='PROG', add_help=False)
3553ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = []
3554ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_group_signatures = []
3555ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    usage = ('''\
3556ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        usage: PROG
3557ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ''')
3558ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    help = usage
3559ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    version = ''
3560ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3561ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3562ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestHelpSuppressUsage(HelpTestCase):
3563ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test that items can be suppressed in usage messages"""
3564ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3565ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    parser_signature = Sig(prog='PROG', usage=argparse.SUPPRESS)
3566ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [
3567ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('--foo', help='foo help'),
3568ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('spam', help='spam help'),
3569ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
3570ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_group_signatures = []
3571ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    help = '''\
3572ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        positional arguments:
3573ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          spam        spam help
3574ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3575ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        optional arguments:
3576ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -h, --help  show this help message and exit
3577ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          --foo FOO   foo help
3578ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
3579ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    usage = ''
3580ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    version = ''
3581ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3582ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3583ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestHelpSuppressOptional(HelpTestCase):
3584ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test that optional arguments can be suppressed in help messages"""
3585ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3586ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    parser_signature = Sig(prog='PROG', add_help=False)
3587ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [
3588ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('--foo', help=argparse.SUPPRESS),
3589ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('spam', help='spam help'),
3590ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
3591ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_group_signatures = []
3592ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    usage = '''\
3593ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        usage: PROG spam
3594ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
3595ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    help = usage + '''\
3596ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3597ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        positional arguments:
3598ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          spam  spam help
3599ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
3600ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    version = ''
3601ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3602ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3603ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestHelpSuppressOptionalGroup(HelpTestCase):
3604ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test that optional groups can be suppressed in help messages"""
3605ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3606ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    parser_signature = Sig(prog='PROG')
3607ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [
3608ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('--foo', help='foo help'),
3609ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('spam', help='spam help'),
3610ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
3611ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_group_signatures = [
3612ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        (Sig('group'), [Sig('--bar', help=argparse.SUPPRESS)]),
3613ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
3614ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    usage = '''\
3615ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        usage: PROG [-h] [--foo FOO] spam
3616ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
3617ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    help = usage + '''\
3618ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3619ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        positional arguments:
3620ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          spam        spam help
3621ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3622ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        optional arguments:
3623ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -h, --help  show this help message and exit
3624ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          --foo FOO   foo help
3625ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
3626ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    version = ''
3627ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3628ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3629ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestHelpSuppressPositional(HelpTestCase):
3630ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test that positional arguments can be suppressed in help messages"""
3631ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3632ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    parser_signature = Sig(prog='PROG')
3633ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [
3634ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('--foo', help='foo help'),
3635ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('spam', help=argparse.SUPPRESS),
3636ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
3637ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_group_signatures = []
3638ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    usage = '''\
3639ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        usage: PROG [-h] [--foo FOO]
3640ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
3641ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    help = usage + '''\
3642ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3643ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        optional arguments:
3644ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -h, --help  show this help message and exit
3645ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          --foo FOO   foo help
3646ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
3647ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    version = ''
3648ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3649ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3650ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestHelpRequiredOptional(HelpTestCase):
3651ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test that required options don't look optional"""
3652ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3653ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    parser_signature = Sig(prog='PROG')
3654ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [
3655ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('--foo', required=True, help='foo help'),
3656ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
3657ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_group_signatures = []
3658ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    usage = '''\
3659ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        usage: PROG [-h] --foo FOO
3660ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
3661ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    help = usage + '''\
3662ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3663ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        optional arguments:
3664ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -h, --help  show this help message and exit
3665ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          --foo FOO   foo help
3666ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
3667ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    version = ''
3668ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3669ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3670ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestHelpAlternatePrefixChars(HelpTestCase):
3671ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test that options display with different prefix characters"""
3672ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3673ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    parser_signature = Sig(prog='PROG', prefix_chars='^;', add_help=False)
3674ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [
3675ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('^^foo', action='store_true', help='foo help'),
3676ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig(';b', ';;bar', help='bar help'),
3677ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
3678ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_group_signatures = []
3679ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    usage = '''\
3680ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        usage: PROG [^^foo] [;b BAR]
3681ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
3682ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    help = usage + '''\
3683ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3684ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        optional arguments:
3685ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          ^^foo              foo help
3686ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          ;b BAR, ;;bar BAR  bar help
3687ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
3688ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    version = ''
3689ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3690ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3691ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestHelpNoHelpOptional(HelpTestCase):
3692ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test that the --help argument can be suppressed help messages"""
3693ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3694ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    parser_signature = Sig(prog='PROG', add_help=False)
3695ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [
3696ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('--foo', help='foo help'),
3697ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('spam', help='spam help'),
3698ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
3699ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_group_signatures = []
3700ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    usage = '''\
3701ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        usage: PROG [--foo FOO] spam
3702ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
3703ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    help = usage + '''\
3704ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3705ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        positional arguments:
3706ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          spam       spam help
3707ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3708ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        optional arguments:
3709ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          --foo FOO  foo help
3710ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
3711ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    version = ''
3712ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3713ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3714ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestHelpVersionOptional(HelpTestCase):
3715ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test that the --version argument can be suppressed help messages"""
3716ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3717ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    parser_signature = Sig(prog='PROG', version='1.0')
3718ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [
3719ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('--foo', help='foo help'),
3720ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('spam', help='spam help'),
3721ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
3722ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_group_signatures = []
3723ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    usage = '''\
3724ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        usage: PROG [-h] [-v] [--foo FOO] spam
3725ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
3726ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    help = usage + '''\
3727ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3728ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        positional arguments:
3729ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          spam           spam help
3730ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3731ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        optional arguments:
3732ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -h, --help     show this help message and exit
3733ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -v, --version  show program's version number and exit
3734ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          --foo FOO      foo help
3735ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
3736ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    version = '''\
3737ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        1.0
3738ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
3739ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3740ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3741ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestHelpNone(HelpTestCase):
3742ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test that no errors occur if no help is specified"""
3743ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3744ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    parser_signature = Sig(prog='PROG')
3745ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [
3746ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('--foo'),
3747ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('spam'),
3748ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
3749ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_group_signatures = []
3750ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    usage = '''\
3751ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        usage: PROG [-h] [--foo FOO] spam
3752ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
3753ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    help = usage + '''\
3754ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3755ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        positional arguments:
3756ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          spam
3757ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3758ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        optional arguments:
3759ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -h, --help  show this help message and exit
3760ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          --foo FOO
3761ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
3762ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    version = ''
3763ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3764ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3765ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestHelpTupleMetavar(HelpTestCase):
3766ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test specifying metavar as a tuple"""
3767ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3768ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    parser_signature = Sig(prog='PROG')
3769ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [
3770ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('-w', help='w', nargs='+', metavar=('W1', 'W2')),
3771ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('-x', help='x', nargs='*', metavar=('X1', 'X2')),
3772ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('-y', help='y', nargs=3, metavar=('Y1', 'Y2', 'Y3')),
3773ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('-z', help='z', nargs='?', metavar=('Z1', )),
3774ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
3775ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_group_signatures = []
3776ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    usage = '''\
3777ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        usage: PROG [-h] [-w W1 [W2 ...]] [-x [X1 [X2 ...]]] [-y Y1 Y2 Y3] \
3778ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh[-z [Z1]]
3779ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
3780ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    help = usage + '''\
3781ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3782ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        optional arguments:
3783ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -h, --help        show this help message and exit
3784ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -w W1 [W2 ...]    w
3785ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -x [X1 [X2 ...]]  x
3786ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -y Y1 Y2 Y3       y
3787ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -z [Z1]           z
3788ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
3789ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    version = ''
3790ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3791ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3792ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestHelpRawText(HelpTestCase):
3793ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test the RawTextHelpFormatter"""
3794ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3795ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    parser_signature = Sig(
3796ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        prog='PROG', formatter_class=argparse.RawTextHelpFormatter,
3797ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        description='Keep the formatting\n'
3798ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    '    exactly as it is written\n'
3799ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    '\n'
3800ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    'here\n')
3801ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3802ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [
3803ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('--foo', help='    foo help should also\n'
3804ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                          'appear as given here'),
3805ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('spam', help='spam help'),
3806ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
3807ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_group_signatures = [
3808ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        (Sig('title', description='    This text\n'
3809ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                  '  should be indented\n'
3810ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                  '    exactly like it is here\n'),
3811ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh         [Sig('--bar', help='bar help')]),
3812ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
3813ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    usage = '''\
3814ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        usage: PROG [-h] [--foo FOO] [--bar BAR] spam
3815ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
3816ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    help = usage + '''\
3817ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3818ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Keep the formatting
3819ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            exactly as it is written
3820ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3821ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        here
3822ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3823ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        positional arguments:
3824ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          spam        spam help
3825ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3826ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        optional arguments:
3827ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -h, --help  show this help message and exit
3828ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          --foo FOO       foo help should also
3829ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                      appear as given here
3830ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3831ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        title:
3832ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh              This text
3833ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            should be indented
3834ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh              exactly like it is here
3835ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3836ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          --bar BAR   bar help
3837ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
3838ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    version = ''
3839ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3840ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3841ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestHelpRawDescription(HelpTestCase):
3842ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test the RawTextHelpFormatter"""
3843ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3844ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    parser_signature = Sig(
3845ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        prog='PROG', formatter_class=argparse.RawDescriptionHelpFormatter,
3846ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        description='Keep the formatting\n'
3847ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    '    exactly as it is written\n'
3848ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    '\n'
3849ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    'here\n')
3850ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3851ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [
3852ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('--foo', help='  foo help should not\n'
3853ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                          '    retain this odd formatting'),
3854ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('spam', help='spam help'),
3855ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
3856ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_group_signatures = [
3857ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        (Sig('title', description='    This text\n'
3858ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                  '  should be indented\n'
3859ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                  '    exactly like it is here\n'),
3860ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh         [Sig('--bar', help='bar help')]),
3861ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
3862ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    usage = '''\
3863ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        usage: PROG [-h] [--foo FOO] [--bar BAR] spam
3864ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
3865ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    help = usage + '''\
3866ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3867ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Keep the formatting
3868ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            exactly as it is written
3869ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3870ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        here
3871ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3872ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        positional arguments:
3873ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          spam        spam help
3874ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3875ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        optional arguments:
3876ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -h, --help  show this help message and exit
3877ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          --foo FOO   foo help should not retain this odd formatting
3878ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3879ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        title:
3880ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh              This text
3881ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            should be indented
3882ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh              exactly like it is here
3883ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3884ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          --bar BAR   bar help
3885ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
3886ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    version = ''
3887ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3888ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3889ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestHelpArgumentDefaults(HelpTestCase):
3890ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test the ArgumentDefaultsHelpFormatter"""
3891ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3892ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    parser_signature = Sig(
3893ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        prog='PROG', formatter_class=argparse.ArgumentDefaultsHelpFormatter,
3894ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        description='description')
3895ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3896ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [
3897ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('--foo', help='foo help - oh and by the way, %(default)s'),
3898ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('--bar', action='store_true', help='bar help'),
3899ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('spam', help='spam help'),
3900ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        Sig('badger', nargs='?', default='wooden', help='badger help'),
3901ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
3902ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_group_signatures = [
3903ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        (Sig('title', description='description'),
3904ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh         [Sig('--baz', type=int, default=42, help='baz help')]),
3905ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    ]
3906ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    usage = '''\
3907ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        usage: PROG [-h] [--foo FOO] [--bar] [--baz BAZ] spam [badger]
3908ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
3909ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    help = usage + '''\
3910ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3911ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        description
3912ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3913ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        positional arguments:
3914ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          spam        spam help
3915ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          badger      badger help (default: wooden)
3916ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3917ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        optional arguments:
3918ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -h, --help  show this help message and exit
3919ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          --foo FOO   foo help - oh and by the way, None
3920ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          --bar       bar help (default: False)
3921ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3922ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        title:
3923ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          description
3924ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3925ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          --baz BAZ   baz help (default: 42)
3926ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
3927ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    version = ''
3928ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3929ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestHelpVersionAction(HelpTestCase):
3930ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test the default help for the version action"""
3931ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3932ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    parser_signature = Sig(prog='PROG', description='description')
3933ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_signatures = [Sig('-V', '--version', action='version', version='3.6')]
3934ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    argument_group_signatures = []
3935ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    usage = '''\
3936ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        usage: PROG [-h] [-V]
3937ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
3938ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    help = usage + '''\
3939ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3940ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        description
3941ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3942ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        optional arguments:
3943ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -h, --help     show this help message and exit
3944ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -V, --version  show program's version number and exit
3945ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
3946ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    version = ''
3947ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3948ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestHelpSubparsersOrdering(HelpTestCase):
3949ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test ordering of subcommands in help matches the code"""
3950ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    parser_signature = Sig(prog='PROG',
3951ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                           description='display some subcommands',
3952ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                           version='0.1')
3953ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3954ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    subparsers_signatures = [Sig(name=name)
3955ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                             for name in ('a', 'b', 'c', 'd', 'e')]
3956ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3957ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    usage = '''\
3958ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        usage: PROG [-h] [-v] {a,b,c,d,e} ...
3959ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
3960ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3961ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    help = usage + '''\
3962ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3963ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        display some subcommands
3964ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3965ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        positional arguments:
3966ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          {a,b,c,d,e}
3967ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3968ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        optional arguments:
3969ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -h, --help     show this help message and exit
3970ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -v, --version  show program's version number and exit
3971ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
3972ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3973ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    version = '''\
3974ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        0.1
3975ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
3976ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3977ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestHelpSubparsersWithHelpOrdering(HelpTestCase):
3978ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test ordering of subcommands in help matches the code"""
3979ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    parser_signature = Sig(prog='PROG',
3980ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                           description='display some subcommands',
3981ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                           version='0.1')
3982ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3983ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    subcommand_data = (('a', 'a subcommand help'),
3984ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                       ('b', 'b subcommand help'),
3985ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                       ('c', 'c subcommand help'),
3986ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                       ('d', 'd subcommand help'),
3987ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                       ('e', 'e subcommand help'),
3988ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                       )
3989ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3990ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    subparsers_signatures = [Sig(name=name, help=help)
3991ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                             for name, help in subcommand_data]
3992ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3993ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    usage = '''\
3994ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        usage: PROG [-h] [-v] {a,b,c,d,e} ...
3995ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
3996ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3997ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    help = usage + '''\
3998ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3999ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        display some subcommands
4000ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4001ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        positional arguments:
4002ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          {a,b,c,d,e}
4003ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            a            a subcommand help
4004ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            b            b subcommand help
4005ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            c            c subcommand help
4006ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            d            d subcommand help
4007ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            e            e subcommand help
4008ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4009ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        optional arguments:
4010ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -h, --help     show this help message and exit
4011ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh          -v, --version  show program's version number and exit
4012ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
4013ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4014ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    version = '''\
4015ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        0.1
4016ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        '''
4017ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4018ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4019ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# =====================================
4020ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# Optional/Positional constructor tests
4021ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# =====================================
4022ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4023ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestInvalidArgumentConstructors(TestCase):
4024ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test a bunch of invalid Argument constructors"""
4025ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4026ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def assertTypeError(self, *args, **kwargs):
4027ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser = argparse.ArgumentParser()
4028ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertRaises(TypeError, parser.add_argument,
4029ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                          *args, **kwargs)
4030ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4031ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def assertValueError(self, *args, **kwargs):
4032ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser = argparse.ArgumentParser()
4033ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertRaises(ValueError, parser.add_argument,
4034ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                          *args, **kwargs)
4035ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4036ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_invalid_keyword_arguments(self):
4037ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertTypeError('-x', bar=None)
4038ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertTypeError('-y', callback='foo')
4039ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertTypeError('-y', callback_args=())
4040ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertTypeError('-y', callback_kwargs={})
4041ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4042ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_missing_destination(self):
4043ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertTypeError()
4044ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for action in ['append', 'store']:
4045ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertTypeError(action=action)
4046ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4047ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_invalid_option_strings(self):
4048ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertValueError('--')
4049ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertValueError('---')
4050ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4051ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_invalid_type(self):
4052ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertValueError('--foo', type='int')
4053ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertValueError('--foo', type=(int, float))
4054ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4055ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_invalid_action(self):
4056ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertValueError('-x', action='foo')
4057ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertValueError('foo', action='baz')
4058ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertValueError('--foo', action=('store', 'append'))
4059ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser = argparse.ArgumentParser()
4060ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        try:
4061ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            parser.add_argument("--foo", action="store-true")
4062ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        except ValueError:
4063ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            e = sys.exc_info()[1]
4064ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            expected = 'unknown action'
4065ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            msg = 'expected %r, found %r' % (expected, e)
4066ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertTrue(expected in str(e), msg)
4067ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4068ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_multiple_dest(self):
4069ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser = argparse.ArgumentParser()
4070ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser.add_argument(dest='foo')
4071ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        try:
4072ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            parser.add_argument('bar', dest='baz')
4073ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        except ValueError:
4074ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            e = sys.exc_info()[1]
4075ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            expected = 'dest supplied twice for positional argument'
4076ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            msg = 'expected %r, found %r' % (expected, e)
4077ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertTrue(expected in str(e), msg)
4078ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4079ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_no_argument_actions(self):
4080ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for action in ['store_const', 'store_true', 'store_false',
4081ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                       'append_const', 'count']:
4082ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            for attrs in [dict(type=int), dict(nargs='+'),
4083ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                          dict(choices='ab')]:
4084ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                self.assertTypeError('-x', action=action, **attrs)
4085ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4086ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_no_argument_no_const_actions(self):
4087ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # options with zero arguments
4088ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for action in ['store_true', 'store_false', 'count']:
4089ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4090ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            # const is always disallowed
4091ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertTypeError('-x', const='foo', action=action)
4092ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4093ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            # nargs is always disallowed
4094ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertTypeError('-x', nargs='*', action=action)
4095ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4096ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_more_than_one_argument_actions(self):
4097ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for action in ['store', 'append']:
4098ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4099ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            # nargs=0 is disallowed
4100ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertValueError('-x', nargs=0, action=action)
4101ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertValueError('spam', nargs=0, action=action)
4102ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4103ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            # const is disallowed with non-optional arguments
4104ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            for nargs in [1, '*', '+']:
4105ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                self.assertValueError('-x', const='foo',
4106ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                      nargs=nargs, action=action)
4107ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                self.assertValueError('spam', const='foo',
4108ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                      nargs=nargs, action=action)
4109ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4110ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_required_const_actions(self):
4111ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for action in ['store_const', 'append_const']:
4112ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4113ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            # nargs is always disallowed
4114ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertTypeError('-x', nargs='+', action=action)
4115ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4116ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_parsers_action_missing_params(self):
4117ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertTypeError('command', action='parsers')
4118ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertTypeError('command', action='parsers', prog='PROG')
4119ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertTypeError('command', action='parsers',
4120ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                             parser_class=argparse.ArgumentParser)
4121ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4122ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_required_positional(self):
4123ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertTypeError('foo', required=True)
4124ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4125ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_user_defined_action(self):
4126ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4127ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        class Success(Exception):
4128ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            pass
4129ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4130ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        class Action(object):
4131ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4132ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            def __init__(self,
4133ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                         option_strings,
4134ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                         dest,
4135ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                         const,
4136ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                         default,
4137ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                         required=False):
4138ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                if dest == 'spam':
4139ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                    if const is Success:
4140ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                        if default is Success:
4141ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                            raise Success()
4142ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4143ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            def __call__(self, *args, **kwargs):
4144ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                pass
4145ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4146ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser = argparse.ArgumentParser()
4147ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertRaises(Success, parser.add_argument, '--spam',
4148ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                          action=Action, default=Success, const=Success)
4149ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertRaises(Success, parser.add_argument, 'spam',
4150ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                          action=Action, default=Success, const=Success)
4151ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4152ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# ================================
4153ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# Actions returned by add_argument
4154ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# ================================
4155ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4156ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestActionsReturned(TestCase):
4157ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4158ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_dest(self):
4159ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser = argparse.ArgumentParser()
4160ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        action = parser.add_argument('--foo')
4161ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(action.dest, 'foo')
4162ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        action = parser.add_argument('-b', '--bar')
4163ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(action.dest, 'bar')
4164ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        action = parser.add_argument('-x', '-y')
4165ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(action.dest, 'x')
4166ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4167ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_misc(self):
4168ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser = argparse.ArgumentParser()
4169ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        action = parser.add_argument('--foo', nargs='?', const=42,
4170ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                     default=84, type=int, choices=[1, 2],
4171ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                     help='FOO', metavar='BAR', dest='baz')
4172ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(action.nargs, '?')
4173ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(action.const, 42)
4174ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(action.default, 84)
4175ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(action.type, int)
4176ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(action.choices, [1, 2])
4177ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(action.help, 'FOO')
4178ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(action.metavar, 'BAR')
4179ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(action.dest, 'baz')
4180ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4181ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4182ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# ================================
4183ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# Argument conflict handling tests
4184ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# ================================
4185ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4186ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestConflictHandling(TestCase):
4187ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4188ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_bad_type(self):
4189ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertRaises(ValueError, argparse.ArgumentParser,
4190ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                          conflict_handler='foo')
4191ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4192ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_conflict_error(self):
4193ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser = argparse.ArgumentParser()
4194ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser.add_argument('-x')
4195ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertRaises(argparse.ArgumentError,
4196ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                          parser.add_argument, '-x')
4197ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser.add_argument('--spam')
4198ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertRaises(argparse.ArgumentError,
4199ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                          parser.add_argument, '--spam')
4200ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4201ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_resolve_error(self):
4202ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        get_parser = argparse.ArgumentParser
4203ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser = get_parser(prog='PROG', conflict_handler='resolve')
4204ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4205ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser.add_argument('-x', help='OLD X')
4206ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser.add_argument('-x', help='NEW X')
4207ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(parser.format_help(), textwrap.dedent('''\
4208ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            usage: PROG [-h] [-x X]
4209ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4210ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            optional arguments:
4211ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh              -h, --help  show this help message and exit
4212ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh              -x X        NEW X
4213ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            '''))
4214ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4215ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser.add_argument('--spam', metavar='OLD_SPAM')
4216ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser.add_argument('--spam', metavar='NEW_SPAM')
4217ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(parser.format_help(), textwrap.dedent('''\
4218ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            usage: PROG [-h] [-x X] [--spam NEW_SPAM]
4219ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4220ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            optional arguments:
4221ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh              -h, --help       show this help message and exit
4222ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh              -x X             NEW X
4223ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh              --spam NEW_SPAM
4224ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            '''))
4225ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4226ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4227ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# =============================
4228ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# Help and Version option tests
4229ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# =============================
4230ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4231ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestOptionalsHelpVersionActions(TestCase):
4232ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test the help and version actions"""
4233ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4234ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def _get_error(self, func, *args, **kwargs):
4235ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        try:
4236ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            func(*args, **kwargs)
4237ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        except ArgumentParserError:
4238ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            return sys.exc_info()[1]
4239ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        else:
4240ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertRaises(ArgumentParserError, func, *args, **kwargs)
4241ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4242ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def assertPrintHelpExit(self, parser, args_str):
4243ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(
4244ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            parser.format_help(),
4245ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self._get_error(parser.parse_args, args_str.split()).stdout)
4246ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4247ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def assertPrintVersionExit(self, parser, args_str):
4248ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(
4249ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            parser.format_version(),
4250ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self._get_error(parser.parse_args, args_str.split()).stderr)
4251ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4252ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def assertArgumentParserError(self, parser, *args):
4253ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertRaises(ArgumentParserError, parser.parse_args, args)
4254ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4255ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_version(self):
4256ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser = ErrorRaisingArgumentParser(version='1.0')
4257ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertPrintHelpExit(parser, '-h')
4258ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertPrintHelpExit(parser, '--help')
4259ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertPrintVersionExit(parser, '-v')
4260ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertPrintVersionExit(parser, '--version')
4261ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4262ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_version_format(self):
4263ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser = ErrorRaisingArgumentParser(prog='PPP', version='%(prog)s 3.5')
4264ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        msg = self._get_error(parser.parse_args, ['-v']).stderr
4265ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual('PPP 3.5\n', msg)
4266ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4267ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_version_no_help(self):
4268ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser = ErrorRaisingArgumentParser(add_help=False, version='1.0')
4269ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertArgumentParserError(parser, '-h')
4270ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertArgumentParserError(parser, '--help')
4271ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertPrintVersionExit(parser, '-v')
4272ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertPrintVersionExit(parser, '--version')
4273ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4274ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_version_action(self):
4275ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser = ErrorRaisingArgumentParser(prog='XXX')
4276ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser.add_argument('-V', action='version', version='%(prog)s 3.7')
4277ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        msg = self._get_error(parser.parse_args, ['-V']).stderr
4278ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual('XXX 3.7\n', msg)
4279ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4280ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_no_help(self):
4281ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser = ErrorRaisingArgumentParser(add_help=False)
4282ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertArgumentParserError(parser, '-h')
4283ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertArgumentParserError(parser, '--help')
4284ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertArgumentParserError(parser, '-v')
4285ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertArgumentParserError(parser, '--version')
4286ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4287ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_alternate_help_version(self):
4288ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser = ErrorRaisingArgumentParser()
4289ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser.add_argument('-x', action='help')
4290ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser.add_argument('-y', action='version')
4291ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertPrintHelpExit(parser, '-x')
4292ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertPrintVersionExit(parser, '-y')
4293ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertArgumentParserError(parser, '-v')
4294ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertArgumentParserError(parser, '--version')
4295ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4296ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_help_version_extra_arguments(self):
4297ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser = ErrorRaisingArgumentParser(version='1.0')
4298ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser.add_argument('-x', action='store_true')
4299ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser.add_argument('y')
4300ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4301ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # try all combinations of valid prefixes and suffixes
4302ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        valid_prefixes = ['', '-x', 'foo', '-x bar', 'baz -x']
4303ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        valid_suffixes = valid_prefixes + ['--bad-option', 'foo bar baz']
4304ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for prefix in valid_prefixes:
4305ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            for suffix in valid_suffixes:
4306ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                format = '%s %%s %s' % (prefix, suffix)
4307ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertPrintHelpExit(parser, format % '-h')
4308ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertPrintHelpExit(parser, format % '--help')
4309ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertPrintVersionExit(parser, format % '-v')
4310ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertPrintVersionExit(parser, format % '--version')
4311ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4312ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4313ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# ======================
4314ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# str() and repr() tests
4315ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# ======================
4316ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4317ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestStrings(TestCase):
4318ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    """Test str()  and repr() on Optionals and Positionals"""
4319ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4320ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def assertStringEqual(self, obj, result_string):
4321ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for func in [str, repr]:
4322ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertEqual(func(obj), result_string)
4323ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4324ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_optional(self):
4325ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        option = argparse.Action(
4326ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            option_strings=['--foo', '-a', '-b'],
4327ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            dest='b',
4328ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            type='int',
4329ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            nargs='+',
4330ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            default=42,
4331ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            choices=[1, 2, 3],
4332ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            help='HELP',
4333ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            metavar='METAVAR')
4334ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        string = (
4335ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            "Action(option_strings=['--foo', '-a', '-b'], dest='b', "
4336ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            "nargs='+', const=None, default=42, type='int', "
4337ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            "choices=[1, 2, 3], help='HELP', metavar='METAVAR')")
4338ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertStringEqual(option, string)
4339ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4340ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_argument(self):
4341ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        argument = argparse.Action(
4342ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            option_strings=[],
4343ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            dest='x',
4344ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            type=float,
4345ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            nargs='?',
4346ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            default=2.5,
4347ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            choices=[0.5, 1.5, 2.5],
4348ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            help='H HH H',
4349ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            metavar='MV MV MV')
4350ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        string = (
4351ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            "Action(option_strings=[], dest='x', nargs='?', "
4352ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            "const=None, default=2.5, type=%r, choices=[0.5, 1.5, 2.5], "
4353ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            "help='H HH H', metavar='MV MV MV')" % float)
4354ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertStringEqual(argument, string)
4355ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4356ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_namespace(self):
4357ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ns = argparse.Namespace(foo=42, bar='spam')
4358ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        string = "Namespace(bar='spam', foo=42)"
4359ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertStringEqual(ns, string)
4360ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4361ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_parser(self):
4362ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser = argparse.ArgumentParser(prog='PROG')
4363ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        string = (
4364ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            "ArgumentParser(prog='PROG', usage=None, description=None, "
4365ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            "version=None, formatter_class=%r, conflict_handler='error', "
4366ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            "add_help=True)" % argparse.HelpFormatter)
4367ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertStringEqual(parser, string)
4368ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4369ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# ===============
4370ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# Namespace tests
4371ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# ===============
4372ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4373ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestNamespace(TestCase):
4374ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4375ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_constructor(self):
4376ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ns = argparse.Namespace()
4377ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertRaises(AttributeError, getattr, ns, 'x')
4378ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4379ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ns = argparse.Namespace(a=42, b='spam')
4380ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(ns.a, 42)
4381ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(ns.b, 'spam')
4382ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4383ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_equality(self):
4384ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ns1 = argparse.Namespace(a=1, b=2)
4385ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ns2 = argparse.Namespace(b=2, a=1)
4386ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ns3 = argparse.Namespace(a=1)
4387ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ns4 = argparse.Namespace(b=2)
4388ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4389ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(ns1, ns2)
4390ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertNotEqual(ns1, ns3)
4391ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertNotEqual(ns1, ns4)
4392ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertNotEqual(ns2, ns3)
4393ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertNotEqual(ns2, ns4)
4394ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertTrue(ns1 != ns3)
4395ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertTrue(ns1 != ns4)
4396ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertTrue(ns2 != ns3)
4397ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertTrue(ns2 != ns4)
4398ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4399ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4400ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# ===================
4401ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# File encoding tests
4402ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# ===================
4403ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4404ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestEncoding(TestCase):
4405ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4406ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def _test_module_encoding(self, path):
4407ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        path, _ = os.path.splitext(path)
4408ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        path += ".py"
4409ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        with codecs.open(path, 'r', 'utf8') as f:
4410ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            f.read()
4411ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4412ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_argparse_module_encoding(self):
4413ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self._test_module_encoding(argparse.__file__)
4414ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4415ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_test_argparse_module_encoding(self):
4416ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self._test_module_encoding(__file__)
4417ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4418ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# ===================
4419ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# ArgumentError tests
4420ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# ===================
4421ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4422ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestArgumentError(TestCase):
4423ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4424ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_argument_error(self):
4425ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        msg = "my error here"
4426ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        error = argparse.ArgumentError(None, msg)
4427ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(str(error), msg)
4428ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4429ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# =======================
4430ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# ArgumentTypeError tests
4431ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# =======================
4432ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4433ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestArgumentTypeError(TestCase):
4434ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4435ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_argument_type_error(self):
4436ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4437ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        def spam(string):
4438ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            raise argparse.ArgumentTypeError('spam!')
4439ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4440ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser = ErrorRaisingArgumentParser(prog='PROG', add_help=False)
4441ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser.add_argument('x', type=spam)
4442ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        try:
4443ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            parser.parse_args(['XXX'])
4444ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        except ArgumentParserError:
4445ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            expected = 'usage: PROG x\nPROG: error: argument x: spam!\n'
4446ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            msg = sys.exc_info()[1].stderr
4447ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertEqual(expected, msg)
4448ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        else:
4449ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.fail()
4450ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4451ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# ================================================
4452ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# Check that the type function is called only once
4453ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# ================================================
4454ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4455ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestTypeFunctionCallOnlyOnce(TestCase):
4456ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4457ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_type_function_call_only_once(self):
4458ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        def spam(string_to_convert):
4459ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertEqual(string_to_convert, 'spam!')
4460ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            return 'foo_converted'
4461ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4462ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser = argparse.ArgumentParser()
4463ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser.add_argument('--foo', type=spam, default='bar')
4464ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        args = parser.parse_args('--foo spam!'.split())
4465ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(NS(foo='foo_converted'), args)
4466ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4467ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# ==================================================================
4468ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# Check semantics regarding the default argument and type conversion
4469ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# ==================================================================
4470ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4471ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestTypeFunctionCalledOnDefault(TestCase):
4472ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4473ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_type_function_call_with_non_string_default(self):
4474ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        def spam(int_to_convert):
4475ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertEqual(int_to_convert, 0)
4476ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            return 'foo_converted'
4477ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4478ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser = argparse.ArgumentParser()
4479ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser.add_argument('--foo', type=spam, default=0)
4480ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        args = parser.parse_args([])
4481ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # foo should *not* be converted because its default is not a string.
4482ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(NS(foo=0), args)
4483ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4484ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_type_function_call_with_string_default(self):
4485ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        def spam(int_to_convert):
4486ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            return 'foo_converted'
4487ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4488ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser = argparse.ArgumentParser()
4489ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser.add_argument('--foo', type=spam, default='0')
4490ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        args = parser.parse_args([])
4491ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # foo is converted because its default is a string.
4492ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(NS(foo='foo_converted'), args)
4493ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4494ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_no_double_type_conversion_of_default(self):
4495ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        def extend(str_to_convert):
4496ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            return str_to_convert + '*'
4497ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4498ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser = argparse.ArgumentParser()
4499ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser.add_argument('--test', type=extend, default='*')
4500ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        args = parser.parse_args([])
4501ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # The test argument will be two stars, one coming from the default
4502ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # value and one coming from the type conversion being called exactly
4503ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # once.
4504ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(NS(test='**'), args)
4505ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4506ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_issue_15906(self):
4507ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # Issue #15906: When action='append', type=str, default=[] are
4508ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # providing, the dest value was the string representation "[]" when it
4509ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # should have been an empty list.
4510ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser = argparse.ArgumentParser()
4511ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser.add_argument('--test', dest='test', type=str,
4512ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                            default=[], action='append')
4513ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        args = parser.parse_args([])
4514ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(args.test, [])
4515ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4516ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# ======================
4517ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# parse_known_args tests
4518ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# ======================
4519ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4520ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestParseKnownArgs(TestCase):
4521ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4522ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_arguments_tuple(self):
4523ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser = argparse.ArgumentParser()
4524ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser.parse_args(())
4525ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4526ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_arguments_list(self):
4527ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser = argparse.ArgumentParser()
4528ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser.parse_args([])
4529ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4530ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_arguments_tuple_positional(self):
4531ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser = argparse.ArgumentParser()
4532ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser.add_argument('x')
4533ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser.parse_args(('x',))
4534ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4535ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_arguments_list_positional(self):
4536ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser = argparse.ArgumentParser()
4537ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser.add_argument('x')
4538ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser.parse_args(['x'])
4539ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4540ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_optionals(self):
4541ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser = argparse.ArgumentParser()
4542ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser.add_argument('--foo')
4543ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        args, extras = parser.parse_known_args('--foo F --bar --baz'.split())
4544ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(NS(foo='F'), args)
4545ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(['--bar', '--baz'], extras)
4546ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4547ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_mixed(self):
4548ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser = argparse.ArgumentParser()
4549ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser.add_argument('-v', nargs='?', const=1, type=int)
4550ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser.add_argument('--spam', action='store_false')
4551ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser.add_argument('badger')
4552ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4553ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        argv = ["B", "C", "--foo", "-v", "3", "4"]
4554ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        args, extras = parser.parse_known_args(argv)
4555ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(NS(v=3, spam=True, badger="B"), args)
4556ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(["C", "--foo", "4"], extras)
4557ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4558ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# ==========================
4559ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# add_argument metavar tests
4560ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# ==========================
4561ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4562ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestAddArgumentMetavar(TestCase):
4563ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4564ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    EXPECTED_MESSAGE = "length of metavar tuple does not match nargs"
4565ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4566ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def do_test_no_exception(self, nargs, metavar):
4567ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser = argparse.ArgumentParser()
4568ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser.add_argument("--foo", nargs=nargs, metavar=metavar)
4569ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4570ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def do_test_exception(self, nargs, metavar):
4571ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        parser = argparse.ArgumentParser()
4572ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        with self.assertRaises(ValueError) as cm:
4573ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            parser.add_argument("--foo", nargs=nargs, metavar=metavar)
4574ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(cm.exception.args[0], self.EXPECTED_MESSAGE)
4575ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4576ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    # Unit tests for different values of metavar when nargs=None
4577ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4578ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_nargs_None_metavar_string(self):
4579ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.do_test_no_exception(nargs=None, metavar="1")
4580ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4581ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_nargs_None_metavar_length0(self):
4582ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.do_test_exception(nargs=None, metavar=tuple())
4583ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4584ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_nargs_None_metavar_length1(self):
4585ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.do_test_no_exception(nargs=None, metavar=("1"))
4586ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4587ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_nargs_None_metavar_length2(self):
4588ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.do_test_exception(nargs=None, metavar=("1", "2"))
4589ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4590ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_nargs_None_metavar_length3(self):
4591ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.do_test_exception(nargs=None, metavar=("1", "2", "3"))
4592ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4593ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    # Unit tests for different values of metavar when nargs=?
4594ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4595ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_nargs_optional_metavar_string(self):
4596ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.do_test_no_exception(nargs="?", metavar="1")
4597ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4598ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_nargs_optional_metavar_length0(self):
4599ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.do_test_exception(nargs="?", metavar=tuple())
4600ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4601ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_nargs_optional_metavar_length1(self):
4602ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.do_test_no_exception(nargs="?", metavar=("1"))
4603ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4604ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_nargs_optional_metavar_length2(self):
4605ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.do_test_exception(nargs="?", metavar=("1", "2"))
4606ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4607ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_nargs_optional_metavar_length3(self):
4608ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.do_test_exception(nargs="?", metavar=("1", "2", "3"))
4609ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4610ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    # Unit tests for different values of metavar when nargs=*
4611ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4612ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_nargs_zeroormore_metavar_string(self):
4613ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.do_test_no_exception(nargs="*", metavar="1")
4614ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4615ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_nargs_zeroormore_metavar_length0(self):
4616ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.do_test_exception(nargs="*", metavar=tuple())
4617ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4618ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_nargs_zeroormore_metavar_length1(self):
4619ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.do_test_no_exception(nargs="*", metavar=("1"))
4620ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4621ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_nargs_zeroormore_metavar_length2(self):
4622ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.do_test_no_exception(nargs="*", metavar=("1", "2"))
4623ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4624ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_nargs_zeroormore_metavar_length3(self):
4625ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.do_test_exception(nargs="*", metavar=("1", "2", "3"))
4626ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4627ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    # Unit tests for different values of metavar when nargs=+
4628ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4629ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_nargs_oneormore_metavar_string(self):
4630ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.do_test_no_exception(nargs="+", metavar="1")
4631ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4632ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_nargs_oneormore_metavar_length0(self):
4633ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.do_test_exception(nargs="+", metavar=tuple())
4634ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4635ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_nargs_oneormore_metavar_length1(self):
4636ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.do_test_no_exception(nargs="+", metavar=("1"))
4637ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4638ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_nargs_oneormore_metavar_length2(self):
4639ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.do_test_no_exception(nargs="+", metavar=("1", "2"))
4640ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4641ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_nargs_oneormore_metavar_length3(self):
4642ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.do_test_exception(nargs="+", metavar=("1", "2", "3"))
4643ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4644ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    # Unit tests for different values of metavar when nargs=...
4645ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4646ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_nargs_remainder_metavar_string(self):
4647ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.do_test_no_exception(nargs="...", metavar="1")
4648ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4649ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_nargs_remainder_metavar_length0(self):
4650ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.do_test_no_exception(nargs="...", metavar=tuple())
4651ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4652ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_nargs_remainder_metavar_length1(self):
4653ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.do_test_no_exception(nargs="...", metavar=("1"))
4654ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4655ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_nargs_remainder_metavar_length2(self):
4656ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.do_test_no_exception(nargs="...", metavar=("1", "2"))
4657ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4658ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_nargs_remainder_metavar_length3(self):
4659ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.do_test_no_exception(nargs="...", metavar=("1", "2", "3"))
4660ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4661ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    # Unit tests for different values of metavar when nargs=A...
4662ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4663ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_nargs_parser_metavar_string(self):
4664ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.do_test_no_exception(nargs="A...", metavar="1")
4665ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4666ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_nargs_parser_metavar_length0(self):
4667ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.do_test_exception(nargs="A...", metavar=tuple())
4668ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4669ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_nargs_parser_metavar_length1(self):
4670ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.do_test_no_exception(nargs="A...", metavar=("1"))
4671ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4672ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_nargs_parser_metavar_length2(self):
4673ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.do_test_exception(nargs="A...", metavar=("1", "2"))
4674ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4675ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_nargs_parser_metavar_length3(self):
4676ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.do_test_exception(nargs="A...", metavar=("1", "2", "3"))
4677ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4678ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    # Unit tests for different values of metavar when nargs=1
4679ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4680ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_nargs_1_metavar_string(self):
4681ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.do_test_no_exception(nargs=1, metavar="1")
4682ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4683ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_nargs_1_metavar_length0(self):
4684ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.do_test_exception(nargs=1, metavar=tuple())
4685ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4686ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_nargs_1_metavar_length1(self):
4687ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.do_test_no_exception(nargs=1, metavar=("1"))
4688ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4689ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_nargs_1_metavar_length2(self):
4690ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.do_test_exception(nargs=1, metavar=("1", "2"))
4691ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4692ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_nargs_1_metavar_length3(self):
4693ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.do_test_exception(nargs=1, metavar=("1", "2", "3"))
4694ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4695ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    # Unit tests for different values of metavar when nargs=2
4696ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4697ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_nargs_2_metavar_string(self):
4698ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.do_test_no_exception(nargs=2, metavar="1")
4699ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4700ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_nargs_2_metavar_length0(self):
4701ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.do_test_exception(nargs=2, metavar=tuple())
4702ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4703ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_nargs_2_metavar_length1(self):
4704ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.do_test_no_exception(nargs=2, metavar=("1"))
4705ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4706ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_nargs_2_metavar_length2(self):
4707ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.do_test_no_exception(nargs=2, metavar=("1", "2"))
4708ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4709ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_nargs_2_metavar_length3(self):
4710ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.do_test_exception(nargs=2, metavar=("1", "2", "3"))
4711ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4712ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    # Unit tests for different values of metavar when nargs=3
4713ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4714ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_nargs_3_metavar_string(self):
4715ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.do_test_no_exception(nargs=3, metavar="1")
4716ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4717ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_nargs_3_metavar_length0(self):
4718ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.do_test_exception(nargs=3, metavar=tuple())
4719ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4720ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_nargs_3_metavar_length1(self):
4721ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.do_test_no_exception(nargs=3, metavar=("1"))
4722ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4723ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_nargs_3_metavar_length2(self):
4724ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.do_test_exception(nargs=3, metavar=("1", "2"))
4725ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4726ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_nargs_3_metavar_length3(self):
4727ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.do_test_no_exception(nargs=3, metavar=("1", "2", "3"))
4728ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4729ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# ============================
4730ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# from argparse import * tests
4731ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# ============================
4732ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4733ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass TestImportStar(TestCase):
4734ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4735ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test(self):
4736ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for name in argparse.__all__:
4737ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.assertTrue(hasattr(argparse, name))
4738ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4739ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_all_exports_everything_but_modules(self):
4740ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        items = [
4741ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            name
4742ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            for name, value in vars(argparse).items()
4743ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            if not name.startswith("_")
4744ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            if not inspect.ismodule(value)
4745ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        ]
4746ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(sorted(items), sorted(argparse.__all__))
4747ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4748ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehdef test_main():
4749ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    # silence warnings about version argument - these are expected
4750ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    with test_support.check_warnings(
4751ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            ('The "version" argument to ArgumentParser is deprecated.',
4752ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh             DeprecationWarning),
4753ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            ('The (format|print)_version method is deprecated',
4754ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh             DeprecationWarning)):
4755ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        test_support.run_unittest(__name__)
4756ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    # Remove global references to avoid looking like we have refleaks.
4757ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    RFile.seen = {}
4758ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    WFile.seen = set()
4759ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4760ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4761ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
4762ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehif __name__ == '__main__':
4763ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    test_main()
4764