diff options
Diffstat (limited to 'test/t/unit/test_unit_count_args.py')
-rw-r--r-- | test/t/unit/test_unit_count_args.py | 134 |
1 files changed, 119 insertions, 15 deletions
diff --git a/test/t/unit/test_unit_count_args.py b/test/t/unit/test_unit_count_args.py index 56bce2c..7b018e4 100644 --- a/test/t/unit/test_unit_count_args.py +++ b/test/t/unit/test_unit_count_args.py @@ -4,63 +4,167 @@ from conftest import TestUnitBase, assert_bash_exec @pytest.mark.bashcomp( - cmd=None, ignore_env=r"^[+-](args|COMP_(WORDS|CWORD|LINE|POINT))=" + cmd=None, + ignore_env=r"^[+-](REPLY|cword|words|COMP_(WORDS|CWORD|LINE|POINT))=", ) class TestUnitCountArgs(TestUnitBase): + @pytest.fixture + def functions(self, bash): + assert_bash_exec( + bash, + '_comp__test_unit() { local -a words=(); local cword REPLY=""; _comp__reassemble_words "<>&" words cword; _comp_count_args "$@"; echo "$REPLY"; }', + ) + def _test(self, *args, **kwargs): - return self._test_unit("_count_args %s; echo $args", *args, **kwargs) + return self._test_unit("_comp__test_unit %s", *args, **kwargs) def test_1(self, bash): - assert_bash_exec(bash, "COMP_CWORD= _count_args >/dev/null") + assert_bash_exec( + bash, + 'COMP_LINE= COMP_POINT=0 COMP_WORDS=() COMP_CWORD=; _comp_count_args -n ""', + ) - def test_2(self, bash): + def test_2(self, bash, functions): """a b| should set args to 1""" output = self._test(bash, "(a b)", 1, "a b", 3) assert output == "1" - def test_3(self, bash): + def test_3(self, bash, functions): """a b|c should set args to 1""" output = self._test(bash, "(a bc)", 1, "a bc", 3) assert output == "1" - def test_4(self, bash): + def test_4(self, bash, functions): """a b c| should set args to 2""" output = self._test(bash, "(a b c)", 2, "a b c", 4) assert output == "2" - def test_5(self, bash): + def test_5(self, bash, functions): """a b| c should set args to 1""" output = self._test(bash, "(a b c)", 1, "a b c", 3) assert output == "1" - def test_6(self, bash): + def test_6(self, bash, functions): """a b -c| d should set args to 2""" output = self._test(bash, "(a b -c d)", 2, "a b -c d", 6) assert output == "2" - def test_7(self, bash): + def test_7(self, bash, functions): """a b -c d e| with -c arg excluded should set args to 2""" output = self._test( - bash, "(a b -c d e)", 4, "a b -c d e", 10, arg='"" "@(-c|--foo)"' + bash, "(a b -c d e)", 4, "a b -c d e", 10, arg='-a "@(-c|--foo)"' ) assert output == "2" - def test_8(self, bash): + def test_8(self, bash, functions): """a -b -c d e| with -c arg excluded - and -b included should set args to 1""" + and -b included should set args to 1""" output = self._test( bash, "(a -b -c d e)", 4, "a -b -c d e", 11, - arg='"" "@(-c|--foo)" "-[b]"', + arg='-a "@(-c|--foo)" -i "-[b]"', ) assert output == "2" - def test_9(self, bash): + def test_9(self, bash, functions): """a -b -c d e| with -b included should set args to 3""" output = self._test( - bash, "(a -b -c d e)", 4, "a -b -c d e", 11, arg='"" "" "-b"' + bash, "(a -b -c d e)", 4, "a -b -c d e", 11, arg='-i "-b"' + ) + assert output == "3" + + def test_10_single_hyphen_1(self, bash): + """- should be counted as an argument representing stdout/stdin""" + output = self._test(bash, "(a -b - c -d e)", 5, "a -b - c -d e", 12) + assert output == "3" + + def test_10_single_hyphen_2(self, bash): + """- in an option argument should be skipped""" + output = self._test( + bash, "(a -b - c - e)", 5, "a -b - c - e", 11, arg='-a "-b"' + ) + assert output == "3" + + def test_11_double_hyphen_1(self, bash): + """all the words after -- should be counted""" + output = self._test( + bash, "(a -b -- -c -d e)", 5, "a -b -- -c -d e", 14 ) assert output == "3" + + def test_11_double_hyphen_2(self, bash): + """all the words after -- should be counted""" + output = self._test(bash, "(a b -- -c -d e)", 5, "a b -- -c -d e", 13) + assert output == "4" + + def test_12_exclude_optarg_1(self, bash): + """an option argument should be skipped even if it matches the argument pattern""" + output = self._test( + bash, "(a -o -x b c)", 4, "a -o -x b c", 10, arg='-a "-o" -i "-x"' + ) + assert output == "2" + + def test_12_exclude_optarg_2(self, bash): + """an option argument should be skipped even if it matches the argument pattern""" + output = self._test( + bash, + "(a -o -x -x c)", + 4, + "a -o -x -x c", + 11, + arg='-a "-o" -i "-x"', + ) + assert output == "2" + + def test_12_exclude_optarg_3(self, bash): + """an option argument should be skipped even if it matches the argument pattern""" + output = self._test( + bash, + "(a -o -x -y c)", + 4, + "a -o -x -y c", + 11, + arg='-a "-o" -i "-x"', + ) + assert output == "1" + + def test_13_plus_option_optarg(self, bash): + """When +o is specified to be an option taking an option argument, it should not be counted as an argument""" + output = self._test( + bash, "(a +o b c)", 3, "a +o b c", 7, arg='-a "+o"' + ) + assert output == "1" + + def test_14_no_optarg_chain_1(self, bash): + """an option argument should not take another option argument""" + output = self._test( + bash, "(a -o -o -o -o c)", 5, "a -o -o -o -o c", 14, arg='-a "-o"' + ) + assert output == "1" + + def test_14_no_optarg_chain_2(self, bash): + """an option argument should not take another option argument""" + output = self._test( + bash, + "(a -o -o b -o -o c)", + 6, + "a -o -o b -o -o c", + 16, + arg='-a "-o"', + ) + assert output == "2" + + def test_15_double_hyphen_optarg(self, bash): + """-- should lose its meaning when it is an option argument""" + output = self._test( + bash, "(a -o -- -b -c d)", 5, "a -o -- -b -c d", 14, arg='-a "-o"' + ) + assert output == "1" + + def test_16_empty_word(self, bash): + """An empty word should not take an option argument""" + output = self._test(bash, "(a '' x '' y d)", 5, "a x y d", 8) + assert output == "5" |