xref: /freebsd/contrib/bc/tests/errors.sh (revision 662087dfd0668dee82ed20d00ced662aa3595059)
13aa99676SStefan Eßer#! /bin/sh
23aa99676SStefan Eßer#
33aa99676SStefan Eßer# SPDX-License-Identifier: BSD-2-Clause
43aa99676SStefan Eßer#
510328f8bSStefan Eßer# Copyright (c) 2018-2021 Gavin D. Howard and contributors.
63aa99676SStefan Eßer#
73aa99676SStefan Eßer# Redistribution and use in source and binary forms, with or without
83aa99676SStefan Eßer# modification, are permitted provided that the following conditions are met:
93aa99676SStefan Eßer#
103aa99676SStefan Eßer# * Redistributions of source code must retain the above copyright notice, this
113aa99676SStefan Eßer#   list of conditions and the following disclaimer.
123aa99676SStefan Eßer#
133aa99676SStefan Eßer# * Redistributions in binary form must reproduce the above copyright notice,
143aa99676SStefan Eßer#   this list of conditions and the following disclaimer in the documentation
153aa99676SStefan Eßer#   and/or other materials provided with the distribution.
163aa99676SStefan Eßer#
173aa99676SStefan Eßer# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
183aa99676SStefan Eßer# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
193aa99676SStefan Eßer# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
203aa99676SStefan Eßer# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
213aa99676SStefan Eßer# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
223aa99676SStefan Eßer# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
233aa99676SStefan Eßer# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
243aa99676SStefan Eßer# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
253aa99676SStefan Eßer# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
263aa99676SStefan Eßer# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
273aa99676SStefan Eßer# POSSIBILITY OF SUCH DAMAGE.
283aa99676SStefan Eßer#
293aa99676SStefan Eßer
303aa99676SStefan Eßer# WARNING: Test files cannot have empty lines!
313aa99676SStefan Eßer
323aa99676SStefan Eßerscript="$0"
333aa99676SStefan Eßertestdir=$(dirname "$script")
343aa99676SStefan Eßer
3544d4804dSStefan Eßer. "$testdir/../scripts/functions.sh"
363aa99676SStefan Eßer
37*662087dfSStefan Eßeroutputdir=${BC_TEST_OUTPUT_DIR:-$testdir}
38*662087dfSStefan Eßer
3944d4804dSStefan Eßer# Command-line processing.
403aa99676SStefan Eßerif [ "$#" -eq 0 ]; then
413aa99676SStefan Eßer	printf 'usage: %s dir [exec args...]\n' "$script"
423aa99676SStefan Eßer	exit 1
433aa99676SStefan Eßerelse
443aa99676SStefan Eßer	d="$1"
453aa99676SStefan Eßer	shift
463aa99676SStefan Eßerfi
473aa99676SStefan Eßer
483aa99676SStefan Eßerif [ "$#" -lt 1 ]; then
493aa99676SStefan Eßer	exe="$testdir/../bin/$d"
503aa99676SStefan Eßerelse
513aa99676SStefan Eßer	exe="$1"
523aa99676SStefan Eßer	shift
533aa99676SStefan Eßerfi
543aa99676SStefan Eßer
5544d4804dSStefan Eßer# I use these, so unset them to make the tests work.
5610328f8bSStefan Eßerunset BC_ENV_ARGS
5710328f8bSStefan Eßerunset BC_LINE_LENGTH
5810328f8bSStefan Eßerunset DC_ENV_ARGS
5910328f8bSStefan Eßerunset DC_LINE_LENGTH
6010328f8bSStefan Eßer
61*662087dfSStefan Eßerout="$outputdir/${d}_outputs/errors_results.txt"
6210328f8bSStefan Eßeroutdir=$(dirname "$out")
6310328f8bSStefan Eßer
6444d4804dSStefan Eßer# Make sure the directory exists.
6510328f8bSStefan Eßerif [ ! -d "$outdir" ]; then
6610328f8bSStefan Eßer	mkdir -p "$outdir"
6710328f8bSStefan Eßerfi
683aa99676SStefan Eßer
693aa99676SStefan Eßerexebase=$(basename "$exe")
703aa99676SStefan Eßer
7144d4804dSStefan Eßer# These are the filenames for the extra tests.
723aa99676SStefan Eßerposix="posix_errors"
733aa99676SStefan Eßerread_errors="read_errors"
743aa99676SStefan Eßer
7544d4804dSStefan Eßer# Set stuff for the correct calculator.
763aa99676SStefan Eßerif [ "$d" = "bc" ]; then
773aa99676SStefan Eßer	opts="-l"
783aa99676SStefan Eßer	halt="halt"
793aa99676SStefan Eßer	read_call="read()"
803aa99676SStefan Eßer	read_expr="${read_call}\n5+5;"
813aa99676SStefan Eßerelse
823aa99676SStefan Eßer	opts="-x"
833aa99676SStefan Eßer	halt="q"
843aa99676SStefan Eßerfi
853aa99676SStefan Eßer
8644d4804dSStefan Eßerprintf 'Running %s command-line error tests...' "$d"
8744d4804dSStefan Eßer
8844d4804dSStefan Eßerprintf '%s\n' "$halt" | "$exe" "$@" -e "1+1" -f- -e "2+2" 2> "$out" > /dev/null
8944d4804dSStefan Eßererr="$?"
9044d4804dSStefan Eßer
9144d4804dSStefan Eßercheckerrtest "$d" "$err" "command-line -e test" "$out" "$exebase"
9244d4804dSStefan Eßer
9344d4804dSStefan Eßerprintf '%s\n' "$halt" | "$exe" "$@" -e "1+1" -f- -f "$testdir/$d/decimal.txt" 2> "$out" > /dev/null
9444d4804dSStefan Eßererr="$?"
9544d4804dSStefan Eßer
9644d4804dSStefan Eßercheckerrtest "$d" "$err" "command-line -f test" "$out" "$exebase"
9744d4804dSStefan Eßer
9844d4804dSStefan Eßerprintf 'pass\n'
9944d4804dSStefan Eßer
10044d4804dSStefan Eßer# Now test the error files in the standard tests directory.
1013aa99676SStefan Eßerfor testfile in $testdir/$d/*errors.txt; do
1023aa99676SStefan Eßer
1033aa99676SStefan Eßer	if [ -z "${testfile##*$read_errors*}" ]; then
1043aa99676SStefan Eßer		# We don't test read errors here. Skip.
1053aa99676SStefan Eßer		continue
1063aa99676SStefan Eßer	fi
1073aa99676SStefan Eßer
10844d4804dSStefan Eßer	# Test bc POSIX errors and warnings.
1093aa99676SStefan Eßer	if [ -z "${testfile##*$posix*}" ]; then
1103aa99676SStefan Eßer
11144d4804dSStefan Eßer		# Just test warnings.
1123aa99676SStefan Eßer		line="last"
1133aa99676SStefan Eßer		printf '%s\n' "$line" | "$exe" "$@" "-lw"  2> "$out" > /dev/null
1143aa99676SStefan Eßer		err="$?"
1153aa99676SStefan Eßer
1163aa99676SStefan Eßer		if [ "$err" -ne 0 ]; then
1173aa99676SStefan Eßer			die "$d" "returned an error ($err)" "POSIX warning" 1
1183aa99676SStefan Eßer		fi
1193aa99676SStefan Eßer
12010328f8bSStefan Eßer		checkerrtest "$d" "1" "$line" "$out" "$exebase"
1213aa99676SStefan Eßer
12244d4804dSStefan Eßer		# Set the options for standard mode.
1233aa99676SStefan Eßer		options="-ls"
12444d4804dSStefan Eßer
1253aa99676SStefan Eßer	else
1263aa99676SStefan Eßer		options="$opts"
1273aa99676SStefan Eßer	fi
1283aa99676SStefan Eßer
12944d4804dSStefan Eßer	# Output something pretty.
1303aa99676SStefan Eßer	base=$(basename "$testfile")
1313aa99676SStefan Eßer	base="${base%.*}"
1323aa99676SStefan Eßer	printf 'Running %s %s...' "$d" "$base"
1333aa99676SStefan Eßer
13444d4804dSStefan Eßer	# Test errors on each line of the file. Yes, each line has a separate error
13544d4804dSStefan Eßer	# case.
1363aa99676SStefan Eßer	while read -r line; do
1373aa99676SStefan Eßer
1383aa99676SStefan Eßer		rm -f "$out"
1393aa99676SStefan Eßer
1403aa99676SStefan Eßer		printf '%s\n' "$line" | "$exe" "$@" "$options" 2> "$out" > /dev/null
1413aa99676SStefan Eßer		err="$?"
1423aa99676SStefan Eßer
14310328f8bSStefan Eßer		checkerrtest "$d" "$err" "$line" "$out" "$exebase"
1443aa99676SStefan Eßer
1453aa99676SStefan Eßer	done < "$testfile"
1463aa99676SStefan Eßer
1473aa99676SStefan Eßer	printf 'pass\n'
1483aa99676SStefan Eßer
1493aa99676SStefan Eßerdone
1503aa99676SStefan Eßer
15144d4804dSStefan Eßer# Test all the files in the errors directory. While the loop above does one test
15244d4804dSStefan Eßer# for every line, this does one test per file, but it runs the file through
15344d4804dSStefan Eßer# stdin and as a file on the command-line.
1543aa99676SStefan Eßerfor testfile in $testdir/$d/errors/*.txt; do
1553aa99676SStefan Eßer
1563aa99676SStefan Eßer	printf 'Running %s error file %s...' "$d" "$testfile"
1573aa99676SStefan Eßer
1583aa99676SStefan Eßer	printf '%s\n' "$halt" | "$exe" "$@" $opts "$testfile" 2> "$out" > /dev/null
1593aa99676SStefan Eßer	err="$?"
1603aa99676SStefan Eßer
16110328f8bSStefan Eßer	checkerrtest "$d" "$err" "$testfile" "$out" "$exebase"
1623aa99676SStefan Eßer
1633aa99676SStefan Eßer	printf 'pass\n'
1643aa99676SStefan Eßer
1653aa99676SStefan Eßer	printf 'Running %s error file %s through cat...' "$d" "$testfile"
1663aa99676SStefan Eßer
1673aa99676SStefan Eßer	cat "$testfile" | "$exe" "$@" $opts 2> "$out" > /dev/null
1683aa99676SStefan Eßer	err="$?"
1693aa99676SStefan Eßer
1703aa99676SStefan Eßer	checkcrash "$d" "$err" "$testfile"
1713aa99676SStefan Eßer
1723aa99676SStefan Eßer	printf 'pass\n'
1733aa99676SStefan Eßer
1743aa99676SStefan Eßerdone
175