# (C) 2010 magicant

# Completion script for the "test" built-in command.
# Completion function "completion/test" is used for the "[" built-in as well.

function completion/test {

        WORDS=('(' "${WORDS[2,-1]}")

        # complete unary operator
        case ${WORDS[-1]} in ('('|!|-[ao]) #>>#
                complete -D "check if a file is a block special file" -- -b
                complete -D "check if a file is a character special file" -- -c
                complete -D "check if a file is a directory" -- -d
                complete -D "check if a file exists" -- -e
                complete -D "check if a file is a regular file" -- -f
                complete -D "check if a file is owned by the current group" -- -G
                complete -D "check if a file's set-group-ID flag is set" -- -g
                complete -D "check if a file is a symbolic link" -- -h
                complete -D "check if a file's sticky bit is set" -- -k
                complete -D "check if a file is a symbolic link" -- -L
                complete -D "check if a file hasn't been accessed since last modified" -- -N
                complete -D "check if a file is owned by the current user" -- -O
                complete -D "check if a shell option is enabled" -- -o
                complete -D "check if a file is a FIFO (named pipe)" -- -p
                complete -D "check if a file is readable" -- -r
                complete -D "check if a file is a socket" -- -S
                complete -D "check if a file is not empty" -- -s
                complete -D "check if a file's set-user-ID flag is set" -- -u
                complete -D "check if a file is writable" -- -w
                complete -D "check if a file is executable" -- -x
                complete -D "check if a file descriptor is a terminal" -- -t
                complete -D "check if a string is not empty" -- -n
                complete -D "check if a string is empty" -- -z
        esac #<<#

        # complete binary operator
        case ${WORDS[-2]} in ('('|!|-[ao]) #>>#
                complete -D "check if a file is newer than another" -- -nt
                complete -D "check if a file is older than another" -- -ot
                complete -D "check if a file is a hard link to another" -- -ef
                complete -D "check if a string is the same as another" -- =
                complete -D "check if a string is the same as another" -- ==
                complete -D "check if a string is matched by a regex" -- =~
                complete -D "check if a string is different from another" -- !=
                complete -D "check if a string is the same as another according to the current locale" -- ===
                complete -D "check if a string is different from another according to the current locale" -- !==
                complete -D "compare two strings in the alphabetical order" -- '<' '<=' '>' '>='
                complete -D "check if an integer is equal to another" -- -eq
                complete -D "check if an integer is unequal to another" -- -ne
                complete -D "check if an integer is greater than another" -- -gt
                complete -D "check if an integer is greater than or equal to another" -- -ge
                complete -D "check if an integer is less than another" -- -lt
                complete -D "check if an integer is less than or equal to another" -- -le
                complete -D "check if a version number is equal to another" -- -veq
                complete -D "check if a version number is unequal to another" -- -vne
                complete -D "check if a version number is greater than another" -- -vgt
                complete -D "check if a version number is greater than or equal to another" -- -vge
                complete -D "check if a version number is less than another" -- -vlt
                complete -D "check if a version number is less than or equal to another" -- -vle
        esac #<<#

        # complete operand of the "-o" unary operator
        case ${WORDS[-2]} in ('('|!|-[ao])
                case ${WORDS[-1]} in (-o)
                        if command -fv completion/set::completelongoption >/dev/null 2>&1 ||
                                        . -AL completion/set; then
                                typeset SOPTIONS LOPTIONS PREFIX prog=set
                                SOPTIONS=() LOPTIONS=()
                                case $TARGETWORD in
                                (\?*)
                                        TARGETWORD=${TARGETWORD#\?} PREFIX=\?
                                        ;;
                                (*)
                                        PREFIX=
                                        ;;
                                esac
                                command -f completion/set::getopt set
                                command -f completion/set::completelongoption
                        fi
                        return
                esac
        esac

        # complete operand of other operators
        complete -f

}


# vim: set ft=sh ts=8 sts=8 sw=8 et:
