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