mawk/test/mawktest
2012-06-27 21:54:40 -04:00

232 lines
6.3 KiB
Bash
Executable File

#!/bin/sh
# $MawkId: mawktest,v 1.31 2012/06/27 13:56:20 tom Exp $
###############################################################################
# copyright 2008-2010,2012, Thomas E. Dickey
# copyright 2010, Guido Berhoerster
# copyright 2010, Jonathan Nieder
# copyright 2005, Aleksey Cheusov
# copyright 1996, Michael D. Brennan
#
# This is a source file for mawk, an implementation of
# the AWK programming language.
#
# Mawk is distributed without warranty under the terms of
# the GNU General Public License, version 2, 1991.
###############################################################################
# This is a simple test that a new made mawk seems to
# be working OK.
# It's certainly not exhaustive, but the last two tests in
# particular use most features.
#
# It needs to be run from mawk/test
# and mawk needs to be in mawk/test or in PATH
# POSIX shells have functions...
Fail() {
echo "?? fail $*"
FAIL=`expr $FAIL + 1`
ERRS=`expr $ERRS + 1`
}
Begin() {
echo
echo "$*"
OK=OK
FAIL=0
}
Finish() {
if test $FAIL = 1
then
echo "$* had one failure"
elif test $FAIL != 0
then
echo "$* had $FAIL failures"
else
echo "$* OK"
fi
}
ERRS=0
Summary() {
if test $ERRS = 1
then
echo "$* had one failure"
elif test $ERRS != 0
then
echo "$* had $ERRS failures"
else
echo "$* OK"
fi
}
PROG="${MAWK:-../mawk}"
PATH=/bin:/usr/bin
export PATH
MAWKBINMODE=7
export MAWKBINMODE
if test $# != 0 ; then
SRC=$1
else
SRC=..
fi
dat=mawktest.dat
nulldat=mawknull.dat
STDOUT=${TMPDIR-/tmp}/mawk-out$$
STDERR=${TMPDIR-/tmp}/mawk-err$$
# The ulimit command interfers with valgrind (uncomment for ad hoc testing).
#ulimit -v 25000
trap 'echo mawk_test failed ; rm -f $STDOUT $STDERR; exit 1' 0
# find out which mawk we're testing
$PROG -W version
NULLS=`$PROG -W version 2>&1 |fgrep 'internal regex' 2>/dev/null`
#################################
Begin "testing input and field splitting"
LC_ALL=C $PROG -f wc.awk $dat | cmp -s - wc-awk.out || Fail "wc.awk"
LC_ALL=C $PROG -f null-rs.awk null-rs.dat | cmp -s - null-rs.out || Fail "null-rs.awk"
LC_ALL=C $PROG -F '(a?)*b' -f wc.awk $dat > $STDOUT
LC_ALL=C $PROG -F 'a*b' -f wc.awk $dat | cmp -s - $STDOUT || Fail "case 2"
LC_ALL=C $PROG -F '(a?)+b' -f wc.awk $dat > $STDOUT
LC_ALL=C $PROG -F 'a*b' -f wc.awk $dat | cmp -s - $STDOUT || Fail "case 3"
LC_ALL=C $PROG -F '[^^]' -f wc.awk $dat > $STDOUT
LC_ALL=C $PROG -F '(.)' -f wc.awk $dat | cmp -s - $STDOUT || Fail "case 4"
LC_ALL=C $PROG -F '[^]]' -f wc.awk $dat > $STDOUT
LC_ALL=C $PROG -F '[[#a-zA-Z0-9/*!=<>+,;.&_%(){}" -]' -f wc.awk $dat |
cmp -s - $STDOUT || Fail "case 5"
LC_ALL=C $PROG -F '[a[]' -f wc.awk $dat > $STDOUT
LC_ALL=C $PROG -F '[[a]' -f wc.awk $dat | cmp -s - $STDOUT || Fail "case 6"
LC_ALL=C $PROG -F '(])' -f wc.awk $dat > $STDOUT
LC_ALL=C $PROG -F '[]]' -f wc.awk $dat | cmp -s - $STDOUT || Fail "case 7"
# check that the regexp [\ does not make mawk segfault
LC_ALL=C $PROG -F '[\' 2> $STDERR || Fail "case 8"
LC_ALL=C $PROG -F '(^)?)' -f wc.awk $dat > $STDOUT
LC_ALL=C $PROG -F ')' -f wc.awk $dat | cmp -s - $STDOUT || Fail "case 9"
echo baaab | LC_ALL=C $PROG -F 'a*+' '{print NF}' > $STDOUT
echo baaab | LC_ALL=C $PROG -F 'a*' '{print NF}' | cmp -s - $STDOUT || Fail "case 10"
if test -n "$NULLS" ; then
LC_ALL=C $PROG -F '\000' -f nulls0.awk $nulldat > $STDOUT
LC_ALL=C $PROG -F '[\000 ]' -f nulls0.awk $nulldat >> $STDOUT
if ( cmp -s nulls.out $STDOUT )
then
echo "... $PROG supports matches with NUL bytes"
else
echo "... $PROG does NOT supports matches with NUL bytes"
fi
fi
Finish "input and field splitting"
#####################################
Begin "testing regular expression matching"
LC_ALL=C $PROG -f reg0.awk $dat > $STDOUT
LC_ALL=C $PROG -f reg1.awk $dat >> $STDOUT
LC_ALL=C $PROG -f reg2.awk $dat >> $STDOUT
LC_ALL=C $PROG -f reg3.awk $dat >> $STDOUT
LC_ALL=C $PROG -f reg4.awk $dat >> $STDOUT
LC_ALL=C $PROG -f reg5.awk $dat >> $STDOUT
LC_ALL=C $PROG -f reg6.awk $dat >> $STDOUT
cmp -s reg-awk.out $STDOUT || Fail "reg0-reg6 case"
# 640 backslashes
backslashes='\\\\\\\\\\'
backslashes="$backslashes$backslashes$backslashes$backslashes"
backslashes="$backslashes$backslashes$backslashes$backslashes"
backslashes="$backslashes$backslashes$backslashes$backslashes"
backslashes="$backslashes$backslashes$backslashes$backslashes"
( set +e; LC_ALL=C $PROG "/a$backslashes/" $dat 2> $STDERR ; test $? = 2 ) || Fail "buffer-overflow"
echo "''Italics with an apostrophe' embedded''" |
LC_ALL=C $PROG -f noloop.awk || Fail "noloop2 test"
# To be uncommented when this stops taking so long to run.
#echo "''Italics with an apostrophe'' embedded''" |
# LC_ALL=C $PROG -f noloop.awk || Fail "noloop1 test"
LC_ALL=C $PROG '/^[^^]*$/' $dat > $STDOUT
cmp -s $dat $STDOUT || Fail "case 1"
LC_ALL=C $PROG '!/^[^]]*$/' $dat > $STDOUT
LC_ALL=C $PROG '/]/' $dat | cmp -s - $STDOUT || Fail "case 2"
LC_ALL=C $PROG '/[a[]/' $dat > $STDOUT
LC_ALL=C $PROG '/[[a]/' $dat | cmp -s - $STDOUT || Fail "case 3"
LC_ALL=C $PROG '/]/' $dat > $STDOUT
LC_ALL=C $PROG '/[]]/' $dat | cmp -s - $STDOUT || Fail "case 4"
echo aaa | LC_ALL=C $PROG '/a*+/' > $STDOUT
echo aaa | LC_ALL=C $PROG '/a*/' | cmp -s - $STDOUT || Fail "case 5"
echo aaa | cmp -s - $STDOUT || Fail "case 6"
Finish "regular expression matching"
#######################################
if [ -c /dev/full ]; then
Begin "testing checking for write errors"
# Check for write errors noticed when closing the file
LC_ALL=C $PROG '{print}' <full-awk.dat >/dev/full 2>/dev/null && Fail "case 1"
# Check for write errors noticed on writing
# The file has to be bigger than the buffer size of the libc
LC_ALL=C $PROG '{print}' <$SRC/scan.c >/dev/full 2>/dev/null && Fail "case 2"
Finish "checking for write errors"
else
echo
echo "No /dev/full - check for write errors skipped"
fi
#######################################
Begin "testing arrays and flow of control"
LC_ALL=C $PROG -f wfrq0.awk $dat | cmp -s - wfrq-awk.out || Fail
Finish "array test"
#######################################
Begin "testing nextfile"
LC_ALL=C $PROG -f nextfile.awk full-awk.dat $dat | cmp -s - nextfile.out || Fail
Finish "nextfile test"
#################################
Begin "testing function calls and general stress test"
LC_ALL=C $PROG -f $SRC/examples/decl.awk $dat | cmp -s - decl-awk.out || Fail
Finish "general stress test"
Summary "tested $PROG"
trap 0
rm -f $STDOUT
exit $ERRS