xref: /freebsd/contrib/bc/tests/errors.sh (revision a970610a3af63b3f4df5b69d91c6b4093a00ed8f)
13aa99676SStefan Eßer#! /bin/sh
23aa99676SStefan Eßer#
33aa99676SStefan Eßer# SPDX-License-Identifier: BSD-2-Clause
43aa99676SStefan Eßer#
5*a970610aSStefan Eßer# Copyright (c) 2018-2024 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
37662087dfSStefan Eßeroutputdir=${BC_TEST_OUTPUT_DIR:-$testdir}
38662087dfSStefan Eßer
394fca8e0fSStefan Eßer# Just print the usage and exit with an error. This can receive a message to
404fca8e0fSStefan Eßer# print.
414fca8e0fSStefan Eßer# @param 1  A message to print.
424fca8e0fSStefan Eßerusage() {
434fca8e0fSStefan Eßer	if [ $# -eq 1 ]; then
444fca8e0fSStefan Eßer		printf '%s\n\n' "$1"
454fca8e0fSStefan Eßer	fi
463aa99676SStefan Eßer	printf 'usage: %s dir [exec args...]\n' "$script"
473aa99676SStefan Eßer	exit 1
484fca8e0fSStefan Eßer}
494fca8e0fSStefan Eßer
504fca8e0fSStefan Eßer# Command-line processing.
514fca8e0fSStefan Eßerif [ "$#" -eq 0 ]; then
524fca8e0fSStefan Eßer	usage "Not enough arguments"
533aa99676SStefan Eßerelse
543aa99676SStefan Eßer	d="$1"
553aa99676SStefan Eßer	shift
564fca8e0fSStefan Eßer	check_d_arg "$d"
573aa99676SStefan Eßerfi
583aa99676SStefan Eßer
593aa99676SStefan Eßerif [ "$#" -lt 1 ]; then
603aa99676SStefan Eßer	exe="$testdir/../bin/$d"
614fca8e0fSStefan Eßer	check_exec_arg "$exe"
623aa99676SStefan Eßerelse
633aa99676SStefan Eßer	exe="$1"
643aa99676SStefan Eßer	shift
654fca8e0fSStefan Eßer	check_exec_arg "$exe"
663aa99676SStefan Eßerfi
673aa99676SStefan Eßer
6844d4804dSStefan Eßer# I use these, so unset them to make the tests work.
6910328f8bSStefan Eßerunset BC_ENV_ARGS
7010328f8bSStefan Eßerunset BC_LINE_LENGTH
7110328f8bSStefan Eßerunset DC_ENV_ARGS
7210328f8bSStefan Eßerunset DC_LINE_LENGTH
7310328f8bSStefan Eßer
74662087dfSStefan Eßerout="$outputdir/${d}_outputs/errors_results.txt"
7510328f8bSStefan Eßeroutdir=$(dirname "$out")
7610328f8bSStefan Eßer
7744d4804dSStefan Eßer# Make sure the directory exists.
7810328f8bSStefan Eßerif [ ! -d "$outdir" ]; then
7910328f8bSStefan Eßer	mkdir -p "$outdir"
8010328f8bSStefan Eßerfi
813aa99676SStefan Eßer
823aa99676SStefan Eßerexebase=$(basename "$exe")
833aa99676SStefan Eßer
8444d4804dSStefan Eßer# These are the filenames for the extra tests.
853aa99676SStefan Eßerposix="posix_errors"
863aa99676SStefan Eßerread_errors="read_errors"
873aa99676SStefan Eßer
8844d4804dSStefan Eßer# Set stuff for the correct calculator.
893aa99676SStefan Eßerif [ "$d" = "bc" ]; then
903aa99676SStefan Eßer	opts="-l"
913aa99676SStefan Eßer	halt="halt"
923aa99676SStefan Eßer	read_call="read()"
933aa99676SStefan Eßer	read_expr="${read_call}\n5+5;"
943aa99676SStefan Eßerelse
953aa99676SStefan Eßer	opts="-x"
963aa99676SStefan Eßer	halt="q"
973aa99676SStefan Eßerfi
983aa99676SStefan Eßer
9944d4804dSStefan Eßerprintf 'Running %s command-line error tests...' "$d"
10044d4804dSStefan Eßer
101103d7cdfSStefan Eßerprintf '%s\n' "$halt" 2> /dev/null | "$exe" "$@" -e "1+1" -f- -e "2+2" 2> "$out" > /dev/null
10244d4804dSStefan Eßererr="$?"
10344d4804dSStefan Eßer
10444d4804dSStefan Eßercheckerrtest "$d" "$err" "command-line -e test" "$out" "$exebase"
10544d4804dSStefan Eßer
106103d7cdfSStefan Eßerprintf '%s\n' "$halt" 2> /dev/null | "$exe" "$@" -e "1+1" -f- -f "$testdir/$d/decimal.txt" 2> "$out" > /dev/null
10744d4804dSStefan Eßererr="$?"
10844d4804dSStefan Eßer
10944d4804dSStefan Eßercheckerrtest "$d" "$err" "command-line -f test" "$out" "$exebase"
11044d4804dSStefan Eßer
11144d4804dSStefan Eßerprintf 'pass\n'
11244d4804dSStefan Eßer
11344d4804dSStefan Eßer# Now test the error files in the standard tests directory.
1143aa99676SStefan Eßerfor testfile in $testdir/$d/*errors.txt; do
1153aa99676SStefan Eßer
1163aa99676SStefan Eßer	if [ -z "${testfile##*$read_errors*}" ]; then
1173aa99676SStefan Eßer		# We don't test read errors here. Skip.
1183aa99676SStefan Eßer		continue
1193aa99676SStefan Eßer	fi
1203aa99676SStefan Eßer
12144d4804dSStefan Eßer	# Test bc POSIX errors and warnings.
1223aa99676SStefan Eßer	if [ -z "${testfile##*$posix*}" ]; then
1233aa99676SStefan Eßer
12444d4804dSStefan Eßer		# Just test warnings.
1253aa99676SStefan Eßer		line="last"
126103d7cdfSStefan Eßer		printf '%s\n' "$line" 2> /dev/null | "$exe" "$@" "-lw"  2> "$out" > /dev/null
1273aa99676SStefan Eßer		err="$?"
1283aa99676SStefan Eßer
1293aa99676SStefan Eßer		if [ "$err" -ne 0 ]; then
1303aa99676SStefan Eßer			die "$d" "returned an error ($err)" "POSIX warning" 1
1313aa99676SStefan Eßer		fi
1323aa99676SStefan Eßer
13310328f8bSStefan Eßer		checkerrtest "$d" "1" "$line" "$out" "$exebase"
1343aa99676SStefan Eßer
13544d4804dSStefan Eßer		# Set the options for standard mode.
1363aa99676SStefan Eßer		options="-ls"
13744d4804dSStefan Eßer
1383aa99676SStefan Eßer	else
1393aa99676SStefan Eßer		options="$opts"
1403aa99676SStefan Eßer	fi
1413aa99676SStefan Eßer
14244d4804dSStefan Eßer	# Output something pretty.
1433aa99676SStefan Eßer	base=$(basename "$testfile")
1443aa99676SStefan Eßer	base="${base%.*}"
1453aa99676SStefan Eßer	printf 'Running %s %s...' "$d" "$base"
1463aa99676SStefan Eßer
14744d4804dSStefan Eßer	# Test errors on each line of the file. Yes, each line has a separate error
14844d4804dSStefan Eßer	# case.
1493aa99676SStefan Eßer	while read -r line; do
1503aa99676SStefan Eßer
1513aa99676SStefan Eßer		rm -f "$out"
1523aa99676SStefan Eßer
153103d7cdfSStefan Eßer		printf '%s\n' "$line" 2> /dev/null | "$exe" "$@" "$options" 2> "$out" > /dev/null
1543aa99676SStefan Eßer		err="$?"
1553aa99676SStefan Eßer
15610328f8bSStefan Eßer		checkerrtest "$d" "$err" "$line" "$out" "$exebase"
1573aa99676SStefan Eßer
1583aa99676SStefan Eßer	done < "$testfile"
1593aa99676SStefan Eßer
1603aa99676SStefan Eßer	printf 'pass\n'
1613aa99676SStefan Eßer
1623aa99676SStefan Eßerdone
163