diff options
Diffstat (limited to 'test/t/unit/test_unit_compgen.py')
-rw-r--r-- | test/t/unit/test_unit_compgen.py | 173 |
1 files changed, 173 insertions, 0 deletions
diff --git a/test/t/unit/test_unit_compgen.py b/test/t/unit/test_unit_compgen.py new file mode 100644 index 0000000..cfdec8e --- /dev/null +++ b/test/t/unit/test_unit_compgen.py @@ -0,0 +1,173 @@ +import pytest +import re + +from conftest import assert_bash_exec, bash_env_saved, assert_complete + + +@pytest.mark.bashcomp(cmd=None) +class TestUtilCompgen: + @pytest.fixture + def functions(self, bash): + assert_bash_exec( + bash, + "_comp__test_dump() { ((${#arr[@]})) && printf '<%s>' \"${arr[@]}\"; echo; }", + ) + assert_bash_exec( + bash, + '_comp__test_compgen() { local -a arr=(00); _comp_compgen -v arr "$@"; _comp__test_dump; }', + ) + assert_bash_exec( + bash, + '_comp__test_words() { local -a input=("${@:1:$#-1}"); _comp__test_compgen -c "${@:$#}" -- -W \'${input[@]+"${input[@]}"}\'; }', + ) + assert_bash_exec( + bash, + '_comp__test_words_ifs() { local input=$2; _comp__test_compgen -F "$1" -c "${@:$#}" -- -W \'$input\'; }', + ) + + assert_bash_exec( + bash, + '_comp_cmd_fc() { _comp_compgen -c "$(_get_cword)" -C _filedir filedir; }; ' + "complete -F _comp_cmd_fc fc; " + "complete -F _comp_cmd_fc -o filenames fc2", + ) + assert_bash_exec( + bash, + '_comp_cmd_fcd() { _comp_compgen -c "$(_get_cword)" -C _filedir filedir -d; }; ' + "complete -F _comp_cmd_fcd fcd", + ) + + # test_8_option_U + assert_bash_exec( + bash, + "_comp_compgen_gen8() { local -a arr=(x y z); _comp_compgen -U arr -- -W '\"${arr[@]}\"'; }", + ) + + # test_9_inherit_a + assert_bash_exec( + bash, + '_comp_compgen_gen9sub() { local -a gen=(00); _comp_compgen -v gen -- -W 11; _comp_compgen_set "${gen[@]}"; }; ' + "_comp_compgen_gen9() { _comp_compgen_gen9sub; _comp_compgen -a gen9sub; }", + ) + + def test_1_basic(self, bash, functions): + output = assert_bash_exec( + bash, "_comp__test_words 12 34 56 ''", want_output=True + ) + assert output.strip() == "<12><34><56>" + + def test_2_space(self, bash, functions): + output = assert_bash_exec( + bash, + "_comp__test_words $'a b' $'c d\\t' ' e ' $'\\tf\\t' ''", + want_output=True, + ) + assert output.strip() == "<a b><c d\t>< e ><\tf\t>" + + def test_2_IFS(self, bash, functions): + with bash_env_saved(bash) as bash_env: + bash_env.write_variable("IFS", "34") + output = assert_bash_exec( + bash, "_comp__test_words 12 34 56 ''", want_output=True + ) + assert output.strip() == "<12><34><56>" + + def test_3_glob(self, bash, functions): + output = assert_bash_exec( + bash, + "_comp__test_words '*' '[a-z]*' '[a][b][c]' ''", + want_output=True, + ) + assert output.strip() == "<*><[a-z]*><[a][b][c]>" + + def test_3_failglob(self, bash, functions): + with bash_env_saved(bash) as bash_env: + bash_env.shopt("failglob", True) + output = assert_bash_exec( + bash, + "_comp__test_words '*' '[a-z]*' '[a][b][c]' ''", + want_output=True, + ) + assert output.strip() == "<*><[a-z]*><[a][b][c]>" + + def test_3_nullglob(self, bash, functions): + with bash_env_saved(bash) as bash_env: + bash_env.shopt("nullglob", True) + output = assert_bash_exec( + bash, + "_comp__test_words '*' '[a-z]*' '[a][b][c]' ''", + want_output=True, + ) + assert output.strip() == "<*><[a-z]*><[a][b][c]>" + + def test_4_empty(self, bash, functions): + output = assert_bash_exec( + bash, "_comp__test_words ''", want_output=True + ) + assert output.strip() == "" + + def test_5_option_F(self, bash, functions): + output = assert_bash_exec( + bash, + "_comp__test_words_ifs '25' ' 123 456 555 ' ''", + want_output=True, + ) + assert output.strip() == "< 1><3 4><6 >< >" + + def test_6_option_C_1(self, bash, functions): + output = assert_bash_exec( + bash, + "_comp__test_compgen -c a -C _filedir filedir", + want_output=True, + ) + set1 = set(re.findall(r"<[^<>]*>", output.strip())) + assert set1 == {"<a b>", "<a$b>", "<a&b>", "<a'b>", "<ab>", "<aƩ>"} + + def test_6_option_C_2(self, bash, functions): + output = assert_bash_exec( + bash, + "_comp__test_compgen -c b -C _filedir -- -d", + want_output=True, + ) + assert output.strip() == "<brackets>" + + @pytest.mark.parametrize("funcname", "fc fc2".split()) + def test_6_option_C_3(self, bash, functions, funcname): + completion = assert_complete(bash, "%s _filedir ab/" % funcname) + assert completion == "e" + + @pytest.mark.complete(r"fcd a\ ") + def test_6_option_C_4(self, functions, completion): + # Note: we are not in the original directory that "b" exists, so Bash + # will not suffix a slash to the directory name. + assert completion == "b" + + def test_7_icmd(self, bash, functions): + with bash_env_saved(bash) as bash_env: + bash_env.write_variable( + "BASH_COMPLETION_USER_DIR", "$PWD/_comp_compgen", quote=False + ) + + completions = assert_complete(bash, "compgen-cmd1 '") + assert completions == ["012", "123", "234", "5abc", "6def", "7ghi"] + + def test_7_xcmd(self, bash, functions): + with bash_env_saved(bash) as bash_env: + bash_env.write_variable( + "BASH_COMPLETION_USER_DIR", "$PWD/_comp_compgen", quote=False + ) + + completions = assert_complete(bash, "compgen-cmd2 '") + assert completions == ["012", "123", "234", "5foo", "6bar", "7baz"] + + def test_8_option_U(self, bash, functions): + output = assert_bash_exec( + bash, "_comp__test_compgen gen8", want_output=True + ) + assert output.strip() == "<x><y><z>" + + def test_9_inherit_a(self, bash, functions): + output = assert_bash_exec( + bash, "_comp__test_compgen gen9", want_output=True + ) + assert output.strip() == "<11><11>" |