zsh가 완료한 자동화된 테스트를 작성하는 방법은 무엇입니까?

zsh가 완료한 자동화된 테스트를 작성하는 방법은 무엇입니까?

zsh 완료 기능이 자동으로 생성되는 프로젝트가 있습니다. 작업하면서 몇 가지 극단적인 경우와 버그를 발견했고 이를 적어두고 변경 사항이 있을 때마다 다시 테스트했습니다. 분명히 적절한 테스트 스위트를 작성하고 싶지만 방법을 모르겠습니다.

Bash 완료를 위한 테스트는 매우 간단합니다. COMP_*변수를 설정하고 함수를 실행한 다음 COMP_REPLYzsh에 대해 비슷한 작업을 수행하고 싶습니다.

가능한 한 최선을 다해 compsys 문서를 읽었지만 해결책이 보이지 않습니다.

컨텍스트를 수동으로 설정하고 완성을 실행한 다음 일련의 설명 등을 보고 싶습니다.

완성도를 테스트하는 방법을 찾은 사람이 있나요?

답변1

Zsh에서 테스트 완료는 조금 더 복잡합니다. 이는 Zsh의 완성 명령이 완성 위젯 내에서만 실행될 수 있고 Zsh 라인 편집기가 활성화된 동안에만 호출될 수 있기 때문입니다. 스크립트 내에서 완성을 완료하려면 호출되는 것을 사용해야 합니다.의사 터미널, 여기서 완성 위젯을 활성화하기 위한 활성 명령줄을 가질 수 있습니다.

# Set up your completions as you would normally.
compdef _my-command my-command
_my-command () {
        _arguments '--help[display help text]'  # Just an example.
}

# Define our test function.
comptest () {
        # Add markup to make the output easier to parse.
        zstyle ':completion:*:default' list-colors \
                'no=<COMPLETION>' 'lc=' 'rc=' 'ec=</COMPLETION>'
        zstyle ':completion:*' group-name ''
        zstyle ':completion:*:messages' format \
                '<MESSAGE>%d</MESSAGE>'
        zstyle ':completion:*:descriptions' format \
                '<HEADER>%d</HEADER>'

        # Bind a custom widget to TAB.
        bindkey '^I' complete-word
        zle -C {,,}complete-word
        complete-word () {
                # Make the completion system believe we're on a 
                # normal command line, not in vared.
                unset 'compstate[vared]'

                # Add a delimiter before and after the completions.
                # Use of ^B and ^C as delimiters here is arbitrary.
                # Just use something that won't normally be printed.
                compadd -x $'\C-B'
                _main_complete "$@"
                compadd -J -last- -x $'\C-C'

                exit
        }

        vared -c tmp
}

zmodload zsh/zpty  # Load the pseudo terminal module.
zpty {,}comptest   # Create a new pty and run our function in it.

# Simulate a command being typed, ending with TAB to get completions.
zpty -w comptest $'my-command --h\t'

# Read up to the first delimiter. Discard all of this.
zpty -r comptest REPLY $'*\C-B'

zpty -r comptest REPLY $'*\C-C'  # Read up to the second delimiter.

# Print out the results.
print -r -- "${REPLY%$'\C-C'}"   # Trim off the ^C, just in case.

zpty -d comptest  # Delete the pty.

위의 예제를 실행하면 다음이 인쇄됩니다.


<HEADER>option</HEADER>
<COMPLETION>--help    display help text</COMPLETION>

전체 완료 출력을 테스트하지 않고 명령줄에 삽입될 문자열만 테스트하려면 다음을 참조하세요.https://stackoverflow.com/questions/65386043/unit-testing-zsh-completion-script/69164362#69164362

관련 정보