xref: /freebsd/contrib/bc/tests/read.sh (revision 175a4d10)
13aa99676SStefan Eßer#! /bin/sh
23aa99676SStefan Eßer#
33aa99676SStefan Eßer# SPDX-License-Identifier: BSD-2-Clause
43aa99676SStefan Eßer#
5d101cdd6SStefan Eßer# Copyright (c) 2018-2023 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ß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
464fca8e0fSStefan Eßer	printf 'usage: %s dir [exe [args...]]\n' "$script"
473aa99676SStefan Eßer	printf 'valid dirs are:\n'
483aa99676SStefan Eßer	printf '\n'
493aa99676SStefan Eßer	cat "$testdir/all.txt"
503aa99676SStefan Eßer	printf '\n'
513aa99676SStefan Eßer	exit 1
524fca8e0fSStefan Eßer}
534fca8e0fSStefan Eßer
544fca8e0fSStefan Eßer# Command-line processing.
554fca8e0fSStefan Eßerif [ "$#" -lt 1 ]; then
564fca8e0fSStefan Eßer	usage "Not enough arguments"
573aa99676SStefan Eßerfi
583aa99676SStefan Eßer
593aa99676SStefan Eßerd="$1"
603aa99676SStefan Eßershift
614fca8e0fSStefan Eßercheck_d_arg "$d"
623aa99676SStefan Eßer
633aa99676SStefan Eßerif [ "$#" -gt 0 ]; then
643aa99676SStefan Eßer	exe="$1"
653aa99676SStefan Eßer	shift
664fca8e0fSStefan Eßer	check_exec_arg "$exe"
673aa99676SStefan Eßerelse
683aa99676SStefan Eßer	exe="$testdir/../bin/$d"
694fca8e0fSStefan Eßer	check_exec_arg "$exe"
703aa99676SStefan Eßerfi
713aa99676SStefan Eßer
723aa99676SStefan Eßername="$testdir/$d/read.txt"
733aa99676SStefan Eßerresults="$testdir/$d/read_results.txt"
743aa99676SStefan Eßererrors="$testdir/$d/read_errors.txt"
753aa99676SStefan Eßer
76662087dfSStefan Eßerout="$outputdir/${d}_outputs/read_results.txt"
77175a4d10SStefan Eßermultiple_res="$outputdir/${d}_outputs/read_multiple_results.txt"
7810328f8bSStefan Eßeroutdir=$(dirname "$out")
7910328f8bSStefan Eßer
8044d4804dSStefan Eßer# Make sure the directory exists.
8110328f8bSStefan Eßerif [ ! -d "$outdir" ]; then
8210328f8bSStefan Eßer	mkdir -p "$outdir"
8310328f8bSStefan Eßerfi
843aa99676SStefan Eßer
853aa99676SStefan Eßerexebase=$(basename "$exe")
863aa99676SStefan Eßer
8744d4804dSStefan Eßer# Set stuff for the correct calculator.
883aa99676SStefan Eßerif [ "$d" = "bc" ]; then
893aa99676SStefan Eßer	options="-lq"
903aa99676SStefan Eßer	halt="halt"
913aa99676SStefan Eßer	read_call="read()"
923aa99676SStefan Eßer	read_expr="${read_call}\n5+5;"
93175a4d10SStefan Eßer	read_multiple=$(printf '%s\n%s\n%s\n' "3" "2" "1")
943aa99676SStefan Eßerelse
9544d4804dSStefan Eßer	options="-x"
9644d4804dSStefan Eßer	halt="q"
973aa99676SStefan Eßer	read_call="?"
983aa99676SStefan Eßer	read_expr="${read_call}"
99175a4d10SStefan Eßer	read_multiple=$(printf '%spR\n%spR\n%spR\n' "3" "2" "1")
1003aa99676SStefan Eßerfi
1013aa99676SStefan Eßer
10244d4804dSStefan Eßer# I use these, so unset them to make the tests work.
10344d4804dSStefan Eßerunset BC_ENV_ARGS
10444d4804dSStefan Eßerunset BC_LINE_LENGTH
10544d4804dSStefan Eßerunset DC_ENV_ARGS
10644d4804dSStefan Eßerunset DC_LINE_LENGTH
10744d4804dSStefan Eßer
1083aa99676SStefan Eßerprintf 'Running %s read...' "$d"
1093aa99676SStefan Eßer
11010328f8bSStefan Eßerset +e
11110328f8bSStefan Eßer
11244d4804dSStefan Eßer# Run read() on every line.
1133aa99676SStefan Eßerwhile read line; do
1143aa99676SStefan Eßer
1153aa99676SStefan Eßer	printf '%s\n%s\n' "$read_call" "$line" | "$exe" "$@" "$options" > "$out"
11610328f8bSStefan Eßer	checktest "$d" "$?" 'read' "$results" "$out"
1173aa99676SStefan Eßer
1183aa99676SStefan Eßerdone < "$name"
1193aa99676SStefan Eßer
1203aa99676SStefan Eßerprintf 'pass\n'
1213aa99676SStefan Eßer
122175a4d10SStefan Eßerprintf 'Running %s read multiple...' "$d"
123175a4d10SStefan Eßer
124175a4d10SStefan Eßerprintf '3\n2\n1\n' > "$multiple_res"
125175a4d10SStefan Eßer
126175a4d10SStefan Eßer# Run multiple read() calls.
127175a4d10SStefan Eßerprintf '%s\n' "$read_multiple" | "$exe" "$@" "$options" -e "$read_call" -e "$read_call" -e "$read_call" > "$out"
128175a4d10SStefan Eßerchecktest "$d" "$?" 'read multiple' "$multiple_res" "$out"
129175a4d10SStefan Eßer
130175a4d10SStefan Eßerprintf 'pass\n'
131175a4d10SStefan Eßer
1323aa99676SStefan Eßerprintf 'Running %s read errors...' "$d"
1333aa99676SStefan Eßer
13444d4804dSStefan Eßer# Run read on every line.
1353aa99676SStefan Eßerwhile read line; do
1363aa99676SStefan Eßer
1373aa99676SStefan Eßer	printf '%s\n%s\n' "$read_call" "$line" | "$exe" "$@" "$options" 2> "$out" > /dev/null
1383aa99676SStefan Eßer	err="$?"
1393aa99676SStefan Eßer
14010328f8bSStefan Eßer	checkerrtest "$d" "$err" "$line" "$out" "$exebase"
1413aa99676SStefan Eßer
1423aa99676SStefan Eßerdone < "$errors"
1433aa99676SStefan Eßer
1443aa99676SStefan Eßerprintf 'pass\n'
1453aa99676SStefan Eßer
1463aa99676SStefan Eßerprintf 'Running %s empty read...' "$d"
1473aa99676SStefan Eßer
1483aa99676SStefan Eßerread_test=$(printf '%s\n' "$read_call")
1493aa99676SStefan Eßer
1503aa99676SStefan Eßerprintf '%s\n' "$read_test" | "$exe" "$@" "$opts" 2> "$out" > /dev/null
1513aa99676SStefan Eßererr="$?"
1523aa99676SStefan Eßer
15310328f8bSStefan Eßercheckerrtest "$d" "$err" "$read_test" "$out" "$exebase"
1543aa99676SStefan Eßer
1553aa99676SStefan Eßerprintf 'pass\n'
1563aa99676SStefan Eßer
1573aa99676SStefan Eßerprintf 'Running %s read EOF...' "$d"
1583aa99676SStefan Eßer
1593aa99676SStefan Eßerread_test=$(printf '%s' "$read_call")
1603aa99676SStefan Eßer
1613aa99676SStefan Eßerprintf '%s' "$read_test" | "$exe" "$@" "$opts" 2> "$out" > /dev/null
1623aa99676SStefan Eßererr="$?"
1633aa99676SStefan Eßer
16410328f8bSStefan Eßercheckerrtest "$d" "$err" "$read_test" "$out" "$exebase"
1653aa99676SStefan Eßer
16610328f8bSStefan Eßerexec printf 'pass\n'
167