diff options
Diffstat (limited to 'dotfiles/system/.zsh/modules/Test/comptest')
| -rw-r--r-- | dotfiles/system/.zsh/modules/Test/comptest | 177 | 
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]}" +}  | 
