X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;f=bin%2Flib;h=537bf58764c8d81ed514e65bf49d1c71b3967c97;hb=2080a3ad4227ac0b3d306afa7f355a6ae2de8213;hp=090e752a6dd5059cc13ce47cfb9fed0501add962;hpb=762cd19388d4958967e087226acd8875ab997c68;p=moe.git diff --git a/bin/lib b/bin/lib index 090e752..537bf58 100644 --- a/bin/lib +++ b/bin/lib @@ -1,6 +1,9 @@ # The Evaluator -- Shell Function Library # (c) 2001 Martin Mares +# General settings +shopt -s dotglob + # Logging functions. # File handles used: fd1=log, fd2=progress @@ -45,7 +48,7 @@ function box-init mkdir -p box else pcont "used account $TEST_USER, " - BOXDIR=$MO_ROOT/$TEST_USER + BOXDIR=$MO_ROOT/eval/$TEST_USER BOXCMD=bin/box-$TEST_USER fi [ -d $BOXDIR -a -f $BOXCMD ] || die "Sandbox set up incorrectly" @@ -59,7 +62,6 @@ function box-init function box-clean { [ -n "$BOXCMD" ] || die "box-init not called" - # FIXME: Dot files rm -rf $BOXDIR/* } @@ -68,6 +70,7 @@ function box-clean function dir-init { pstart "Initializing... " + HDIR=. PDIR=problems/$PROBLEM SDIR=solutions/$CONTESTANT/$PROBLEM TDIR=testing/$CONTESTANT/$PROBLEM @@ -91,11 +94,12 @@ EOF function locate-source { - pstart "Locating source... " + pstart "Finding source... " + SBASE=${1:-$PROBLEM} for a in $EXTENSIONS ; do - if [ -f $SDIR/$PROBLEM.$a ] ; then + if [ -f $SDIR/$SBASE.$a ] ; then [ -z "$SRCN" ] || die "Multiple source files found: $SDIR/$PROBLEM.$a and $SDIR/$SRCN. Please fix." - SRCN=$PROBLEM.$a + SRCN=$SBASE.$a SRCEXT=$a fi done @@ -119,13 +123,15 @@ function compile SRC=$SRCN EXE=$PROBLEM CCMD=COMP_$SRCEXT - CCMD="`eval echo ${!CCMD}`" - COMP_SANDBOX_OPTS="`eval echo $COMP_SANDBOX_OPTS`" + CCMD=`eval echo ${!CCMD}` + COMP_SANDBOX_OPTS=`eval echo $COMP_SANDBOX_OPTS` echo "Compiler command: $CCMD" echo "Compiler sandbox options: $COMP_SANDBOX_OPTS" + eval $COMP_SANDBOX_INIT echo "Compiler input files:" ls -Al $BOXDIR + echo "Compiler output:" if ! $BOXCMD $COMP_SANDBOX_OPTS -- $CCMD 2>$TDIR/compile.out ; then COMPILE_MSG="`cat $TDIR/compile.out`" pend "FAILED: $COMPILE_MSG" @@ -133,6 +139,7 @@ function compile return 1 fi cat $TDIR/compile.out + rm $TDIR/compile.out echo "Compiler output files:" ls -Al $BOXDIR if [ ! -f $BOXDIR/$PROBLEM ] ; then @@ -146,39 +153,152 @@ function compile pend "OK" } +# Running of test program according to current task type + +function test-run +{ + test-run-$TASK_TYPE +} + # Running of test program with file input/output -function test-run-with-files +function test-run-file { pcont " " box-clean echo "Executable file: $TDIR/$PROBLEM" cp $TDIR/$PROBLEM $BOXDIR/ echo "Input: $TDIR/$PROBLEM" + ln $PDIR/$TEST.in $TDIR/$TEST.in cp $PDIR/$TEST.in $BOXDIR/$PROBLEM.in + eval $SANDBOX_INIT echo "Input files:" ls -Al $BOXDIR pcont " " echo "Timeout: $TIME_LIMIT s" echo "Memory: $MEM_LIMIT KB" - BOXOPTS="`eval echo $TEST_SANDBOX_OPTS`" + BOXOPTS=`eval echo $TEST_SANDBOX_OPTS` echo "Sandbox options: $BOXOPTS" if ! $BOXCMD $BOXOPTS -- ./$PROBLEM 2>$TDIR/exec.out ; then - TEST_MSG="`cat $TDIR/exec.out`" + TEST_MSG="`head -1 $TDIR/exec.out`" pend "$TEST_MSG" - echo "$TEST_MSG" - # FIXME: Better recognition of run-time errors - echo >$PTSFILE "0 RT" + cat $TDIR/exec.out + rm $TDIR/exec.out + echo >>$PTSFILE "0 $TEST_MSG" return 1 fi + cat $TDIR/exec.out + rm $TDIR/exec.out + test-fetch-output || return 1 +} + +function test-fetch-output +{ echo "Output files:" ls -Al $BOXDIR if [ ! -f $BOXDIR/$PROBLEM.out ] ; then pend "No output file." echo "No output file." - echo >$PTSFILE "0 NO" + echo >>$PTSFILE "0 No output." + return 1 + fi + cp $BOXDIR/$PROBLEM.out $TDIR/$TEST.out +} + +# Running of interactive test programs + +function test-run-interactive +{ + pcont " " + box-clean + echo "Executable file: $TDIR/$PROBLEM" + cp $TDIR/$PROBLEM $BOXDIR/ + echo "Input: $TDIR/$PROBLEM" + ln $PDIR/$TEST.in $TDIR/$TEST.in + cp $PDIR/$TEST.in $BOXDIR/$PROBLEM.in + eval $SANDBOX_INIT + echo "Input files:" + ls -Al $BOXDIR + + pcont " " + echo "Timeout: $TIME_LIMIT s" + echo "Memory: $MEM_LIMIT KB" + BOXOPTS=`eval echo $TEST_SANDBOX_OPTS` + echo "Sandbox options: $BOXOPTS" + ICCMD=`eval echo $IA_CHECK` + echo "Interactive checker: $ICCMD" + if ! $HDIR/bin/iwrapper $BOXCMD $BOXOPTS -- ./$PROBLEM @@ $ICCMD 2>$TDIR/exec.out ; then + TEST_MSG="`head -1 $TDIR/exec.out`" + pend "$TEST_MSG" + cat $TDIR/exec.out + rm $TDIR/exec.out + echo "$TEST_MSG" + echo >>$PTSFILE "0 $TEST_MSG" return 1 fi - cp $BOXDIR/$PROBLEM.out $TDIR/$PROBLEM.out + cat $TDIR/exec.out + rm $TDIR/exec.out + [ -z "$OUTPUT_CHECK" ] || test-fetch-output || return 1 +} + +# Syntax checks + +function syntax-check +{ + [ -n "$SYNTAX_CHECK" ] || return 0 + pcont " " + SCHECK=`eval echo $SYNTAX_CHECK` + echo "Syntax check command: $SCHECK" + eval $SCHECK && return 0 + pend "Wrong syntax." + echo "Wrong syntax." + echo >>$PTSFILE "0 Wrong syntax." + return 1 +} + +# Output checks + +function output-check +{ + [ -n "$OUTPUT_CHECK" ] || return 0 + pcont " " + [ -f $PDIR/$TEST.out ] && ln $PDIR/$TEST.out $TDIR/$TEST.ok + OCHECK=`eval echo $OUTPUT_CHECK` + echo "Output check command: $OCHECK" + eval $OCHECK && return 0 + pend "Wrong answer." + echo "Wrong answer." + echo >>$PTSFILE "0 Wrong answer." + return 1 +} + +# Setup of public commands + +function public-setup +{ + HDIR=$MO_PUBLIC + PDIR=$MO_PUBLIC/problems/$PROBLEM + SDIR=. + TDIR=~/.test + [ -d $PDIR ] || die "Unknown problem $PROBLEM" + + pstart "Initializing... " + mkdir -p $TDIR + rm -rf $TDIR/* + BOXDIR=~/.box + mkdir -p $BOXDIR + rm -rf $BOXDIR/* + BOXCMD="$MO_PUBLIC/bin/box -c$BOXDIR" + exec >log + pend "OK (see 'log' for details)" +} + +# Locate output of open data problem, test case TEST + +function open-locate +{ + [ -f $PDIR/$TEST.in ] || die "Unknown test $TEST" + SRCN=$SDIR/$PROBLEM$TEST.out + [ -f $SRCN ] || die "Output file $SRCN not found" }