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