mirror of
https://github.com/Mercury-Language/mercury.git
synced 2025-12-20 08:19:28 +00:00
Estimated hours taken: 14
Branches: main
Modifications to the test suite to allow testing in grade java.
mercury/tools/test_mercury:
Set-up the required CLASSPATH variable.
tests/Mmake.common:
Added a rule to build `.out' files when the grade is java.
tests/benchmarks/Mmakefile:
Enable only the working tests for the benckmarks directory.
tests/dppd/Mmakefile:
tests/general/Mmakefile:
tests/general/accumulator/Mmakefile:
tests/general/string_format/Mmakefile:
tests/general/structure_reuse/Mmakefile:a
tests/grade_subdirs/Mmakefile:
tests/hard_coded/Mmakefile:
tests/hard_coded/exceptions/Mmakefile:
tests/hard_coded/purity/Mmakefile:
tests/hard_coded/sub-modules/Mmakefile:
tests/hard_coded/typeclasses/Mmakefile:
tests/recompilation/Mmakefile
tests/term/Mmakefile:
tests/valid/Mmakefile:
Disable test cases for grade java.
tests/recompilation/test_functions:
Add framework needed to do recompilation testing for the java grade.
218 lines
4.5 KiB
Plaintext
Executable File
218 lines
4.5 KiB
Plaintext
Executable File
#
|
|
# Shell functions used to run the recompilation tests.
|
|
#
|
|
|
|
#
|
|
# Set variables `main_module' and `modules' describing the test being run.
|
|
# Copy in the initial versions of the test files.
|
|
#
|
|
test_module () {
|
|
if [ $# = 0 ]
|
|
then
|
|
echo "usage: test_module main_module other_modules"
|
|
exit 1
|
|
fi
|
|
|
|
main_module=$1
|
|
modules="$*"
|
|
echo Testing $main_module
|
|
|
|
for module in $modules
|
|
do
|
|
rm -f $module.m
|
|
cp $module.m.1 $module.m
|
|
|
|
# The module.m.<n> files are the only ones
|
|
# that should be edited.
|
|
chmod -w $module.m
|
|
done
|
|
|
|
rm -f $main_module.res
|
|
touch $main_module.res
|
|
|
|
# XXX Avoid producing output files with the same timestamp
|
|
# as the input source file. The up-to-date check for the output
|
|
# file in recompilation_check.m checks that the output file's
|
|
# timestamp is strictly greater than the input file's, so it
|
|
# will recompile if they are the same.
|
|
#
|
|
# This won't be a problem in practice, unless for some reason
|
|
# a user decides to have mmake invoked by their editor
|
|
# automatically after each edit. If a file takes less
|
|
# than a second to compile, recompiling it all the time
|
|
# won't be noticeable. The recompilation will affect
|
|
# the `--verbose-recompilation' messages, so we need to
|
|
# avoid it here.
|
|
sleep 1
|
|
}
|
|
|
|
#
|
|
# Simulate a user editing the file.
|
|
#
|
|
update_module () {
|
|
if [ $# != 2 ]
|
|
then
|
|
echo "usage: update_module module_name version"
|
|
exit 1
|
|
fi
|
|
|
|
module=$1
|
|
module_version=$2
|
|
|
|
# GNU make only considers a file out of date if a dependency's
|
|
# timestamp is strictly greater than the file's timestamp.
|
|
# We need to make sure that the `.c' file is out of date with
|
|
# respect to the `.m' file.
|
|
sleep 1
|
|
|
|
rm -f $module.m
|
|
cp $module.m.$module_version $module.m
|
|
chmod -w $module.m
|
|
|
|
# See comment in test_module().
|
|
sleep 1
|
|
}
|
|
|
|
mmake_depend () {
|
|
eval mmake $mmakeopts $main_module.depend || exit 1
|
|
}
|
|
|
|
#
|
|
# Compare the output file with the expected output file,
|
|
# generating the expected output file if it doesn't exist
|
|
# and the --generate-missing-exp-files option was given
|
|
# to runtests.
|
|
#
|
|
compare_files () {
|
|
if [ $# != 2 ]
|
|
then
|
|
echo "** usage: compare_files expected_file result_file"
|
|
exit 1
|
|
fi
|
|
|
|
exp_file=$1
|
|
res_file=$2
|
|
|
|
if [ -f $exp_file ]
|
|
then
|
|
if diff ${DIFF_OPTS-"-c"} $exp_file \
|
|
$res_file >> $main_module.res
|
|
then
|
|
:
|
|
else
|
|
echo "** Error: $exp_file and $res_file differ."
|
|
exit 1
|
|
fi
|
|
else
|
|
if [ $generate_missing_exp_files = true ]
|
|
then
|
|
echo "** WARNING: generating $exp_file"
|
|
cp $res_file $exp_file
|
|
else
|
|
echo "** Error: $exp_file not found"
|
|
exit 1
|
|
fi
|
|
fi
|
|
}
|
|
|
|
#
|
|
# Build the test, then run it and compare the output.
|
|
#
|
|
mmake_test () {
|
|
if [ $# != 2 ]
|
|
then
|
|
echo "** usage: mmake_test output_file_version should_fail"
|
|
exit 1
|
|
fi
|
|
|
|
output_file_version=$1
|
|
mmake_should_fail=$2
|
|
|
|
# XXX This is a hacky way of testing for Java grades
|
|
echo "mmakeopts=$mmakeopts"
|
|
case $mmakeopts in
|
|
*java*) target=$main_module.classes
|
|
run_target="java $main_module"
|
|
;;
|
|
*) target=$main_module
|
|
run_target="./$main_module"
|
|
;;
|
|
esac
|
|
|
|
case $mmake_should_fail in
|
|
true)
|
|
#
|
|
# If the compilation is supposed to fail then the mmake
|
|
# output should be suppressed to avoid making it harder
|
|
# to find genuine failures in the nightly test logs.
|
|
# The `-k' option to mmake avoids differences in the output
|
|
# when using parallel mmakes.
|
|
#
|
|
eval mmake $mmakeopts -k \
|
|
$target > $main_module.failing_make_output 2>&1
|
|
;;
|
|
false)
|
|
eval mmake $mmakeopts $target
|
|
;;
|
|
esac
|
|
|
|
case $? in
|
|
0)
|
|
case $mmake_should_fail in
|
|
true)
|
|
echo \
|
|
"** Error: mmake $mmakeopts $target succeeded where it should fail"
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
$run_target > $main_module.out
|
|
compare_files $main_module.exp.$output_file_version \
|
|
$main_module.out
|
|
;;
|
|
*)
|
|
case $mmake_should_fail in
|
|
false)
|
|
echo "** Error: mmake $mmakeopts $target failed"
|
|
exit 1
|
|
;;
|
|
esac
|
|
;;
|
|
esac
|
|
}
|
|
|
|
check_err_file () {
|
|
if [ $# != 2 ]
|
|
then
|
|
echo "** usage: check_err_file module message_file_version"
|
|
fi
|
|
|
|
module=$1
|
|
error_file_version=$2
|
|
|
|
# In `.hl*' grades, the compiler sometimes puts an extra line in
|
|
# the `.err' file ("foo.h has CHANGED"). Filter it out here.
|
|
# Also filter out any references to the directories created by the
|
|
# `--use-subdirs' option.
|
|
sed -e '/has CHANGED/d' \
|
|
-e 's/Mercury\/.*\///g' \
|
|
$module.err > $module.err2
|
|
mv $module.err2 $module.err
|
|
|
|
compare_files $module.err_exp.$error_file_version $module.err
|
|
}
|
|
|
|
cleanup_test () {
|
|
case $cleanup in
|
|
true)
|
|
eval mmake $mmakeopts $main_module.realclean
|
|
|
|
for module in $modules
|
|
do
|
|
rm -f $module.m
|
|
done
|
|
;;
|
|
esac
|
|
}
|
|
|