1#! /bin/sh 2# 3# SPDX-License-Identifier: BSD-2-Clause 4# 5# Copyright (c) 2018-2021 Gavin D. Howard and contributors. 6# 7# Redistribution and use in source and binary forms, with or without 8# modification, are permitted provided that the following conditions are met: 9# 10# * Redistributions of source code must retain the above copyright notice, this 11# list of conditions and the following disclaimer. 12# 13# * Redistributions in binary form must reproduce the above copyright notice, 14# this list of conditions and the following disclaimer in the documentation 15# and/or other materials provided with the distribution. 16# 17# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 18# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 21# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 22# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 23# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 24# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 25# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 26# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 27# POSSIBILITY OF SUCH DAMAGE. 28# 29 30# WARNING: Test files cannot have empty lines! 31 32script="$0" 33testdir=$(dirname "$script") 34 35. "$testdir/../scripts/functions.sh" 36 37outputdir=${BC_TEST_OUTPUT_DIR:-$testdir} 38 39# Command-line processing. 40if [ "$#" -eq 0 ]; then 41 printf 'usage: %s dir [exec args...]\n' "$script" 42 exit 1 43else 44 d="$1" 45 shift 46fi 47 48if [ "$#" -lt 1 ]; then 49 exe="$testdir/../bin/$d" 50else 51 exe="$1" 52 shift 53fi 54 55# I use these, so unset them to make the tests work. 56unset BC_ENV_ARGS 57unset BC_LINE_LENGTH 58unset DC_ENV_ARGS 59unset DC_LINE_LENGTH 60 61out="$outputdir/${d}_outputs/errors_results.txt" 62outdir=$(dirname "$out") 63 64# Make sure the directory exists. 65if [ ! -d "$outdir" ]; then 66 mkdir -p "$outdir" 67fi 68 69exebase=$(basename "$exe") 70 71# These are the filenames for the extra tests. 72posix="posix_errors" 73read_errors="read_errors" 74 75# Set stuff for the correct calculator. 76if [ "$d" = "bc" ]; then 77 opts="-l" 78 halt="halt" 79 read_call="read()" 80 read_expr="${read_call}\n5+5;" 81else 82 opts="-x" 83 halt="q" 84fi 85 86printf 'Running %s command-line error tests...' "$d" 87 88printf '%s\n' "$halt" | "$exe" "$@" -e "1+1" -f- -e "2+2" 2> "$out" > /dev/null 89err="$?" 90 91checkerrtest "$d" "$err" "command-line -e test" "$out" "$exebase" 92 93printf '%s\n' "$halt" | "$exe" "$@" -e "1+1" -f- -f "$testdir/$d/decimal.txt" 2> "$out" > /dev/null 94err="$?" 95 96checkerrtest "$d" "$err" "command-line -f test" "$out" "$exebase" 97 98printf 'pass\n' 99 100# Now test the error files in the standard tests directory. 101for testfile in $testdir/$d/*errors.txt; do 102 103 if [ -z "${testfile##*$read_errors*}" ]; then 104 # We don't test read errors here. Skip. 105 continue 106 fi 107 108 # Test bc POSIX errors and warnings. 109 if [ -z "${testfile##*$posix*}" ]; then 110 111 # Just test warnings. 112 line="last" 113 printf '%s\n' "$line" | "$exe" "$@" "-lw" 2> "$out" > /dev/null 114 err="$?" 115 116 if [ "$err" -ne 0 ]; then 117 die "$d" "returned an error ($err)" "POSIX warning" 1 118 fi 119 120 checkerrtest "$d" "1" "$line" "$out" "$exebase" 121 122 # Set the options for standard mode. 123 options="-ls" 124 125 else 126 options="$opts" 127 fi 128 129 # Output something pretty. 130 base=$(basename "$testfile") 131 base="${base%.*}" 132 printf 'Running %s %s...' "$d" "$base" 133 134 # Test errors on each line of the file. Yes, each line has a separate error 135 # case. 136 while read -r line; do 137 138 rm -f "$out" 139 140 printf '%s\n' "$line" | "$exe" "$@" "$options" 2> "$out" > /dev/null 141 err="$?" 142 143 checkerrtest "$d" "$err" "$line" "$out" "$exebase" 144 145 done < "$testfile" 146 147 printf 'pass\n' 148 149done 150