bash-completion/test/unit/_get_comp_words_by_ref.exp
Freddy Vulto bdca37a7bf Improve _get_comp_words_by_ref to return words' and cword'
Usage: _get_comp_words_by_ref [OPTIONS] [VARNAMES]
Available VARNAMES:
    cur         Return cur within varname "cur"
    prev        Return prev within varname "prev"
    words       Return words within varname "words"
    cword       Return cword within varname "cword"

Available OPTIONS:
    -n EXCLUDE  Characters out of $COMP_WORDBREAKS which should NOT be
                considered word breaks. This is useful for things like scp
                where we want to return host:path and not only path, so we
                would pass the colon (:) as -n option in this case.  Bash-3
                doesn't do word splitting, so this ensures we get the same
                word on both bash-3 and bash-4.
    -c VARNAME  Return cur within specified VARNAME
    -p VARNAME  Return prev within specified VARNAME
    -w VARNAME  Return words within specified VARNAME
    -i VARNAME  Return words within specified VARNAME

Example usage:

   $ _get_comp_words_by_ref -n : cur prev
2010-03-14 11:07:13 +01:00

387 lines
10 KiB
Plaintext

proc setup {} {
assert_bash_exec {unset COMP_CWORD COMP_LINE COMP_POINT COMP_WORDS}
save_env
}; # setup()
proc teardown {} {
assert_bash_exec { \
unset COMP_CWORD COMP_LINE COMP_POINT COMP_WORDS cur prev words cword \
cur2 prev2 words2 cword2 \
}
# Delete 'COMP_WORDBREAKS' occupying two lines
assert_env_unmodified {
/COMP_WORDBREAKS=/{N
d
}
}
}; # teardown()
setup
set test "_get_comp_words_by_ref should run without errors"
assert_bash_exec {_get_comp_words_by_ref cur > /dev/null} $test
sync_after_int
# See also ./lib/completions/alias.exp. Here `_get_cword' is actually tested
# by moving the cursor left into the current word.
set test "a b|"; # | = cursor position
set cmd {COMP_WORDS=(a b); COMP_CWORD=1; COMP_LINE='a b'; COMP_POINT=3; _get_comp_words_by_ref cur prev; echo "$cur $prev"}
assert_bash_list {"b a"} $cmd $test
sync_after_int
set test "a |"; # | = cursor position
set cmd {COMP_WORDS=(a); COMP_CWORD=1; COMP_LINE='a '; COMP_POINT=2; _get_comp_words_by_ref cur prev; echo "$cur $prev"}
assert_bash_list {" a"} $cmd $test
sync_after_int
set test "a b |"; # | = cursor position
set cmd {COMP_WORDS=(a b ''); COMP_CWORD=2; COMP_LINE='a b '; COMP_POINT=4; _get_comp_words_by_ref cur prev; echo "$cur $prev"}
assert_bash_list {" b"} $cmd $test
sync_after_int
set test "a b | with WORDBREAKS -= :"; # | = cursor position
set cmd {COMP_WORDS=(a b ''); COMP_CWORD=2; COMP_LINE='a b '; COMP_POINT=4; _get_comp_words_by_ref -n : cur; printf %s "$cur"}
assert_bash_list {} $cmd $test
sync_after_int
set test "a b|c"; # | = cursor position
set cmd {COMP_WORDS=(a bc); COMP_CWORD=1; COMP_LINE='a bc'; COMP_POINT=3; _get_comp_words_by_ref cur prev; echo "$cur $prev"}
assert_bash_list {"b a"} $cmd $test
sync_after_int
set test {a b\ c| should return b\ c}; # | = cursor position
set cmd {COMP_WORDS=(a 'b\ c'); COMP_CWORD=1; COMP_LINE='a b\ c'; COMP_POINT=6; _get_comp_words_by_ref cur prev; echo "$cur $prev"}
assert_bash_list {"b\\ c a"} $cmd $test
sync_after_int
set test {a b\| c should return b\ }; # | = cursor position
set cmd {COMP_WORDS=(a 'b\ c'); COMP_CWORD=1; COMP_LINE='a b\ c'; COMP_POINT=4; _get_comp_words_by_ref cur prev; echo "$cur $prev"}
assert_bash_list {"b\\ a"} $cmd $test
sync_after_int
set test {a "b\|}; #"# | = cursor position
set cmd {COMP_WORDS=(a '"b\'); COMP_CWORD=1; COMP_LINE='a "b\'; COMP_POINT=5; _get_comp_words_by_ref cur prev; echo "$cur $prev"}
assert_bash_list {"\"b\\ a"} $cmd $test
sync_after_int
set test {a 'b c|}; # | = cursor position
if {
[lindex $::BASH_VERSINFO 0] == 4 &&
[lindex $::BASH_VERSINFO 1] == 0 &&
[lindex $::BASH_VERSINFO 2] < 35
} {
set cmd {COMP_WORDS=(a "'" b c); COMP_CWORD=3}
} else {
set cmd {COMP_WORDS=(a "'b c"); COMP_CWORD=1}
}; # if
append cmd {; COMP_LINE="a 'b c"; COMP_POINT=6; _get_comp_words_by_ref cur prev; echo "$cur $prev"}
send "$cmd\r"
expect -ex "$cmd\r\n"
expect {
-ex "'b c a\r\n/@" { pass "$test" }
-ex "c b\r\n/@" {
if {
[lindex $::BASH_VERSINFO 0] == 4 &&
[lindex $::BASH_VERSINFO 1] == 0 &&
[lindex $::BASH_VERSINFO 2] < 35
} {xfail "$test"} {fail "$test"}
}
}; # expect
sync_after_int
set test {a "b c|}; #"# | = cursor position
if {
[lindex $::BASH_VERSINFO 0] == 4 &&
[lindex $::BASH_VERSINFO 1] == 0 &&
[lindex $::BASH_VERSINFO 2] < 35
} {
set cmd {COMP_WORDS=(a "\"" b c); COMP_CWORD=3}
} else {
set cmd {COMP_WORDS=(a "\"b c"); COMP_CWORD=1}
}; # if
append cmd {; COMP_LINE="a \"b c"; COMP_POINT=6}
assert_bash_exec $cmd
set cmd {_get_comp_words_by_ref cur prev; echo "$cur $prev"};
send "$cmd\r"
expect -ex "$cmd\r\n"
expect {
-ex "\"b c a\r\n/@" { pass "$test" }
-ex "c b\r\n/@" {
if {
[lindex $::BASH_VERSINFO 0] == 4 &&
[lindex $::BASH_VERSINFO 1] == 0 &&
[lindex $::BASH_VERSINFO 2] < 35
} {xfail "$test"} {fail "$test"}
}
}; # expect
sync_after_int
set test {a b:c| with WORDBREAKS += :}; # | = cursor position
if {[lindex $::BASH_VERSINFO 0] <= 3} {
set cmd {COMP_WORDS=(a "b:c"); COMP_CWORD=1}
set expected {"b:c a"}
} else {
set cmd {add_comp_wordbreak_char :; COMP_WORDS=(a b : c); COMP_CWORD=3}
set expected {"c :"}
}; # if
append cmd {; COMP_LINE='a b:c'; COMP_POINT=5}
# NOTE: Split-send cmd to prevent backspaces (\008) in output
assert_bash_exec $cmd $test
set cmd {_get_comp_words_by_ref cur prev; echo "$cur $prev"}
assert_bash_list $expected $cmd $test
sync_after_int
set test {a b:c| with WORDBREAKS -= :}; # | = cursor position
if {[lindex $::BASH_VERSINFO 0] <= 3} {
set cmd {COMP_WORDS=(a "b:c"); COMP_CWORD=1}
} else {
set cmd {COMP_WORDS=(a b : c); COMP_CWORD=3}
}; # if
append cmd {; COMP_LINE='a b:c'; COMP_POINT=5}
assert_bash_exec $cmd $test
set cmd {_get_comp_words_by_ref -n : cur prev; echo "$cur $prev"}
assert_bash_list {"b:c a"} $cmd $test
sync_after_int
set test {a b c:| with WORDBREAKS -= :}; # | = cursor position
if {[lindex $::BASH_VERSINFO 0] <= 3} {
set cmd {COMP_WORDS=(a b c:); COMP_CWORD=2}
} else {
set cmd {COMP_WORDS=(a b c :); COMP_CWORD=3}
}; # if
append cmd {; COMP_LINE='a b c:'; COMP_POINT=6}
assert_bash_exec $cmd $test
set cmd {_get_comp_words_by_ref -n : cur prev; echo "$cur $prev"}
assert_bash_list {"c: b"} $cmd $test
sync_after_int
set test {a :| with WORDBREAKS -= : should return :}; # | = cursor position
set cmd {COMP_WORDS=(a :); COMP_CWORD=1; COMP_LINE='a :'; COMP_POINT=3}
assert_bash_exec $cmd
set cmd {_get_comp_words_by_ref -n : cur prev; echo "$cur $prev"}
assert_bash_list {": a"} $cmd $test
sync_after_int
set test {a b::| with WORDBREAKS -= : should return b::}; # | = cursor position
if {[lindex $::BASH_VERSINFO 0] <= 3} {
set cmd {COMP_WORDS=(a "b::"); COMP_CWORD=1}
} else {
set cmd {COMP_WORDS=(a b ::); COMP_CWORD=2}
}; # if
append cmd {; COMP_LINE='a b::'; COMP_POINT=5}
assert_bash_exec $cmd
set cmd {_get_comp_words_by_ref -n : cur prev; echo "$cur $prev"}
assert_bash_list {"b:: a"} $cmd $test
sync_after_int
# This test makes sure `_get_cword' doesn't use `echo' to return it's value,
# because -n might be interpreted by `echo' and thus will not be returned.
set test "a -n| should return -n"; # | = cursor position
set cmd {COMP_WORDS=(a -n); COMP_CWORD=1; COMP_LINE='a -n'; COMP_POINT=4}
assert_bash_exec $cmd
set cmd {_get_comp_words_by_ref cur; printf %s $cur}
assert_bash_list -n $cmd $test
sync_after_int
set test {a b>c| should return c}; # | = cursor position
set cmd {COMP_WORDS=(a b \> c); COMP_CWORD=3; COMP_LINE='a b>c'; COMP_POINT=5}
assert_bash_exec $cmd
set cmd {_get_comp_words_by_ref cur prev; echo "$cur"}
assert_bash_list c $cmd $test
sync_after_int
set test {a b=c| should return b=c (bash-3) or c (bash-4)}; # | = cursor position
if {[lindex $::BASH_VERSINFO] <= 3} {
set cmd {COMP_WORDS=(a "b=c"); COMP_CWORD=1}
set expected b=c
} else {
set cmd {COMP_WORDS=(a b = c); COMP_CWORD=3}
set expected c
}; # if
append cmd {; COMP_LINE='a b=c'; COMP_POINT=5}
assert_bash_exec $cmd
set cmd {_get_comp_words_by_ref cur prev; echo "$cur"}
assert_bash_list $expected $cmd $test
sync_after_int
set test {a *| should return *}; # | = cursor position
set cmd {COMP_WORDS=(a \*); COMP_CWORD=1; COMP_LINE='a *'; COMP_POINT=4}
assert_bash_exec $cmd
set cmd {_get_comp_words_by_ref cur; echo "$cur"}
assert_bash_list * $cmd $test
sync_after_int
set test {a $(b c| should return $(b c}; # | = cursor position
set cmd {COMP_WORDS=(a '$(b c'); COMP_CWORD=1; COMP_LINE='a $(b c'; COMP_POINT=7}
assert_bash_exec $cmd
set cmd {_get_comp_words_by_ref cur; printf %s "$cur"}
send "$cmd\r"
expect -ex "$cmd\r\n"
expect {
-ex "\$(b c/@" { pass "$test" }
# Expected failure on bash-4
-ex "c/@" { xfail "$test" }
}; # expect
sync_after_int
set test {a $(b c\ d| should return $(b c\ d}; # | = cursor position
set cmd {COMP_WORDS=(a '$(b c\ d'); COMP_CWORD=1; COMP_LINE='a $(b c\ d'; COMP_POINT=10}
assert_bash_exec $cmd
set cmd {_get_comp_words_by_ref cur; printf %s "$cur"}
#assert_bash_list {{$(b\ c\\\ d}} $cmd $test
send "$cmd\r"
expect -ex "$cmd\r\n"
expect {
-ex "\$(b c\\ d/@" { pass "$test" }
# Expected failure on bash-4
-ex "c\\ d/@" { xfail "$test" }
}; # expect
sync_after_int
set test {a 'b&c| should return 'b&c}; # | = cursor position
if {
[lindex $::BASH_VERSINFO 0] == 4 &&
[lindex $::BASH_VERSINFO 1] == 0 &&
[lindex $::BASH_VERSINFO 2] < 35
} {
set cmd {COMP_WORDS=(a "'" b "&" c); COMP_CWORD=4}
} else {
set cmd {COMP_WORDS=(a "'b&c"); COMP_CWORD=1}
}; # if
append cmd {; COMP_LINE="a 'b&c"; COMP_POINT=6}
assert_bash_exec $cmd
set cmd {_get_comp_words_by_ref cur prev; printf %s "$cur"}
send "$cmd\r"
expect -ex "$cmd\r\n"
expect {
-ex "'b&c/@" { pass "$test" }
-ex "c/@" {
if {
[lindex $::BASH_VERSINFO 0] == 4 &&
[lindex $::BASH_VERSINFO 1] == 0 &&
[lindex $::BASH_VERSINFO 2] < 35
} {xfail "$test"} {fail "$test"}
}
}; # expect
sync_after_int
set test {unknown argument should raise error}
set cmd {_get_comp_words_by_ref dummy}
assert_bash_list {"error: __get_comp_words_by_ref(): unknown argument: dummy"} $cmd $test
sync_after_int
set test "a b| to all vars"; # | = cursor position
set cmd {COMP_WORDS=(a b); COMP_CWORD=1; COMP_LINE='a b'; COMP_POINT=3}
assert_bash_exec $cmd
set cmd { \
_get_comp_words_by_ref words cword prev cur; echo "${words[@]} $cword $cur $prev" \
}
assert_bash_list {"a b 1 b a"} $cmd $test
sync_after_int
set test "a b| to alternate vars"; # | = cursor position
set cmd {COMP_WORDS=(a b); COMP_CWORD=1; COMP_LINE='a b'; COMP_POINT=3;}
assert_bash_exec $cmd
set cmd {_get_comp_words_by_ref -c cur2 -p prev2 -w words2 -i cword2}
assert_bash_exec $cmd
set cmd {echo "$cur2 $prev2 ${words2[@]} $cword2"}
assert_bash_list {"b a a b 1"} $cmd $test
sync_after_int
set test "a b| to alternate vars"; # | = cursor position
set cmd {COMP_WORDS=(a b); COMP_CWORD=1; COMP_LINE='a b'; COMP_POINT=3;}
assert_bash_exec $cmd
set cmd {_get_comp_words_by_ref -c cur2 -p prev2 -w words2 -i cword2}
assert_bash_exec $cmd
set cmd {echo "$cur2 $prev2 ${words2[@]} $cword2"}
assert_bash_list {"b a a b 1"} $cmd $test
sync_after_int
teardown