
___x_cmd_assert___main_is(){
    local op="$1"; shift;
    case "$op" in
        is-int)             ___x_cmd_assert_int "$@" ;;
        is-float)           ___x_cmd_assert_float "$@" ;;
        is-postive)         ___x_cmd_assert_positive "$@" ;;

        is-eq)              ___x_cmd_assert_eq "$@" ;;

        is-set)             ___x_cmd_assert_varset "$@" ;;

        is-file)            ___x_cmd_assert_file "$@" ;;
        is-folder)          ___x_cmd_assert_folder "$@" ;;

        is-readable)        ___x_cmd_assert_file_readable "$@" ;;
        is-writable)        ___x_cmd_assert_file_writable "$@" ;;
        is-executable)      ___x_cmd_assert_file_writable "$@" ;;

        is-pipe)            ___x_cmd_assert_file_pipe "$@" ;;
        is-socket)          ___x_cmd_assert_file_socket "$@" ;;
        is-link)            ___x_cmd_assert_file_link "$@" ;;
        is-nonempty)        ___x_cmd_assert_file_nonempty "$@" ;;
        is-exsited)         ___x_cmd_assert_file_existed "$@" ;;

        # Will be removed.
        is-file-*)          ___x_cmd_assert_file_"${op#is-file-}" "$@" ;;
    esac
}

# Section: int float positive negative
___x_cmd_assert_float(){
    local fail; local e; for e in "$@"; do
        ___x_cmd_is___float_one_noredirect "$e" || { fail=1; break; }
    done 2>/dev/null

    [ -z "$fail" ] || M="Expect $e to be a float"   _assert:return 1
}

___x_cmd_assert_int(){
    local fail; local e; for e in "$@"; do
        [ "$e" -eq "$e" ] || { fail=1; break; }
    done 2>/dev/null

    [ -z "$fail" ] || M="Expect $e to be a int"     _assert:return 1
}

___x_cmd_assert_positive(){
    local fail; local e; for e in "$@"; do
        [ "$e" -ge 0 ] ||  { fail=1; break; }
    done 2>/dev/null

    [ -z "$fail" ] || M="Expect $e to be a positive integer" _assert:return 1
}
# EndSection

___x_cmd_assert_eq(){
    local real="$1"; shift
    local i=1; local e; for e in "$@"; do
        i="$((i+1))"
        [ "$real" = "$e" ] || M="Failed. Expect \$$i='$e' equals to '$real'" _assert:return 1
    done
    return 0
}

___x_cmd_assert_varset(){
    local e; for e in "$@"; do
        case "$e" in
            ^*)     eval "[ -z \"\${${e#^}+1}\" ]"  || M="Variable ${e#^} is set" _assert:return 1 ;;
            *)      eval "[ -n \"\${$e+1}\" ]"      || M="Variable ${e} is unset" _assert:return 1 ;;
        esac
    done
}

