diff options
Diffstat (limited to 'tests/test_argparse_completer.py')
-rw-r--r-- | tests/test_argparse_completer.py | 270 |
1 files changed, 136 insertions, 134 deletions
diff --git a/tests/test_argparse_completer.py b/tests/test_argparse_completer.py index f3f37c4e..efda7660 100644 --- a/tests/test_argparse_completer.py +++ b/tests/test_argparse_completer.py @@ -122,30 +122,43 @@ class ArgparseCompleterTester(cmd2.Cmd): choices_parser = Cmd2ArgumentParser() # Flag args for choices command. Include string and non-string arg types. - choices_parser.add_argument("-l", "--list", help="a flag populated with a choices list", - choices=static_choices_list) - choices_parser.add_argument("-p", "--provider", help="a flag populated with a choices provider", - choices_provider=choices_provider) - choices_parser.add_argument('-d', "--desc_header", help='this arg has a descriptive header', - choices_provider=completion_item_method, - descriptive_header=CUSTOM_DESC_HEADER) - choices_parser.add_argument('-n', "--no_header", help='this arg has no descriptive header', - choices_provider=completion_item_method, metavar=STR_METAVAR) - choices_parser.add_argument('-t', "--tuple_metavar", help='this arg has tuple for a metavar', - choices_provider=completion_item_method, metavar=TUPLE_METAVAR, - nargs=argparse.ONE_OR_MORE) - choices_parser.add_argument('-i', '--int', type=int, help='a flag with an int type', - choices=int_choices) + choices_parser.add_argument("-l", "--list", help="a flag populated with a choices list", choices=static_choices_list) + choices_parser.add_argument( + "-p", "--provider", help="a flag populated with a choices provider", choices_provider=choices_provider + ) + choices_parser.add_argument( + '-d', + "--desc_header", + help='this arg has a descriptive header', + choices_provider=completion_item_method, + descriptive_header=CUSTOM_DESC_HEADER, + ) + choices_parser.add_argument( + '-n', + "--no_header", + help='this arg has no descriptive header', + choices_provider=completion_item_method, + metavar=STR_METAVAR, + ) + choices_parser.add_argument( + '-t', + "--tuple_metavar", + help='this arg has tuple for a metavar', + choices_provider=completion_item_method, + metavar=TUPLE_METAVAR, + nargs=argparse.ONE_OR_MORE, + ) + choices_parser.add_argument('-i', '--int', type=int, help='a flag with an int type', choices=int_choices) # Positional args for choices command - choices_parser.add_argument("list_pos", help="a positional populated with a choices list", - choices=static_choices_list) - choices_parser.add_argument("method_pos", help="a positional populated with a choices provider", - choices_provider=choices_provider) - choices_parser.add_argument('non_negative_int', type=int, help='a positional with non-negative int choices', - choices=non_negative_int_choices) - choices_parser.add_argument('empty_choices', help='a positional with empty choices', - choices=[]) + choices_parser.add_argument("list_pos", help="a positional populated with a choices list", choices=static_choices_list) + choices_parser.add_argument( + "method_pos", help="a positional populated with a choices provider", choices_provider=choices_provider + ) + choices_parser.add_argument( + 'non_negative_int', type=int, help='a positional with non-negative int choices', choices=non_negative_int_choices + ) + choices_parser.add_argument('empty_choices', help='a positional with empty choices', choices=[]) @with_argparser(choices_parser) def do_choices(self, args: argparse.Namespace) -> None: @@ -170,14 +183,11 @@ class ArgparseCompleterTester(cmd2.Cmd): completer_parser = Cmd2ArgumentParser() # Flag args for completer command - completer_parser.add_argument("-c", "--completer", help="a flag using a completer", - completer=flag_completer) + completer_parser.add_argument("-c", "--completer", help="a flag using a completer", completer=flag_completer) # Positional args for completer command - completer_parser.add_argument("pos_1", help="a positional using a completer method", - completer=pos_1_completer) - completer_parser.add_argument("pos_2", help="a positional using a completer method", - completer=pos_2_completer) + completer_parser.add_argument("pos_1", help="a positional using a completer method", completer=pos_1_completer) + completer_parser.add_argument("pos_2", help="a positional using a completer method", completer=pos_2_completer) @with_argparser(completer_parser) def do_completer(self, args: argparse.Namespace) -> None: @@ -245,10 +255,8 @@ class ArgparseCompleterTester(cmd2.Cmd): raise CompletionError('choice broke something') comp_error_parser = Cmd2ArgumentParser() - comp_error_parser.add_argument('completer_pos', help='positional arg', - completer=completer_raise_error) - comp_error_parser.add_argument('--choice', help='flag arg', - choices_provider=choice_raise_error) + comp_error_parser.add_argument('completer_pos', help='positional arg', completer=completer_raise_error) + comp_error_parser.add_argument('--choice', help='flag arg', choices_provider=choice_raise_error) @with_argparser(comp_error_parser) def do_raise_completion_error(self, args: argparse.Namespace) -> None: @@ -261,8 +269,9 @@ class ArgparseCompleterTester(cmd2.Cmd): """Choices function that receives arg_tokens from ArgparseCompleter""" return [arg_tokens['parent_arg'][0], arg_tokens['subcommand'][0]] - def completer_takes_arg_tokens(self, text: str, line: str, begidx: int, endidx: int, - arg_tokens: argparse.Namespace) -> List[str]: + def completer_takes_arg_tokens( + self, text: str, line: str, begidx: int, endidx: int, arg_tokens: argparse.Namespace + ) -> List[str]: """Completer function that receives arg_tokens from ArgparseCompleter""" match_against = [arg_tokens['parent_arg'][0], arg_tokens['subcommand'][0]] return self.basic_complete(text, line, begidx, endidx, match_against) @@ -516,20 +525,24 @@ def test_autcomp_flag_completion(ac_app, command_and_args, text, completion_matc else: assert first_match is None - assert (ac_app.completion_matches == sorted(completion_matches, key=ac_app.default_sort_key) and - ac_app.display_matches == sorted(display_matches, key=ac_app.default_sort_key)) + assert ac_app.completion_matches == sorted( + completion_matches, key=ac_app.default_sort_key + ) and ac_app.display_matches == sorted(display_matches, key=ac_app.default_sort_key) -@pytest.mark.parametrize('flag, text, completions', [ - ('-l', '', ArgparseCompleterTester.static_choices_list), - ('--list', 's', ['static', 'stop']), - ('-p', '', ArgparseCompleterTester.choices_from_provider), - ('--provider', 'pr', ['provider', 'probably']), - ('-i', '', ArgparseCompleterTester.int_choices), - ('--int', '1', ['1 ']), - ('--int', '-', [-1, -2, -12]), - ('--int', '-1', [-1, -12]) -]) +@pytest.mark.parametrize( + 'flag, text, completions', + [ + ('-l', '', ArgparseCompleterTester.static_choices_list), + ('--list', 's', ['static', 'stop']), + ('-p', '', ArgparseCompleterTester.choices_from_provider), + ('--provider', 'pr', ['provider', 'probably']), + ('-i', '', ArgparseCompleterTester.int_choices), + ('--int', '1', ['1 ']), + ('--int', '-', [-1, -2, -12]), + ('--int', '-1', [-1, -12]), + ], +) def test_autocomp_flag_choices_completion(ac_app, flag, text, completions): line = 'choices {} {}'.format(flag, text) endidx = len(line) @@ -551,15 +564,18 @@ def test_autocomp_flag_choices_completion(ac_app, flag, text, completions): assert ac_app.completion_matches == completions -@pytest.mark.parametrize('pos, text, completions', [ - (1, '', ArgparseCompleterTester.static_choices_list), - (1, 's', ['static', 'stop']), - (2, '', ArgparseCompleterTester.choices_from_provider), - (2, 'pr', ['provider', 'probably']), - (3, '', ArgparseCompleterTester.non_negative_int_choices), - (3, '2', [2, 22]), - (4, '', []), -]) +@pytest.mark.parametrize( + 'pos, text, completions', + [ + (1, '', ArgparseCompleterTester.static_choices_list), + (1, 's', ['static', 'stop']), + (2, '', ArgparseCompleterTester.choices_from_provider), + (2, 'pr', ['provider', 'probably']), + (3, '', ArgparseCompleterTester.non_negative_int_choices), + (3, '2', [2, 22]), + (4, '', []), + ], +) def test_autocomp_positional_choices_completion(ac_app, pos, text, completions): # Generate line were preceding positionals are already filled line = 'choices {} {}'.format('foo ' * (pos - 1), text) @@ -603,10 +619,10 @@ def test_flag_sorting(ac_app): assert first_match is not None and ac_app.completion_matches == option_strings -@pytest.mark.parametrize('flag, text, completions', [ - ('-c', '', ArgparseCompleterTester.completions_for_flag), - ('--completer', 'f', ['flag', 'fairly']) -]) +@pytest.mark.parametrize( + 'flag, text, completions', + [('-c', '', ArgparseCompleterTester.completions_for_flag), ('--completer', 'f', ['flag', 'fairly'])], +) def test_autocomp_flag_completers(ac_app, flag, text, completions): line = 'completer {} {}'.format(flag, text) endidx = len(line) @@ -621,12 +637,15 @@ def test_autocomp_flag_completers(ac_app, flag, text, completions): assert ac_app.completion_matches == sorted(completions, key=ac_app.default_sort_key) -@pytest.mark.parametrize('pos, text, completions', [ - (1, '', ArgparseCompleterTester.completions_for_pos_1), - (1, 'p', ['positional_1', 'probably']), - (2, '', ArgparseCompleterTester.completions_for_pos_2), - (2, 'm', ['missed', 'me']), -]) +@pytest.mark.parametrize( + 'pos, text, completions', + [ + (1, '', ArgparseCompleterTester.completions_for_pos_1), + (1, 'p', ['positional_1', 'probably']), + (2, '', ArgparseCompleterTester.completions_for_pos_2), + (2, 'm', ['missed', 'me']), + ], +) def test_autocomp_positional_completers(ac_app, pos, text, completions): # Generate line were preceding positionals are already filled line = 'completer {} {}'.format('foo ' * (pos - 1), text) @@ -705,71 +724,57 @@ def test_completion_items(ac_app, num_aliases, show_description): assert ('help' in ac_app.display_matches[0]) == show_description -@pytest.mark.parametrize('args, completions', [ - # Flag with nargs = 2 - ('--set_value', ArgparseCompleterTester.set_value_choices), - ('--set_value set', ['value', 'choices']), - - # Both args are filled. At positional arg now. - ('--set_value set value', ArgparseCompleterTester.positional_choices), - - # Using the flag again will reset the choices available - ('--set_value set value --set_value', ArgparseCompleterTester.set_value_choices), - - # Flag with nargs = ONE_OR_MORE - ('--one_or_more', ArgparseCompleterTester.one_or_more_choices), - ('--one_or_more one', ['or', 'more', 'choices']), - - # Flag with nargs = OPTIONAL - ('--optional', ArgparseCompleterTester.optional_choices), - - # Only one arg allowed for an OPTIONAL. At positional now. - ('--optional optional', ArgparseCompleterTester.positional_choices), - - # Flag with nargs range (1, 2) - ('--range', ArgparseCompleterTester.range_choices), - ('--range some', ['range', 'choices']), - - # Already used 2 args so at positional - ('--range some range', ArgparseCompleterTester.positional_choices), - - # Flag with nargs = REMAINDER - ('--remainder', ArgparseCompleterTester.remainder_choices), - ('--remainder remainder ', ['choices ']), - - # No more flags can appear after a REMAINDER flag) - ('--remainder choices --set_value', ['remainder ']), - - # Double dash ends the current flag - ('--range choice --', ArgparseCompleterTester.positional_choices), - - # Double dash ends a REMAINDER flag - ('--remainder remainder --', ArgparseCompleterTester.positional_choices), - - # No more flags after a double dash - ('-- --one_or_more ', ArgparseCompleterTester.positional_choices), - - # Consume positional - ('', ArgparseCompleterTester.positional_choices), - ('positional', ['the', 'choices']), - - # Intermixed flag and positional - ('positional --set_value', ArgparseCompleterTester.set_value_choices), - ('positional --set_value set', ['choices', 'value']), - - # Intermixed flag and positional with flag finishing - ('positional --set_value set value', ['the', 'choices']), - ('positional --range choice --', ['the', 'choices']), - - # REMAINDER positional - ('the positional', ArgparseCompleterTester.remainder_choices), - ('the positional remainder', ['choices ']), - ('the positional remainder choices', []), - - # REMAINDER positional. Flags don't work in REMAINDER - ('the positional --set_value', ArgparseCompleterTester.remainder_choices), - ('the positional remainder --set_value', ['choices ']) -]) +@pytest.mark.parametrize( + 'args, completions', + [ + # Flag with nargs = 2 + ('--set_value', ArgparseCompleterTester.set_value_choices), + ('--set_value set', ['value', 'choices']), + # Both args are filled. At positional arg now. + ('--set_value set value', ArgparseCompleterTester.positional_choices), + # Using the flag again will reset the choices available + ('--set_value set value --set_value', ArgparseCompleterTester.set_value_choices), + # Flag with nargs = ONE_OR_MORE + ('--one_or_more', ArgparseCompleterTester.one_or_more_choices), + ('--one_or_more one', ['or', 'more', 'choices']), + # Flag with nargs = OPTIONAL + ('--optional', ArgparseCompleterTester.optional_choices), + # Only one arg allowed for an OPTIONAL. At positional now. + ('--optional optional', ArgparseCompleterTester.positional_choices), + # Flag with nargs range (1, 2) + ('--range', ArgparseCompleterTester.range_choices), + ('--range some', ['range', 'choices']), + # Already used 2 args so at positional + ('--range some range', ArgparseCompleterTester.positional_choices), + # Flag with nargs = REMAINDER + ('--remainder', ArgparseCompleterTester.remainder_choices), + ('--remainder remainder ', ['choices ']), + # No more flags can appear after a REMAINDER flag) + ('--remainder choices --set_value', ['remainder ']), + # Double dash ends the current flag + ('--range choice --', ArgparseCompleterTester.positional_choices), + # Double dash ends a REMAINDER flag + ('--remainder remainder --', ArgparseCompleterTester.positional_choices), + # No more flags after a double dash + ('-- --one_or_more ', ArgparseCompleterTester.positional_choices), + # Consume positional + ('', ArgparseCompleterTester.positional_choices), + ('positional', ['the', 'choices']), + # Intermixed flag and positional + ('positional --set_value', ArgparseCompleterTester.set_value_choices), + ('positional --set_value set', ['choices', 'value']), + # Intermixed flag and positional with flag finishing + ('positional --set_value set value', ['the', 'choices']), + ('positional --range choice --', ['the', 'choices']), + # REMAINDER positional + ('the positional', ArgparseCompleterTester.remainder_choices), + ('the positional remainder', ['choices ']), + ('the positional remainder choices', []), + # REMAINDER positional. Flags don't work in REMAINDER + ('the positional --set_value', ArgparseCompleterTester.remainder_choices), + ('the positional remainder --set_value', ['choices ']), + ], +) def test_autcomp_nargs(ac_app, args, completions): text = '' line = 'nargs {} {}'.format(args, text) @@ -1105,10 +1110,7 @@ def test_complete_command_help_no_tokens(ac_app): assert not completions -@pytest.mark.parametrize('flag, completions', [ - ('--provider', standalone_choices), - ('--completer', standalone_completions) -]) +@pytest.mark.parametrize('flag, completions', [('--provider', standalone_choices), ('--completer', standalone_completions)]) def test_complete_standalone(ac_app, flag, completions): text = '' line = 'standalone {} {}'.format(flag, text) |