summaryrefslogtreecommitdiffstats
path: root/test/t/unit/test_unit_count_args.py
diff options
context:
space:
mode:
Diffstat (limited to 'test/t/unit/test_unit_count_args.py')
-rw-r--r--test/t/unit/test_unit_count_args.py134
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"