aboutsummaryrefslogtreecommitdiffstats
path: root/tests/read.sh
blob: 815329a2599b445dafdb93c21e20d99881ffe9ab (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#! /bin/sh
#
# Copyright 2018 Gavin D. Howard
#
# Permission to use, copy, modify, and/or distribute this software for any
# purpose with or without fee is hereby granted.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
# AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
# OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
#

set -e

script="$0"
testdir=$(dirname "$script")

. "$testdir/functions.sh"

if [ "$#" -lt 1 ]; then
	printf 'usage: %s dir [exe [args...]]\n' "$0"
	printf 'valid dirs are:\n'
	printf '\n'
	cat "$testdir/all.txt"
	printf '\n'
	exit 1
fi

d="$1"
shift

if [ "$#" -gt 0 ]; then
	exe="$1"
	shift
else
	exe="$testdir/../bin/$d"
fi

name="$testdir/$d/read.txt"
results="$testdir/$d/read_results.txt"
errors="$testdir/$d/read_errors.txt"

out="$testdir/../.log_${d}_test.txt"

exebase=$(basename "$exe")

if [ "$d" = "bc" ]; then
	options="-lq"
	halt="halt"
else
	options="-x"
	halt="q"
fi

if [ "$d" = "bc" ]; then
	read_call="read()"
	read_expr="${read_call}\n5+5;"
else
	read_call="?"
	read_expr="${read_call}"
fi

printf 'Running %s read...\n' "$d"

while read line; do

	printf '%s\n%s\n' "$read_call" "$line" | "$exe" "$options" "$@" > "$out"
	diff "$results" "$out"

done < "$name"

set +e

printf 'Running %s read errors...\n' "$d"

while read line; do

	printf '%s\n%s\n' "$read_call" "$line" | "$exe" "$options" "$@" 2> "$out" > /dev/null
	err="$?"

	checktest "$err" "$line" "$out" "$exebase"

done < "$errors"

printf 'Running %s empty read...\n' "$d"

read_test=$(printf '%s\n' "$read_call")

printf '%s\n' "$read_test" | "$exe" "$@" "$opts" 2> "$out" > /dev/null
err="$?"

checktest "$err" "$read_test" "$out" "$exebase"

printf 'Running %s read EOF...\n' "$d"

read_test=$(printf '%s' "$read_call")

printf '%s' "$read_test" | "$exe" "$@" "$opts" 2> "$out" > /dev/null
err="$?"

checktest "$err" "$read_test" "$out" "$exebase"