TEST_DESCRIPTION="Buffering test."
. ./test_header.sh
. ./prll_seq.sh

ntrndm=42
notrandom() {
    ntrndm=$(( (1664525*ntrndm + 1013904223) % 4294967296 ))
}
lots_of_noise() {
    nkk=$(for i in $(prll_seq 3000) ; do
	notrandom
	echo -n "$ntrndm "  # Make a long line
	done | tr '\n' ' ')
    # Make a longer line
    nkk2=$(for i in $(prll_seq 50) ; do echo -n $nkk; done)
    count=0
    for i in $(prll_seq 100) ; do
	# Make lines slightly unique
	notrandom
    	echo $ntrndm $nkk2 > buffering.data$(printf "%02d" $count)
	count=$((count + 1))
    done
}

fltr() { cat $1 | tr 5 6 ; }

if [ ! -f buffering.ref ] ; then
    echo "Making reference data."
    lots_of_noise
    cat buffering.data* | fltr - | sort > buffering.ref
fi

rm -f buffering.dat1 buffering.dat1b buffering.dat10 buffering.dat10b

PRLL_NRJOBS=1 prll -b fltr buffering.data* \
    > buffering.dat1 || exit 1

PRLL_NRJOBS=1 prll fltr buffering.data* \
    > buffering.dat1b || exit 1

PRLL_NRJOBS=10 prll -b fltr buffering.data* \
    > buffering.dat10 || exit 1

PRLL_NRJOBS=10 prll fltr buffering.data* \
    > buffering.dat10b || exit 1

stats=0
sort buffering.dat1 | diff -q buffering.ref -
if [ $? -ne 0 ] ; then
    stats=1
    echo "Unbuffered serial execution produced wrong results."
else
    echo "Unbuffered serial execution produced correct results."
fi
sort buffering.dat1b | diff -q buffering.ref -
if [ $? -ne 0 ] ; then
    stats=1
    echo "Buffered serial execution produced wrong results."
else
    echo "Buffered serial execution produced correct results."
fi
sort buffering.dat10 | diff -q buffering.ref -
if [ $? -ne 0 ] ; then
    echo "Unbuffered parallel execution produced wrong results, as expected."
else
    echo "Unbuffered parallel execution produced correct results,"
    echo "which is rather unexpected."
fi
sort buffering.dat10b | diff -q buffering.ref -
if [ $? -ne 0 ] ; then
    stats=1
    echo "Buffered parallel execution produced wrong results."
else
    echo "Buffered parallel execution produced correct results."
fi
exit $stats
