summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/.gitignore2
-rw-r--r--tests/aux/tap-functions.sh229
-rwxr-xr-xtests/disabled.sh2
-rw-r--r--tests/formats.exp204
-rwxr-xr-xtests/formats.sh43
-rw-r--r--tests/local.mk21
-rwxr-xr-xtests/parse.sh77
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