(testsuite) Improved removing cword from cmd
- Refactored code to new function `_remove_cword_from_cmd()' - Added `cword' parameter to `assert_complete()' and `assert_complete_dir()': @param string $cword (optional) Last argument of $cmd which is an argument-to-complete and to be replaced with the longest common prefix of $expected. If empty string (default), `assert_complete' autodetects if the last argument is an argument-to-complete by checking if $cmd doesn't end with whitespace. Specifying `cword' is only necessary if this autodetection fails, e.g. when the last whitespace is escaped or quoted, e.g. "finger foo\ " or "finger 'foo "
This commit is contained in:
parent
573844daa2
commit
8a80987373
@ -102,8 +102,15 @@ proc assert_bash_list {expected cmd {test ""} {prompt /@} {size 20}} {
|
|||||||
# @param string $test (optional) Test titel. Default is "$cmd<TAB> should show completions"
|
# @param string $test (optional) Test titel. Default is "$cmd<TAB> should show completions"
|
||||||
# @param string $prompt (optional) Bash prompt. Default is "/@"
|
# @param string $prompt (optional) Bash prompt. Default is "/@"
|
||||||
# @param integer $size (optional) Chunk size. Default is 20.
|
# @param integer $size (optional) Chunk size. Default is 20.
|
||||||
|
# @param string $cword (optional) Last argument of $cmd which is an
|
||||||
|
# argument-to-complete and to be replaced with the longest common prefix
|
||||||
|
# of $expected. If empty string (default), `assert_complete' autodetects
|
||||||
|
# if the last argument is an argument-to-complete by checking if $cmd
|
||||||
|
# doesn't end with whitespace. Specifying `cword' is only necessary if
|
||||||
|
# this autodetection fails, e.g. when the last whitespace is escaped or
|
||||||
|
# quoted, e.g. "finger foo\ " or "finger 'foo "
|
||||||
# @result boolean True if successful, False if not
|
# @result boolean True if successful, False if not
|
||||||
proc assert_complete {expected cmd {test ""} {prompt /@} {size 20}} {
|
proc assert_complete {expected cmd {test ""} {prompt /@} {size 20} {cword ""}} {
|
||||||
if {$test == ""} {set test "$cmd should show completions"}
|
if {$test == ""} {set test "$cmd should show completions"}
|
||||||
send "$cmd\t"
|
send "$cmd\t"
|
||||||
if {[llength $expected] == 1} {
|
if {[llength $expected] == 1} {
|
||||||
@ -126,12 +133,13 @@ proc assert_complete {expected cmd {test ""} {prompt /@} {size 20}} {
|
|||||||
if {[llength $expected] == 1} {
|
if {[llength $expected] == 1} {
|
||||||
pass "$test"
|
pass "$test"
|
||||||
} else {
|
} else {
|
||||||
# Remove optional (partial) argument from `cmd'.
|
# Remove optional (partial) last argument-to-complete from `cmd',
|
||||||
# E.g. "finger test@" becomes "finger"
|
# E.g. "finger test@" becomes "finger"
|
||||||
set cmd2 [lrange [split $cmd] 0 end-1]
|
|
||||||
|
set cmd2 [_remove_cword_from_cmd $cmd $cword]
|
||||||
# Determine common prefix of completions
|
# Determine common prefix of completions
|
||||||
set common [::textutil::string::longestCommonPrefixList $expected]
|
set common [::textutil::string::longestCommonPrefixList $expected]
|
||||||
if {[string length $common] > 0} {set common " $common"}
|
#if {[string length $common] > 0} {set common " $common"}
|
||||||
expect {
|
expect {
|
||||||
-ex "$prompt$cmd2$common" { pass "$test" }
|
-ex "$prompt$cmd2$common" { pass "$test" }
|
||||||
-re $prompt { unresolved "$test at prompt" }
|
-re $prompt { unresolved "$test at prompt" }
|
||||||
@ -144,6 +152,42 @@ proc assert_complete {expected cmd {test ""} {prompt /@} {size 20}} {
|
|||||||
}; # assert_complete()
|
}; # assert_complete()
|
||||||
|
|
||||||
|
|
||||||
|
# @param string $cmd Command to remove cword from
|
||||||
|
# @param string $cword (optional) Last argument of $cmd which is an
|
||||||
|
# argument-to-complete and to be deleted. If empty string (default),
|
||||||
|
# `_remove_cword_from_cmd' autodetects if the last argument is an
|
||||||
|
# argument-to-complete by checking if $cmd doesn't end with whitespace.
|
||||||
|
# Specifying `cword' is only necessary if this autodetection fails, e.g.
|
||||||
|
# when the last whitespace is escaped or quoted, e.g. "finger foo\ " or
|
||||||
|
# "finger 'foo "
|
||||||
|
# @return string Command with cword removed
|
||||||
|
proc _remove_cword_from_cmd {cmd {cword ""}} {
|
||||||
|
set cmd2 $cmd
|
||||||
|
# Is $cword specified?
|
||||||
|
if {[string length $cword] > 0} {
|
||||||
|
# Remove $cword from end of $cmd
|
||||||
|
if {[string last $cword $cmd] == [string length $cmd] - [string length $cword]} {
|
||||||
|
set cmd2 [string range $cmd 0 [expr [string last $cword $cmd] - 1]]
|
||||||
|
}; # if
|
||||||
|
} else {
|
||||||
|
# No, $cword not specified;
|
||||||
|
# Check if last argument is really an-argument-to-complete, i.e.
|
||||||
|
# doesn't end with whitespace.
|
||||||
|
# NOTE: This check fails if trailing whitespace is escaped or quoted,
|
||||||
|
# e.g. "finger foo\ " or "finger 'foo ". Specify parameter
|
||||||
|
# $cword in those cases.
|
||||||
|
# Is last char whitespace?
|
||||||
|
if {! [string is space [string range $cmd end end]]} {
|
||||||
|
# No, last char isn't whitespace;
|
||||||
|
# Remove argument-to-complete from end of $cmd
|
||||||
|
set cmd2 [lrange [split $cmd] 0 end-1]
|
||||||
|
append cmd2 " "
|
||||||
|
}; # if
|
||||||
|
}; # if
|
||||||
|
return $cmd2
|
||||||
|
}; # _remove_cword_from_cmd()
|
||||||
|
|
||||||
|
|
||||||
# Make sure any completions are returned
|
# Make sure any completions are returned
|
||||||
proc assert_complete_any {cmd {test ""} {prompt /@}} {
|
proc assert_complete_any {cmd {test ""} {prompt /@}} {
|
||||||
if {$test == ""} {set test "$cmd should show completions"}
|
if {$test == ""} {set test "$cmd should show completions"}
|
||||||
@ -181,11 +225,12 @@ proc assert_complete_any {cmd {test ""} {prompt /@}} {
|
|||||||
# @param string $test (optional) Test titel. Default is "$cmd<TAB> should show completions"
|
# @param string $test (optional) Test titel. Default is "$cmd<TAB> should show completions"
|
||||||
# @param string $prompt (optional) Bash prompt. Default is "/@"
|
# @param string $prompt (optional) Bash prompt. Default is "/@"
|
||||||
# @param integer $size (optional) Chunk size. Default is 20.
|
# @param integer $size (optional) Chunk size. Default is 20.
|
||||||
|
# @param string $cword (optional) Last word of $cmd to complete. See: assert_complete()
|
||||||
# @result boolean True if successful, False if not
|
# @result boolean True if successful, False if not
|
||||||
proc assert_complete_dir {expected cmd dir {test ""} {size 20}} {
|
proc assert_complete_dir {expected cmd dir {test ""} {size 20} {cword ""}} {
|
||||||
set prompt "/$dir/@"
|
set prompt "/$dir/@"
|
||||||
assert_bash_exec "cd $dir" "" $prompt
|
assert_bash_exec "cd $dir" "" $prompt
|
||||||
assert_complete $expected $cmd $test $prompt $size
|
assert_complete $expected $cmd $test $prompt $size $cword
|
||||||
sync_after_int $prompt
|
sync_after_int $prompt
|
||||||
assert_bash_exec "cd \$TESTDIR"
|
assert_bash_exec "cd \$TESTDIR"
|
||||||
}; # assert_complete_dir
|
}; # assert_complete_dir
|
||||||
@ -198,6 +243,7 @@ proc assert_complete_dir {expected cmd dir {test ""} {size 20}} {
|
|||||||
# starting with this character are then expected as completions.
|
# starting with this character are then expected as completions.
|
||||||
# @param list $expected List of all completions.
|
# @param list $expected List of all completions.
|
||||||
# @param string $cmd Command given to generate items
|
# @param string $cmd Command given to generate items
|
||||||
|
# @param string $partial Word to complete
|
||||||
# @param string $test (optional) Test titel. Default is "$cmd<TAB> should show completions"
|
# @param string $test (optional) Test titel. Default is "$cmd<TAB> should show completions"
|
||||||
# @param string $prompt (optional) Bash prompt. Default is "/@"
|
# @param string $prompt (optional) Bash prompt. Default is "/@"
|
||||||
# @param integer $size (optional) Chunk size. Default is 20.
|
# @param integer $size (optional) Chunk size. Default is 20.
|
||||||
@ -215,7 +261,7 @@ proc assert_complete_partial {expected cmd {partial ""} {test ""} {prompt /@} {s
|
|||||||
lappend pick $item
|
lappend pick $item
|
||||||
}; # if
|
}; # if
|
||||||
}; # foreach
|
}; # foreach
|
||||||
assert_complete $pick "$cmd $partial" $test $prompt $size
|
assert_complete $pick "$cmd $partial" $test $prompt $size $partial
|
||||||
}; # if
|
}; # if
|
||||||
}; # assert_complete_partial()
|
}; # assert_complete_partial()
|
||||||
|
|
||||||
@ -468,7 +514,7 @@ proc sync_after_int {{prompt /@}} {
|
|||||||
send \031\003; # QUIT/INT
|
send \031\003; # QUIT/INT
|
||||||
# NOTE: Regexp `.*' causes `expect' to discard previous unknown output.
|
# NOTE: Regexp `.*' causes `expect' to discard previous unknown output.
|
||||||
# This is necessary if a completion doesn't match expectations.
|
# This is necessary if a completion doesn't match expectations.
|
||||||
# For instance with `filetype_xpec' completion (e.g. `kdvi') if
|
# For instance with `filetype_xspec' completion (e.g. `kdvi') if
|
||||||
# one expects `.txt' as a completion (wrong, because it isn't
|
# one expects `.txt' as a completion (wrong, because it isn't
|
||||||
# there), the unmatched completions need to be cleaned up.
|
# there), the unmatched completions need to be cleaned up.
|
||||||
expect -re ".*$prompt$"
|
expect -re ".*$prompt$"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user