summaryrefslogtreecommitdiff
path: root/dotfiles/system/.zsh/modules/Test/comptest
diff options
context:
space:
mode:
Diffstat (limited to 'dotfiles/system/.zsh/modules/Test/comptest')
-rw-r--r--dotfiles/system/.zsh/modules/Test/comptest177
1 files changed, 177 insertions, 0 deletions
diff --git a/dotfiles/system/.zsh/modules/Test/comptest b/dotfiles/system/.zsh/modules/Test/comptest
new file mode 100644
index 0000000..166d0b4
--- /dev/null
+++ b/dotfiles/system/.zsh/modules/Test/comptest
@@ -0,0 +1,177 @@
+comptestinit () {
+ setopt extendedglob
+ [[ -d $ZTST_testdir/Modules/zsh ]] && module_path=( $ZTST_testdir/Modules )
+ fpath=( $ZTST_srcdir/../Functions/*~*/CVS(/)
+ $ZTST_srcdir/../Completion
+ $ZTST_srcdir/../Completion/*/*~*/CVS(/) )
+
+ zmodload zsh/zpty || return $?
+
+ comptest_zsh=${ZSH:-zsh}
+ comptest_keymap=e
+
+ while getopts vz: opt; do
+ case $opt in
+ z) comptest_zsh="$OPTARG";;
+ v) comptest_keymap="v";;
+ esac
+ done
+ (( OPTIND > 1 )) && shift $(( OPTIND - 1 ))
+
+ export PS1="<PROMPT>"
+ zpty zsh "$comptest_zsh -f +Z"
+
+ zpty -r zsh log1 "*<PROMPT>*" || {
+ print "first prompt hasn't appeared."
+ return 1
+ }
+
+ comptesteval \
+"export LC_ALL=${ZSH_TEST_LANG:-C}" \
+"emulate -R zsh" \
+"export ZDOTDIR=$ZTST_testdir" \
+"module_path=( $module_path )" \
+"fpath=( $fpath )" \
+"bindkey -$comptest_keymap" \
+'LISTMAX=10000000
+stty 38400 columns 80 rows 24 tabs -icanon -iexten
+TERM=vt100
+KEYTIMEOUT=1
+setopt zle
+autoload -U compinit
+compinit -u
+zstyle ":completion:*:default" list-colors "no=<NO>" "fi=<FI>" "di=<DI>" "ln=<LN>" "pi=<PI>" "so=<SO>" "bd=<BD>" "cd=<CD>" "ex=<EX>" "mi=<MI>" "tc=<TC>" "sp=<SP>" "lc=<LC>" "ec=<EC>\n" "rc=<RC>"
+zstyle ":completion:*" group-name ""
+zstyle ":completion:*:messages" format "<MESSAGE>%d</MESSAGE>
+"
+zstyle ":completion:*:descriptions" format "<DESCRIPTION>%d</DESCRIPTION>
+"
+zstyle ":completion:*:options" verbose yes
+zstyle ":completion:*:values" verbose yes
+setopt noalwayslastprompt listrowsfirst completeinword
+zmodload zsh/complist
+expand-or-complete-with-report () {
+ print -lr "<WIDGET><expand-or-complete>"
+ zle expand-or-complete
+ print -lr - "<LBUFFER>$LBUFFER</LBUFFER>" "<RBUFFER>$RBUFFER</RBUFFER>"
+ zle clear-screen
+ zle -R
+}
+list-choices-with-report () {
+ print -lr "<WIDGET><list-choices>"
+ zle list-choices
+ zle clear-screen
+ zle -R
+}
+comp-finish () {
+ print "<WIDGET><finish>"
+ zle kill-whole-line
+ zle clear-screen
+ zle -R
+}
+zle-finish () {
+ local buffer="$BUFFER" cursor="$CURSOR" mark="$MARK"
+ (( region_active)) || unset mark
+ BUFFER=""
+ zle -I
+ zle clear-screen
+ zle redisplay
+ print -lr "<WIDGET><finish>" "BUFFER: $buffer" "CURSOR: $cursor"
+ (( $+mark )) && print -lr "MARK: $mark"
+ zle accept-line
+}
+zle -N expand-or-complete-with-report
+zle -N list-choices-with-report
+zle -N comp-finish
+zle -N zle-finish
+bindkey "^I" expand-or-complete-with-report
+bindkey "^D" list-choices-with-report
+bindkey "^Z" comp-finish
+bindkey "^X" zle-finish
+bindkey -a "^X" zle-finish
+'
+}
+
+zpty_flush() {
+ local junk
+ if zpty -r -t zsh junk \*; then
+ (( ZTST_verbose > 2 )) && print -n -u $ZTST_fd "$*: ${(V)junk}"
+ while zpty -r -t zsh junk \* ; do
+ (( ZTST_verbose > 2 )) && print -n -u $ZTST_fd "${(V)junk}"
+ done
+ (( ZTST_verbose > 2 )) && print -u $ZTST_fd ''
+ fi
+}
+
+zpty_run() {
+ zpty -w zsh "$*"
+ zpty -r -m zsh log "*<PROMPT>*" || {
+ print "prompt hasn't appeared."
+ return 1
+ }
+}
+
+comptesteval () {
+ local tmp=/tmp/comptest.$$
+
+ print -lr - "$@" > $tmp
+ # zpty_flush Before comptesteval
+ zpty -w zsh ". $tmp"
+ zpty -r -m zsh log_eval "*<PROMPT>*" || {
+ print "prompt hasn't appeared."
+ return 1
+ }
+ zpty_flush After comptesteval
+ rm $tmp
+}
+
+comptest () {
+ input="$*"
+ zpty -n -w zsh "$input"$'\C-Z'
+ zpty -r -m zsh log "*<WIDGET><finish>*<PROMPT>*" || {
+ print "failed to invoke finish widget."
+ return 1
+ }
+
+ logs=(${(s:<WIDGET>:)log})
+ shift logs
+
+ for log in "$logs[@]"; do
+ if [[ "$log" = (#b)*$'<LBUFFER>'(*)$'</LBUFFER>\r\n<RBUFFER>'(*)$'</RBUFFER>'* ]]; then
+ print -lr "line: {$match[1]}{$match[2]}"
+ fi
+ while (( ${(N)log#*(#b)(<LC><(??)><RC>(*)<EC>|<DESCRIPTION>(*)</DESCRIPTION>|<MESSAGE>(*)</MESSAGE>|<COMPADD>(*)</COMPADD>|<INSERT_POSITIONS>(*)</INSERT_POSITIONS>)} )); do
+ log="${log[$mend[1]+1,-1]}"
+ if (( 0 <= $mbegin[2] )); then
+ if [[ $match[2] != TC && $match[3] != \ # ]]; then
+ print -lr "$match[2]:{${match[3]%${(%):-%E}}}"
+ fi
+ elif (( 0 <= $mbegin[4] )); then
+ print -lr "DESCRIPTION:{$match[4]}"
+ elif (( 0 <= $mbegin[5] )); then
+ print -lr "MESSAGE:{$match[5]}"
+ elif (( 0 <= $mbegin[6] )); then
+ print -lr "COMPADD:{${${match[6]}//[$'\r\n']/}}"
+ elif (( 0 <= $mbegin[7] )); then
+ print -lr "INSERT_POSITIONS:{${${match[7]}//[$'\r\n']/}}"
+ fi
+ done
+ done
+}
+
+zletest () {
+ local first=0
+ for input; do
+ # zpty_flush Before zletest
+ # sleep for $KEYTIMEOUT
+ (( first++ )) && { sleep 2 & } | read -t 0.011 -u 0 -k 1
+ zpty -n -w zsh "$input"
+ done
+ zpty -n -w zsh $'\C-X'
+ zpty -r -m zsh log "*<WIDGET><finish>*<PROMPT>*" || {
+ print "failed to invoke finish widget."
+ return 1
+ }
+ # zpty_flush After zletest
+ print -lr "${(@)${(@ps:\r\n:)log##*<WIDGET><finish>}[2,-2]}"
+}