290 lines
8 KiB
Bash
Executable file
290 lines
8 KiB
Bash
Executable file
#!/bin/sh
|
|
|
|
# This file produces TAP compliant output
|
|
|
|
# NOTE:
|
|
# This file can be run directly or with "prove" like this:
|
|
# prove checktests
|
|
# Or like this:
|
|
# prove -v checktests
|
|
# Do not forget to set the compiler if needed like so:
|
|
# CC=my-clang-build prove -v checktests
|
|
|
|
: ${CC:=clang}
|
|
: ${CXX:=$CC}
|
|
: ${CFLAGS:=}
|
|
LC_ALL=C
|
|
export LC_ALL
|
|
CPPFLAGS='-O -Wno-unused -include testprefix.h -IBlocksRuntime'
|
|
CCFLAGS='-std=c99 -Wimplicit-function-declaration'
|
|
LIB=libBlocksRuntime.a
|
|
TESTDIR=testbin
|
|
rm -rf $TESTDIR
|
|
mkdir $TESTDIR
|
|
diag () {
|
|
while [ $# != 0 ]; do
|
|
echo '# '"$1"
|
|
shift
|
|
done
|
|
}
|
|
diagfilt() {
|
|
while read -r LINE; do
|
|
echo '# '"$LINE"
|
|
done
|
|
}
|
|
usedashs=
|
|
diag 'blocksruntime tests' ''
|
|
if ! ccver="$("$CC" --version 2>&1)"; then
|
|
echo 'Bail out! '"\"$CC\" not installed (did you forget to set \$CC?)"
|
|
exit 1
|
|
else
|
|
out="$( ("$CC" -fblocks -c -o /dev/null -x c - < /dev/null 2>&1 || echo '-fblocks') 2>&1)"
|
|
case "$out" in *"-fblocks"*)
|
|
out="$( ("$CC" -fblocks -S -o /dev/null -x c - < /dev/null 2>&1 || echo '-fblocks') 2>&1)"
|
|
case "$out" in *"-fblocks"*)
|
|
echo 'Bail out! '"\"$CC\" does not support the -fblocks option"
|
|
exit 1
|
|
esac
|
|
usedashs=1
|
|
diag "WARNING: -S required for -fblocks with $CC"
|
|
esac
|
|
ccmach="$("$CC" -dumpmachine 2>/dev/null)"
|
|
fi
|
|
warnskipcxx=
|
|
if cxxver="$("$CXX" --version 2>&1)"; then
|
|
dopp=1
|
|
out="$( ("$CXX" -fblocks -c -o /dev/null -x c - < /dev/null 2>&1 || echo '-fblocks') 2>&1)"
|
|
case "$out" in *"-fblocks"*)
|
|
out="$( ("$CXX" -fblocks -S -o /dev/null -x c - < /dev/null 2>&1 || echo '-fblocks') 2>&1)"
|
|
case "$out" in
|
|
*"-fblocks"*)
|
|
warnskipcxx="\"$CXX\" does not support the -fblocks option; skipping C++ tests"
|
|
dopp=
|
|
;;
|
|
*)
|
|
usedashs=1
|
|
;;
|
|
esac
|
|
if [ "$CC" != "$CXX" ]; then
|
|
diag "WARNING: -S required for -fblocks with $CXX"
|
|
fi
|
|
esac
|
|
if [ -n "$dopp" ]; then
|
|
cxxmach="$("$CXX" -dumpmachine 2>/dev/null)"
|
|
cxxdver="$("$CXX" -dumpversion 2>/dev/null)"
|
|
fi
|
|
else
|
|
warnskipcxx="\"$CXX\" not installed; skipping C++ tests"
|
|
fi
|
|
if [ -n "$usedashs" ]; then
|
|
diag ""
|
|
fi
|
|
if [ -n "$warnskipcxx" ]; then
|
|
diag "$warnskipcxx" ""
|
|
fi
|
|
if [ ! -r "$LIB" ]; then
|
|
echo 'Bail out! '"No \"$LIB\" file found, try running \"$(dirname "$0")/buildlib\" first"
|
|
exit 1
|
|
fi
|
|
iscc_clang=
|
|
iscxx_clang=
|
|
case "$ccver" in *[Cc][Ll][Aa][Nn][Gg]*)
|
|
iscc_clang=1
|
|
esac
|
|
case "$cxxver" in *[Cc][Ll][Aa][Nn][Gg]*)
|
|
iscxx_clang=1
|
|
esac
|
|
if [ -n "$iscxx_clang" ]; then case "$cxxdver" in
|
|
"1.1")
|
|
skiprefC=1
|
|
esac; fi
|
|
iscc_armhf=
|
|
iscxx_armhf=
|
|
case "$ccmach" in arm-*)
|
|
case "$ccmach" in *abihf)
|
|
iscc_armhf=1
|
|
esac
|
|
esac
|
|
case "$cxxmach" in arm-*)
|
|
case "$cxxmach" in *abihf)
|
|
iscxx_armhf=1
|
|
esac
|
|
esac
|
|
diag "CC${iscc_clang:+(clang)}: $CC --version"
|
|
echo "$ccver" | diagfilt
|
|
diag ''
|
|
if [ -n "$dopp" -a z"$CXX" != z"$CC" ]; then
|
|
diag "CXX${iscxx_clang:+(clang)}: $CXX --version"
|
|
echo "$cxxver" | diagfilt
|
|
diag ''
|
|
fi
|
|
testcount=0
|
|
failcount=0
|
|
xfailcount=0
|
|
bonuscount=0
|
|
skipcount=0
|
|
skipcpp=0
|
|
passcount=0
|
|
testsfailed=
|
|
for test in BlocksRuntime/tests/*.[cC]; do
|
|
testname="${test#BlocksRuntime/tests/}"
|
|
skip=
|
|
skipdoze=
|
|
extra=
|
|
stub=
|
|
xfail=
|
|
reason=
|
|
showxfail=
|
|
testcount=$(($testcount + 1))
|
|
case $testname in
|
|
rdar6405500.c | \
|
|
rdar6414583.c | \
|
|
objectRRGC.c | \
|
|
dispatch_async.c) skip=1;;
|
|
fail.c) skipdoze=1;;
|
|
macro.c) stub='void foo(); int main(){foo(); printf("success");}';;
|
|
varargs-bad-assign.c | \
|
|
rettypepromotion.c | \
|
|
shorthandexpression.c | \
|
|
k-and-r.c | \
|
|
sizeof.c | \
|
|
orbars.c | \
|
|
constassign.c) xfail=1;;
|
|
copy-block-literal-rdar6439600.c) reason='compiler bug'; showxfail=1; xfail=1;;
|
|
${iscc_clang}cast.c) reason='gcc compiler bug'; showxfail=1; xfail=1;;
|
|
${iscxx_clang}josh.C) reason='g++ compiler bug'; showxfail=1; xfail=1;;
|
|
reference.C)
|
|
if [ -n "$skiprefC" ]; then
|
|
reason="\"$CXX\" version too old"
|
|
xfail=1
|
|
fi;;
|
|
variadic.c)
|
|
if [ -n "$iscc_armhf" ]; then
|
|
reason='incorrect clang armhf block float vararg implementation'
|
|
showxfail=1
|
|
xfail=1
|
|
fi;;
|
|
esac
|
|
ext=.c
|
|
cpp=
|
|
USECC="$CC"
|
|
USEFLAGS="$CCFLAGS $CPPFLAGS"
|
|
USELIB="$LIB"
|
|
case $test in
|
|
*.C) cpp=1; ext=.C;;
|
|
*.cpp) cpp=1; ext=.cpp;;
|
|
*.cp) cpp=1; ext=.cp;;
|
|
*.c++) cpp=1; ext=.c++;;
|
|
esac
|
|
if [ -n "$cpp" ]; then
|
|
USECC="$CXX"
|
|
USEFLAGS="$CPPFLAGS"
|
|
USELIB="$LIB -lstdc++"
|
|
fi
|
|
if [ -n "$COMSPEC" -a -n "$skipdoze" ]; then
|
|
skip=1
|
|
fi
|
|
if [ -z "$skip" -a -n "$cpp" -a -z "$dopp" ]; then
|
|
echo "ok $testcount - $testname # skipped: C++ with blocks not available"
|
|
skipcpp=$(($skipcpp + 1))
|
|
skipcount=$(($skipcount + 1))
|
|
else
|
|
if [ -n "$skip" ]; then
|
|
if [ -n "$skipdoze" ]; then
|
|
echo "ok $testcount - $testname # skipped: not supported on this platform"
|
|
else
|
|
echo "ok $testcount - $testname # skipped: not supported"
|
|
fi
|
|
skipcount=$(($skipcount + 1))
|
|
else
|
|
if [ -n "$stub" ]; then
|
|
out="$( (
|
|
if [ -z "$usedashs" ]; then
|
|
"$USECC" -c $CFLAGS $USEFLAGS $extra -o $TESTDIR/$(basename $test $ext).o -fblocks $test && \
|
|
echo "$stub" | "$USECC" $CFLAGS $USEFLAGS $extra -o $TESTDIR/$(basename $test $ext) -fblocks \
|
|
$TESTDIR/$(basename $test $ext).o $USELIB -x c - && \
|
|
cd $TESTDIR && ./$(basename $test $ext)
|
|
else
|
|
"$USECC" -S $CFLAGS $USEFLAGS $extra -o $TESTDIR/$(basename $test $ext).s -fblocks $test && \
|
|
"$USECC" -c $CFLAGS $extra -o $TESTDIR/$(basename $test $ext).o \
|
|
$TESTDIR/$(basename $test $ext).s && \
|
|
echo "$stub" | "$USECC" $CFLAGS $USEFLAGS $extra -o $TESTDIR/$(basename $test $ext) \
|
|
$TESTDIR/$(basename $test $ext).o $USELIB -x c - && \
|
|
cd $TESTDIR && ./$(basename $test $ext)
|
|
fi
|
|
) 2>&1)"
|
|
else
|
|
out="$( (
|
|
if [ -z "$usedashs" ]; then
|
|
"$USECC" -c $CFLAGS $USEFLAGS $extra -o $TESTDIR/$(basename $test $ext).o -fblocks $test && \
|
|
"$USECC" $CFLAGS -o $TESTDIR/$(basename $test $ext) -fblocks $TESTDIR/$(basename $test $ext).o $USELIB && \
|
|
cd $TESTDIR && ./$(basename $test $ext)
|
|
else
|
|
"$USECC" -S $CFLAGS $USEFLAGS $extra -o $TESTDIR/$(basename $test $ext).s -fblocks $test && \
|
|
"$USECC" -c $CFLAGS $extra -o $TESTDIR/$(basename $test $ext).o \
|
|
$TESTDIR/$(basename $test $ext).s && \
|
|
"$USECC" $CFLAGS -o $TESTDIR/$(basename $test $ext) $TESTDIR/$(basename $test $ext).o $USELIB && \
|
|
cd $TESTDIR && ./$(basename $test $ext)
|
|
fi
|
|
) 2>&1)"
|
|
fi
|
|
result=$?
|
|
if [ -n "$xfail" ]; then
|
|
xfailcount=$(($xfailcount + 1))
|
|
: ${reason:=expected to fail}
|
|
if [ $result = 0 ]; then
|
|
bonuscount=$(($bonuscount + 1))
|
|
passcount=$(($passcount + 1))
|
|
echo "ok $testcount - $testname # TODO: $reason"
|
|
else
|
|
echo "not ok $testcount - $testname # TODO: $reason"
|
|
if [ -n "$showxfail" ]; then
|
|
echo "$out" | diagfilt
|
|
fi
|
|
fi
|
|
else
|
|
if [ $result != 0 ]; then
|
|
testsfailed=1
|
|
failcount=$(($failcount + 1))
|
|
echo "not ok $testcount - $testname"
|
|
echo "$out" | diagfilt
|
|
else
|
|
echo "ok $testcount - $testname"
|
|
passcount=$(($passcount + 1))
|
|
fi
|
|
fi
|
|
fi
|
|
fi
|
|
done
|
|
diag "" "test count: $testcount"
|
|
if [ $bonuscount != 0 ]; then
|
|
diag " passed: $passcount (todo=$bonuscount)"
|
|
else
|
|
diag " passed: $passcount"
|
|
fi
|
|
if [ $xfailcount != 0 ]; then
|
|
if [ $bonuscount != 0 ]; then
|
|
diag " xfail: $xfailcount (passed=$bonuscount)"
|
|
else
|
|
diag " xfail: $xfailcount"
|
|
fi
|
|
fi
|
|
if [ $skipcount != 0 ]; then
|
|
if [ $skipcpp != 0 ]; then
|
|
diag " skipped: $skipcount (C++=$skipcpp)"
|
|
else
|
|
diag " skipped: $skipcount"
|
|
fi
|
|
fi
|
|
if [ $failcount != 0 ]; then
|
|
diag " failed: $failcount"
|
|
fi
|
|
if [ -n "$testsfailed" ]; then
|
|
diag "test failures occurred"
|
|
else
|
|
diag "all tests passed"
|
|
fi
|
|
diag ""
|
|
echo "1..$testcount"
|
|
[ -z "$testsfailed" ] || exit 1
|
|
exit 0
|