xref: /freebsd/contrib/bc/tests/test.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ßerset -e
313aa99676SStefan Eßer
323aa99676SStefan Eßerscript="$0"
333aa99676SStefan Eßer
343aa99676SStefan Eßertestdir=$(dirname "$script")
353aa99676SStefan Eßer
3644d4804dSStefan Eßer. "$testdir/../scripts/functions.sh"
3710328f8bSStefan Eßer
38662087dfSStefan Eßeroutputdir=${BC_TEST_OUTPUT_DIR:-$testdir}
39662087dfSStefan Eßer
404fca8e0fSStefan Eßer# Just print the usage and exit with an error. This can receive a message to
414fca8e0fSStefan Eßer# print.
424fca8e0fSStefan Eßer# @param 1  A message to print.
434fca8e0fSStefan Eßerusage() {
444fca8e0fSStefan Eßer	if [ $# -eq 1 ]; then
454fca8e0fSStefan Eßer		printf '%s\n\n' "$1"
464fca8e0fSStefan Eßer	fi
473aa99676SStefan Eßer	printf 'usage: %s dir test [generate_tests] [time_tests] [exe [args...]]\n' "$0"
483aa99676SStefan Eßer	printf 'valid dirs are:\n'
493aa99676SStefan Eßer	printf '\n'
503aa99676SStefan Eßer	cat "$testdir/all.txt"
513aa99676SStefan Eßer	printf '\n'
523aa99676SStefan Eßer	exit 1
534fca8e0fSStefan Eßer}
544fca8e0fSStefan Eßer
554fca8e0fSStefan Eßer# Command-line processing.
564fca8e0fSStefan Eßerif [ "$#" -lt 2 ]; then
574fca8e0fSStefan Eßer	usage "Need at least 2 arguments"
583aa99676SStefan Eßerfi
593aa99676SStefan Eßer
603aa99676SStefan Eßerd="$1"
613aa99676SStefan Eßershift
624fca8e0fSStefan Eßercheck_d_arg "$d"
633aa99676SStefan Eßer
644fca8e0fSStefan Eßer# We don't use check_file_arg on the test or the result because they might be
654fca8e0fSStefan Eßer# generated.
663aa99676SStefan Eßert="$1"
673aa99676SStefan Eßername="$testdir/$d/$t.txt"
683aa99676SStefan Eßerresults="$testdir/$d/${t}_results.txt"
693aa99676SStefan Eßershift
703aa99676SStefan Eßer
713aa99676SStefan Eßerif [ "$#" -gt 0 ]; then
723aa99676SStefan Eßer	generate_tests="$1"
733aa99676SStefan Eßer	shift
744fca8e0fSStefan Eßer	check_bool_arg "$generate_tests"
753aa99676SStefan Eßerelse
763aa99676SStefan Eßer	generate_tests=1
774fca8e0fSStefan Eßer	check_bool_arg "$generate_tests"
783aa99676SStefan Eßerfi
793aa99676SStefan Eßer
803aa99676SStefan Eßerif [ "$#" -gt 0 ]; then
813aa99676SStefan Eßer	time_tests="$1"
823aa99676SStefan Eßer	shift
834fca8e0fSStefan Eßer	check_bool_arg "$time_tests"
843aa99676SStefan Eßerelse
853aa99676SStefan Eßer	time_tests=0
864fca8e0fSStefan Eßer	check_bool_arg "$time_tests"
873aa99676SStefan Eßerfi
883aa99676SStefan Eßer
893aa99676SStefan Eßerif [ "$#" -gt 0 ]; then
903aa99676SStefan Eßer	exe="$1"
913aa99676SStefan Eßer	shift
924fca8e0fSStefan Eßer	check_exec_arg "$exe"
933aa99676SStefan Eßerelse
943aa99676SStefan Eßer	exe="$testdir/../bin/$d"
954fca8e0fSStefan Eßer	check_exec_arg "$exe"
963aa99676SStefan Eßerfi
973aa99676SStefan Eßer
98662087dfSStefan Eßerout="$outputdir/${d}_outputs/${t}_results.txt"
9910328f8bSStefan Eßeroutdir=$(dirname "$out")
10010328f8bSStefan Eßer
10144d4804dSStefan Eßer# Make sure the directory exists.
10210328f8bSStefan Eßerif [ ! -d "$outdir" ]; then
10310328f8bSStefan Eßer	mkdir -p "$outdir"
10410328f8bSStefan Eßerfi
10510328f8bSStefan Eßer
10644d4804dSStefan Eßer# I use these, so unset them to make the tests work.
10710328f8bSStefan Eßerunset BC_ENV_ARGS
10810328f8bSStefan Eßerunset BC_LINE_LENGTH
10910328f8bSStefan Eßerunset DC_ENV_ARGS
11010328f8bSStefan Eßerunset DC_LINE_LENGTH
1113aa99676SStefan Eßer
11244d4804dSStefan Eßer# Set stuff for the correct calculator.
1133aa99676SStefan Eßerif [ "$d" = "bc" ]; then
1143aa99676SStefan Eßer	options="-lq"
1153aa99676SStefan Eßer	var="BC_LINE_LENGTH"
1163aa99676SStefan Eßer	halt="halt"
1173aa99676SStefan Eßerelse
1183aa99676SStefan Eßer	options=""
1193aa99676SStefan Eßer	var="DC_LINE_LENGTH"
1203aa99676SStefan Eßer	halt="q"
1213aa99676SStefan Eßerfi
1223aa99676SStefan Eßer
12344d4804dSStefan Eßer# If the test does not exist...
1243aa99676SStefan Eßerif [ ! -f "$name" ]; then
1253aa99676SStefan Eßer
12644d4804dSStefan Eßer	# Skip if we can't generate.
1273aa99676SStefan Eßer	if [ "$generate_tests" -eq 0 ]; then
1283aa99676SStefan Eßer		printf 'Skipping %s %s test\n' "$d" "$t"
1293aa99676SStefan Eßer		exit 0
1303aa99676SStefan Eßer	fi
1313aa99676SStefan Eßer
13244d4804dSStefan Eßer	# Generate.
1333aa99676SStefan Eßer	printf 'Generating %s %s...' "$d" "$t"
13444d4804dSStefan Eßer	"$d" "$testdir/$d/scripts/$t.$d" > "$name"
1353aa99676SStefan Eßer	printf 'done\n'
1363aa99676SStefan Eßerfi
1373aa99676SStefan Eßer
13844d4804dSStefan Eßer# If the results do not exist, generate..
1393aa99676SStefan Eßerif [ ! -f "$results" ]; then
1403aa99676SStefan Eßer	printf 'Generating %s %s results...' "$d" "$t"
141103d7cdfSStefan Eßer	printf '%s\n' "$halt" 2> /dev/null | "$d" $options "$name" > "$results"
1423aa99676SStefan Eßer	printf 'done\n'
1433aa99676SStefan Eßerfi
1443aa99676SStefan Eßer
145d101cdd6SStefan Eßer# We set this here because GNU bc and dc does not have these options.
146d101cdd6SStefan Eßerif [ "$d" = "bc" ]; then
147d101cdd6SStefan Eßer	options="-lqc"
148d101cdd6SStefan Eßerelse
149d101cdd6SStefan Eßer	options="-xc"
1503aa99676SStefan Eßerfi
1513aa99676SStefan Eßer
1523aa99676SStefan Eßerexport $var=string
1533aa99676SStefan Eßer
15410328f8bSStefan Eßerset +e
15510328f8bSStefan Eßer
1563aa99676SStefan Eßerprintf 'Running %s %s...' "$d" "$t"
1573aa99676SStefan Eßer
1583aa99676SStefan Eßerif [ "$time_tests" -ne 0 ]; then
1593aa99676SStefan Eßer	printf '\n'
160103d7cdfSStefan Eßer	printf '%s\n' "$halt" 2> /dev/null | /usr/bin/time -p "$exe" "$@" $options "$name" > "$out"
16110328f8bSStefan Eßer	err="$?"
1623aa99676SStefan Eßer	printf '\n'
1633aa99676SStefan Eßerelse
164103d7cdfSStefan Eßer	printf '%s\n' "$halt" 2> /dev/null | "$exe" "$@" $options "$name" > "$out"
16510328f8bSStefan Eßer	err="$?"
1663aa99676SStefan Eßerfi
1673aa99676SStefan Eßer
16810328f8bSStefan Eßerchecktest "$d" "$err" "$t" "$results" "$out"
1693aa99676SStefan Eßer
1703aa99676SStefan Eßerrm -f "$out"
1713aa99676SStefan Eßer
17210328f8bSStefan Eßerexec printf 'pass\n'
173