diff options
Diffstat (limited to 'tests')
-rw-r--r-- | tests/.gitignore | 2 | ||||
-rw-r--r-- | tests/aux/tap-functions.sh | 229 | ||||
-rwxr-xr-x | tests/disabled.sh | 2 | ||||
-rw-r--r-- | tests/formats.exp | 204 | ||||
-rwxr-xr-x | tests/formats.sh | 43 | ||||
-rw-r--r-- | tests/local.mk | 21 | ||||
-rwxr-xr-x | tests/parse.sh | 77 |
7 files changed, 578 insertions, 0 deletions
diff --git a/tests/.gitignore b/tests/.gitignore new file mode 100644 index 0000000..7e563b8 --- /dev/null +++ b/tests/.gitignore @@ -0,0 +1,2 @@ +*.log +*.trs diff --git a/tests/aux/tap-functions.sh b/tests/aux/tap-functions.sh new file mode 100644 index 0000000..e2414b7 --- /dev/null +++ b/tests/aux/tap-functions.sh @@ -0,0 +1,229 @@ +# -*- shell-script -*- +# +# Copyright (C) 2011-2022 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <https://www.gnu.org/licenses/>. + +# Helper functions used by TAP-producing tests of the Automake testsuite. + +# +# IMPORTANT: All the functions defined in this file can *not* be used +# from within a subshell, unless explicitly noted otherwise. +# + +# The counts of the TAP test results seen so far: total count and +# per-result counts. +tap_count_=0 +tap_pass_count_=0 +tap_skip_count_=0 +tap_fail_count_=0 +tap_xfail_count_=0 +tap_xpass_count_=0 + +# not COMMAND [ARGS...] +# --------------------- +# Run the given command and invert its exit status. +not () { ! "$@"; } + +# plan_ [unknown|later|lazy|now|NUMBER-OF-PLANNED-TESTS] +# ------------------------------------------------------ +# Print a TAP plan for the given number of tests. This must be called +# before reporting any test result. If called with the special argument +# "unknown" or "later", it will do nothing, expecting the calling script +# to declare the plan later. If called with the special argument "lazy" +# or "now", it will print a TAP plan that accounts for the number of tests +# seen so far. +plan_ () +{ + if test $# -eq 0; then + bailout_ "plan_: missing argument" + elif test $# -ge 2; then + bailout_ "plan_: too many arguments" + elif test x"$planned_" != x"none" && test x"$planned_" != x"later"; then + bailout_ "plan_: called to many times" + elif test x"$1" = x"unknown" || test x"$1" = x"later"; then + # This means we want to get back later to declaring the TAP plan. + planned_=later + return 0 + elif test x"$1" = x"lazy" || test x"$1" = x"now"; then + planned_=$tap_count_ # Number of test results seen so far. + elif test $1 -ge 0; then + planned_=$1 + else + bailout_ "plan_: invalid argument '$1'" + fi + echo "1..$planned_" +} +planned_=none + +# diag_ [EXPLANATION] +# ------------------ +# Report the given text as TAP diagnostic. Assumes the string denoting +# TAP diagnostic lines is stored in the '$diag_string_' variable; this is +# done to allow better interplay with TAP drivers that allow such a string +# to be configured. +diag_ () +{ + test $# -eq 0 || echo "$diag_string_ $*" +} + +# Used by the 'diag_' function above. User-overridable. +diag_string_="#" + +# warn_ [EXPLANATION] +# ------------------ +# Give a warning (using TAP diagnostic). +warn_ () +{ + case $# in + 0) diag_ "WARNING: (unknown warning)";; + *) diag_ "WARNING: $*";; + esac +} + +# result_ RESULT [-D DIRECTIVE] [-r REASON] [--] [DESCRIPTION...] +# --------------------------------------------------------------- +# Report a test case with the given RESULT (valid values are "ok" and +# "not ok") and the given DESCRIPTION (if any). If DIRECTIVE is given +# and non-empty (valid values being "TODO" and "SKIP"), it will be +# reported too, with the REASON (if given) appended. +result_ () +{ + test $# -gt 0 || bailout_ "result_: missing argument" + tap_result_=$1; shift + case $tap_result_ in + "ok"|"not ok") ;; + *) bailout_ "result_: invalid result '$tap_result'" ;; + esac + tap_directive_= tap_reason_= + while test $# -gt 0; do + case $1 in + -D|--directive) tap_directive_=$2; shift;; + -r|--reason) tap_reason_=$2; shift;; + --) shift; break;; + -*) bailout_ "result_: invalid option '$1'";; + *) break;; + esac + shift + done + case $tap_directive_ in + ""|TODO|SKIP) ;; + *) bailout_ "result_: invalid directive '$directive_'" ;; + esac + tap_count_=$(($tap_count_ + 1)) + case $tap_result_,$tap_directive_ in + ok,) # Passed. + tap_pass_count_=$(($tap_pass_count_ + 1)) ;; + not\ ok,TODO) # Expected failure. + tap_xfail_count_=$(($tap_xfail_count_ + 1)) ;; + not\ ok,*) # Failed. + tap_fail_count_=$(($tap_fail_count_ + 1)) ;; + ok,TODO) # Unexpected pass. + tap_xpass_count_=$(($tap_xpass_count_ + 1)) ;; + ok,SKIP) # Skipped. + tap_skip_count_=$(($tap_skip_count_ + 1)) ;; + *) # Can't happen. + bailout_ "internal error in 'result_'" ;; + esac + tap_text_="$tap_result_ $tap_count_" + if test x"$*" != x; then + tap_text_="$tap_text_ - $*" + fi + if test x"$tap_directive_" != x; then + tap_text_="$tap_text_ # $tap_directive_"${tap_reason_:+" $tap_reason_"} + fi + printf '%s\n' "$tap_text_" +} + +# Shorthands for common usages of 'result_'. +ok_ () { result_ 'ok' ${1+"$@"}; } +not_ok_ () { result_ 'not ok' ${1+"$@"}; } +skip_ () { result_ 'ok' -D SKIP ${1+"$@"}; } + +# skip_row_ COUNT [-r REASON] [--] [DESCRIPTION...] +# ------------------------------------------------- +# Report a COUNT of skipped test, with the given reason and descriptions +# (if any). Useful to avoid cascade failures in case a fair number of +# tests depend on an earlier one that failed. +skip_row_ () +{ + skip_count_=$1; shift + for i_ in $(seq_ $skip_count_); do skip_ ${1+"$@"}; done +} + +# skip_all_ [REASON ...] +# ---------------------- +# Skip all the tests in a test script. Must be used before calling 'plan_' +# or reporting any test result. Can't be used from within a subshell. +skip_all_ () +{ + echo "1..0 # SKIP" ${1+"$@"} + planned_=0 + exit 0 +} + +# bailout_ [REASON ...] +# --------------------- +# Stop the execution of the current test suite right now, due to an +# unrecoverable error. Can be called at any point, but cannot be used +# from within a subshell. +bailout_ () +{ + echo 'Bail out!' ${1+"$@"} + exit 99 +} + +# fatal_ [REASON ...] +# ------------------- +# Same as 'bailout_'; for compatibility with 'plain-functions.sh'. +fatal_ () +{ + bailout_ ${1+"$@"} +} + +# framework_failure_ [REASON ...] +# ------------------------------- +# Stop the execution of the current test suite right now, due to an +# unrecoverable error in the set-up of the test case. Can be called +# at any point, but cannot be used from within a subshell. +framework_failure_ () +{ + bailout_ "set-up failure"${1+": $*"} +} + +# command_ok_ TEST-DESCRIPTION [OPTIONS..] [--] CMD [ARGS...] +# ----------------------------------------------------------- +# Helper subroutine for when a TAP result must be determined by the +# outcome of a command. +command_ok_ () +{ + tap_directive_= tap_reason_= + test $# -gt 0 || bailout_ "command_ok_: missing argument" + tap_description_=$1; shift + while test $# -gt 0; do + case $1 in + -D|--directive) tap_directive_=$2; shift;; + -r|--reason) tap_reason_=$2; shift;; + --) shift; break;; + -*) bailout_ "command_ok_: invalid option '$1'";; + *) break;; + esac + shift + done + tap_result_="ok"; "$@" || tap_result_="not ok" + result_ "$tap_result_" -D "$tap_directive_" -r "$tap_reason_" \ + -- "$tap_description_" +} + +: diff --git a/tests/disabled.sh b/tests/disabled.sh new file mode 100755 index 0000000..53caf82 --- /dev/null +++ b/tests/disabled.sh @@ -0,0 +1,2 @@ +printf 'Test suite support disabled\n' 1>&2 +exit 1 diff --git a/tests/formats.exp b/tests/formats.exp new file mode 100644 index 0000000..20b49c9 --- /dev/null +++ b/tests/formats.exp @@ -0,0 +1,204 @@ +Time formats: + * 03:04:05 AM + * 03:04:05 + * 03:04 AM + * 03:04 + * 03.04.05 AM + * 03.04.05 + * 03.04 AM + * 03.04 + * 030405 AM + * 030405 + * 0304 AM + * 0304 +Date formats: + * Fri + * Fri. + * 1970-01-02 + * 1970/01/02 + * 1970.01.02 + * 01-02-1970 + * 01-02 + * 01/02/1970 + * 01/02 + * 01.02.1970 + * 01.02 + * 2 Jan 1970 + * 2 Jan. 1970 + * 2 Jan + * 2 Jan. + * 02-Jan-1970 + * 02-Jan + * 02/Jan/1970 + * 02/Jan + * Fri 2 Jan 1970 + * Fri 2 Jan. 1970 + * Fri 2 Jan + * Fri 2 Jan. + * Fri 02-Jan-1970 + * Fri 02-Jan + * Fri 02/Jan/1970 + * Fri 02/Jan + * Fri. 2 Jan 1970 + * Fri. 2 Jan. 1970 + * Fri. 2 Jan + * Fri. 2 Jan. + * Fri. 02-Jan-1970 + * Fri. 02-Jan + * Fri. 02/Jan/1970 + * Fri. 02/Jan + * Fri, 2 Jan 1970 + * Fri, 2 Jan. 1970 + * Fri, 2 Jan + * Fri, 2 Jan. + * Fri, 02-Jan-1970 + * Fri, 02-Jan + * Fri, 02/Jan/1970 + * Fri, 02/Jan + * Jan 2, 1970 + * Jan. 2, 1970 + * Jan 2 + * Jan. 2 + * Jan-02-1970 + * Jan-02 + * Jan/02/1970 + * Jan/02 + * Fri Jan 2, 1970 + * Fri Jan. 2, 1970 + * Fri Jan 2 + * Fri Jan. 2 + * Fri Jan-02-1970 + * Fri Jan-02 + * Fri Jan/02/1970 + * Fri Jan/02 + * Fri. Jan 2, 1970 + * Fri. Jan. 2, 1970 + * Fri. Jan 2 + * Fri. Jan. 2 + * Fri. Jan-02-1970 + * Fri. Jan-02 + * Fri. Jan/02/1970 + * Fri. Jan/02 + * Fri, Jan 2, 1970 + * Fri, Jan. 2, 1970 + * Fri, Jan 2 + * Fri, Jan. 2 + * Fri, Jan-02-1970 + * Fri, Jan-02 + * Fri, Jan/02/1970 + * Fri, Jan/02 + * Friday + * Friday 2 Jan 1970 + * Friday 2 Jan. 1970 + * Friday 2 Jan + * Friday 2 Jan. + * Friday 02-Jan-1970 + * Friday 02-Jan + * Friday 02/Jan/1970 + * Friday 02/Jan + * Friday, 2 Jan 1970 + * Friday, 2 Jan. 1970 + * Friday, 2 Jan + * Friday, 2 Jan. + * Friday, 02-Jan-1970 + * Friday, 02-Jan + * Friday, 02/Jan/1970 + * Friday, 02/Jan + * Friday Jan 2, 1970 + * Friday Jan. 2, 1970 + * Friday Jan 2 + * Friday Jan. 2 + * Friday Jan-02-1970 + * Friday Jan-02 + * Friday Jan/02/1970 + * Friday Jan/02 + * Friday, Jan 2, 1970 + * Friday, Jan. 2, 1970 + * Friday, Jan 2 + * Friday, Jan. 2 + * Friday, Jan-02-1970 + * Friday, Jan-02 + * Friday, Jan/02/1970 + * Friday, Jan/02 + * 2 January 1970 + * 2 January + * 02-January-1970 + * 02-January + * 02/January/1970 + * 02/January + * Fri 2 January 1970 + * Fri 2 January + * Fri 02-January-1970 + * Fri 02-January + * Fri 02/January/1970 + * Fri 02/January + * Fri. 2 January 1970 + * Fri. 2 January + * Fri. 02-January-1970 + * Fri. 02-January + * Fri. 02/January/1970 + * Fri. 02/January + * Fri, 2 January 1970 + * Fri, 2 January + * Fri, 02-January-1970 + * Fri, 02-January + * Fri, 02/January/1970 + * Fri, 02/January + * January 2, 1970 + * January 2 + * January-02-1970 + * January-02 + * January/02/1970 + * January/02 + * Fri January 2, 1970 + * Fri January 2 + * Fri January-02-1970 + * Fri January-02 + * Fri January/02/1970 + * Fri January/02 + * Fri. January 2, 1970 + * Fri. January 2 + * Fri. January-02-1970 + * Fri. January-02 + * Fri. January/02/1970 + * Fri. January/02 + * Fri, January 2, 1970 + * Fri, January 2 + * Fri, January-02-1970 + * Fri, January-02 + * Fri, January/02/1970 + * Fri, January/02 + * Friday 2 January 1970 + * Friday 2 January + * Friday 02-January-1970 + * Friday 02-January + * Friday 02/January/1970 + * Friday 02/January + * Friday, 2 January 1970 + * Friday, 2 January + * Friday, 02-January-1970 + * Friday, 02-January + * Friday, 02/January/1970 + * Friday, 02/January + * Friday January 2, 1970 + * Friday January 2 + * Friday January-02-1970 + * Friday January-02 + * Friday January/02/1970 + * Friday January/02 + * Friday, January 2, 1970 + * Friday, January 2 + * Friday, January-02-1970 + * Friday, January-02 + * Friday, January/02/1970 + * Friday, January/02 +Additional formats: + * 1970-01-02T03:04:05 + * 1970-01-02T03:04 + * 19700102T030405 + * 19700102T0304 + * 19700102 030405 AM + * 19700102 030405 + * 19700102 0304 AM + * 19700102 0304 + * Fri Jan 02 03:04:05 1970 diff --git a/tests/formats.sh b/tests/formats.sh new file mode 100755 index 0000000..576b96a --- /dev/null +++ b/tests/formats.sh @@ -0,0 +1,43 @@ +# Tests `@ -F` output +# +# Copyright (C) 2022 P. J. McDermott +# +# This file is part of @ +# +# @ is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# @ is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with @. If not, see <http://www.gnu.org/licenses/>. + +set -eu + +. "${TOP_SRCDIR}/tests/aux/tap-functions.sh" + +plan_ 1 + +exp="$(cat "${0%.sh}.exp")" +got="$("${TOP_BUILDDIR}/atsign" -d '1970-01-02 03:04:05' -F)" + +if [ x"${got}" = x"${exp}" ]; then + ok_ -- 'formats list' + exit 0 +fi +not_ok_ -- 'formats list' + +IFS=' +' + +for line in $(printf '%s\n' "${got}" | diff -u "${0%.sh}.exp" '-' | sed '1,2d') +do + diag_ "${line}" +done + +exit 0 diff --git a/tests/local.mk b/tests/local.mk new file mode 100644 index 0000000..84eb79e --- /dev/null +++ b/tests/local.mk @@ -0,0 +1,21 @@ +tests = \ + %reldir%/formats.sh \ + %reldir%/parse.sh +if ENABLE_TESTS +TESTS = $(tests) +else +TESTS = %reldir%/disabled.sh +endif + +TEST_EXTENSIONS = .sh +SH_LOG_DRIVER = \ + AM_TAP_AWK='$(AWK)' \ + TOP_SRCDIR="$(abs_top_srcdir)" \ + TOP_BUILDDIR="$(abs_top_builddir)" \ + $(SHELL) $(top_srcdir)/build-aux/tap-driver.sh +EXTRA_DIST += \ + $(tests) \ + %reldir%/disabled.sh \ + %reldir%/formats.exp \ + $(top_srcdir)/build-aux/tap-driver.sh \ + %reldir%/aux/tap-functions.sh diff --git a/tests/parse.sh b/tests/parse.sh new file mode 100755 index 0000000..eadd2cf --- /dev/null +++ b/tests/parse.sh @@ -0,0 +1,77 @@ +# Tests @'s date/time parsing +# +# Copyright (C) 2022 P. J. McDermott +# +# This file is part of @ +# +# @ is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# @ is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with @. If not, see <http://www.gnu.org/licenses/>. + +set -eu + +. "${TOP_SRCDIR}/tests/aux/tap-functions.sh" + +now='1969-12-31 23:59:30' +tgt='1970-01-01 00:00:00' + +fmts="$(TZ=UTC0 "${TOP_BUILDDIR}/atsign" -d "${tgt}" -F)" +time_fmts="$(printf '%s\n' "${fmts}" | \ + sed -n '/^Time formats:$/,/^Date formats:$/s/^ \* //p')" +date_fmts="$(printf '%s\n' "${fmts}" | \ + sed -n '/^Date formats:$/,/^Additional formats:$/s/^ \* //p')" +misc_fmts="$(printf '%s\n' "${fmts}" | \ + sed -n '/^Additional formats:$/,$s/^ \* //p')" + +plan_ $((\ + $(printf '%s\n' "${time_fmts}" | wc -l) + \ + $(printf '%s\n' "${time_fmts}" | wc -l) * \ + $(printf '%s\n' "${date_fmts}" | wc -l) * \ + 2 + \ + $(printf '%s\n' "${misc_fmts}" | wc -l) \ + )) + +IFS=' +' + +for fmt in $(printf '%s\n' "${fmts}"); do + diag_ "${fmt}" +done + +test_fmt() +{ + now="${1}" + tgt="${2}" + fmt="${3}" + shift 3 + + got="$(TZ=UTC0 "${TOP_BUILDDIR}/atsign" -d "${now}" "${fmt}" 2>&1)" || : + if [ x"${got}" = x"${tgt}" ]; then + ok_ -- "${fmt}" + else + not_ok_ -- "${fmt}" + diag_ " Failed test '${fmt}'" + diag_ " got: '${got}'" + diag_ " expected: '${tgt}'" + fi +} + +for time_fmt in ${time_fmts}; do + test_fmt "${now}" "${tgt}" "${time_fmt}" + for date_fmt in ${date_fmts}; do + test_fmt "${now}" "${tgt}" "${date_fmt} ${time_fmt}" + test_fmt "${now}" "${tgt}" "${time_fmt} ${date_fmt}" + done +done +for misc_fmt in ${misc_fmts}; do + test_fmt "${now}" "${tgt}" "${misc_fmt}" +done |