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