1#!/bin/sh
2
3set -e
4
5# Strip leading spaces and trailing comment from $1.
6strip() {
7	echo "$1" | sed -e 's/^ *//' -e 's/ *#.*$//'
8}
9
10run_test() {
11	local _cause= _diff=$stdout
12
13	env $env "$1" -b "$PICK" -k $input -- $args <$stdin >$out 2>&1; e=$?
14
15	if [ -s "$stdout" ] && ! cmp -s "$stdout" "$out"; then
16		_cause="wrong output"
17	elif [ "${exit:-0}" -ne "$e" ]; then
18		_cause="want exit code ${exit}, got ${e}"
19		_diff="/dev/null"
20	fi
21
22	if [ -n "$_cause" ]; then
23		printf 'FAIL:\t%s\n' "$description" 1>&2
24		printf 'CAUSE:\t%s\n' "$_cause" 1>&2
25		diff -u -L stdout-want -L stdout-got "$_diff" "$out"
26		return 1
27	fi
28
29	return 0
30}
31
32usage() {
33	echo "usage: sh pick-test.sh -b binary file ..." 1>&2
34	exit 1
35}
36
37picktest=""
38
39while getopts "b:" opt; do
40	case "$opt" in
41	b)	picktest="$OPTARG";;
42	*)	usage;;
43	esac
44done
45shift $((OPTIND - 1))
46{ [ $# -eq 0 ] || [ -z "$picktest" ]; } && usage
47
48nerr=0
49
50in=$(mktemp -t pick-test.XXXXXX)
51out=$(mktemp -t pick-test.XXXXXX)
52stdin=$(mktemp -t pick-test.XXXXXX)
53stdout=$(mktemp -t pick-test.XXXXXX)
54input=$(mktemp -t pick-test.XXXXXX)
55trap "rm -f $in $out $stdin $stdout $input" EXIT
56
57for f; do
58	(cat "$f"; echo) >$in
59	while IFS=: read -r key val; do
60		if [ -z "$key" ]; then
61			env="${defenv} ${env}"
62			run_test "$picktest" || nerr=$((nerr + 1))
63
64			# Reset environment.
65			args= description= env= exit= keys=
66			>$out; >$stdin; >$stdout; >$input
67		elif [ "$key" = "keys" ]; then
68			printf "${val%%#*}" >$input
69		elif [ -n "$val" ]; then
70			eval "${key}='$(strip "$val")'"
71		else
72			case "$key" in
73			stdin)	tmpfile=$stdin;;
74			stdout)	tmpfile=$stdout;;
75			*)	printf "${key}\n" >>$tmpfile;;
76			esac
77		fi
78	done <$in
79done
80
81exit $((nerr > 0))
82