From a1d6977c15e1d3de6ad9518e972ff0ffbd946be4 Mon Sep 17 00:00:00 2001 From: Martin Mares Date: Thu, 15 May 2008 11:56:25 +0200 Subject: [PATCH] Judges now compile and they use build/tester for the tests. --- .gitignore | 6 -- Makefile | 3 + TODO | 2 + judge/Makefile | 40 +++++-------- judge/filter-cmt.t | 2 +- judge/io.t | 2 +- judge/judge-tok.t | 20 +++---- judge/tester | 139 --------------------------------------------- judge/token.t | 16 +++--- 9 files changed, 38 insertions(+), 192 deletions(-) delete mode 100755 judge/tester diff --git a/.gitignore b/.gitignore index 4b9f334..d9524f1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,12 +1,6 @@ -bin/box -bin/pedant -bin/iwrapper -bin/md5crypt -box certs problems solutions testing tmp userlist -src/syscall-table.h diff --git a/Makefile b/Makefile index af3658a..79a1193 100644 --- a/Makefile +++ b/Makefile @@ -19,11 +19,14 @@ include $(s)/build/Maketop ifdef CONFIG_UCW_LIBS include $(s)/lib/Makefile include $(s)/sherlock/Makefile +# Disable built-in tests of these libraries +TESTS= endif include $(s)/box/Makefile include $(s)/utils/Makefile include $(s)/eval/Makefile +include $(s)/judge/Makefile # And finally the default rules of the build system include $(s)/build/Makebottom diff --git a/TODO b/TODO index 3217320..f709cdf 100644 --- a/TODO +++ b/TODO @@ -1,3 +1,5 @@ +Convert md5crypt to use MD5 from libucw + Evaluator ~~~~~~~~~ score: better formatting of the score table diff --git a/judge/Makefile b/judge/Makefile index 1478b49..e9adf41 100644 --- a/judge/Makefile +++ b/judge/Makefile @@ -1,30 +1,16 @@ -#CC=gcc-4.1.1 -CFLAGS=-O2 -Wall -W -Wno-parentheses -Wstrict-prototypes -Wmissing-prototypes -Wundef -Wredundant-decls -Winline $(DEBUG) -std=gnu99 -CFLAGS+=-Wno-pointer-sign -Wdisabled-optimization -Wno-missing-field-initializers +# Makefile for MO-Eval judges +# (c) 2008 Martin Mares -all: test-io test-tok judge-tok judge-shuff filter-cmt +DIRS+=judge +JDIR=$(o)/judge +PROGS+=$(addprefix $(JDIR)/,test-io test-tok judge-tok judge-shuff filter-cmt) +JLIB=$(addprefix $(o)/judge/,utils.o io.o token.o) -JLIB=utils.o io.o token.o +$(JDIR)/test-io: $(JDIR)/test-io.o $(JLIB) +$(JDIR)/test-tok: $(JDIR)/test-tok.o $(JLIB) +$(JDIR)/judge-tok: $(JDIR)/judge-tok.o $(JLIB) +$(JDIR)/judge-tok: LDLIBS+=-lm +$(JDIR)/judge-shuff: $(JDIR)/judge-shuff.o $(JLIB) +$(JDIR)/filter-cmt: $(JDIR)/filter-cmt.o $(JLIB) -test-io: test-io.o $(JLIB) -test-tok: test-tok.o $(JLIB) -judge-tok: judge-tok.o $(JLIB) -judge-tok: LDLIBS+=-lm -judge-shuff: judge-shuff.o $(JLIB) -filter-cmt: filter-cmt.o $(JLIB) - -tests: $(addsuffix .test,io token filter-cmt judge-tok) -io.test: test-io -token.test: test-tok -filter-cmt.test: filter-cmt -judge-tok.test: judge-tok - -%.test: %.t tester - ./tester $< - -clean:: - rm -f `find . -name "*~" -or -name "*.[oa]" -or -name "\#*\#" -or -name TAGS -or -name core` - rm -f test-io test-tok judge-tok judge-shuff filter-cmt - rm -rf tmp - -.PHONY: all clean distclean +TESTS+=$(addprefix $(JDIR)/,io.test token.test judge-tok.test filter-cmt.test) diff --git a/judge/filter-cmt.t b/judge/filter-cmt.t index 67adf9a..09e4b17 100644 --- a/judge/filter-cmt.t +++ b/judge/filter-cmt.t @@ -1,6 +1,6 @@ # Test cases for filter-cmt.c -Run: ./filter-cmt +Run: bin/filter-cmt In: abc//comment de///fgh //full-line comment diff --git a/judge/io.t b/judge/io.t index ed9f46a..995636b 100644 --- a/judge/io.t +++ b/judge/io.t @@ -1,6 +1,6 @@ # Test cases for io.c -Run: ./test-io +Run: bin/test-io In: abc def Out: abc diff --git a/judge/judge-tok.t b/judge/judge-tok.t index 79943a4..109c5a4 100644 --- a/judge/judge-tok.t +++ b/judge/judge-tok.t @@ -2,7 +2,7 @@ # Identical input and output Name: ok -Run: ./judge-tok $1 $2 +Run: bin/judge-tok $1 $2 In1: abc d e fgh ijk lmn In2: abc d e fgh @@ -10,7 +10,7 @@ In2: abc d e fgh # Differences in whitespaces are OK Name: ws -Run: ./judge-tok $1 $2 +Run: bin/judge-tok $1 $2 In1: abc d e fgh ijk lmn In2: abc d e fgh @@ -18,7 +18,7 @@ In2: abc d e fgh # Differences in line breaks are not Name: lines1 -Run: ./judge-tok $1 $2 +Run: bin/judge-tok $1 $2 In1: abc d e fgh ijk lmn @@ -28,7 +28,7 @@ Exit: 1 # ... unless the -n switch is given Name: lines2 -Run: ./judge-tok -n $1 $2 +Run: bin/judge-tok -n $1 $2 In1: abc d e fgh ijk lmn @@ -37,7 +37,7 @@ In2: abc d e fgh # Trailing empty lines are also not OK Name: trail1 -Run: echo >>$1 && ./judge-tok $1 $2 +Run: echo >>$1 && bin/judge-tok $1 $2 In1: abc d e fgh ijk lmn In2: abc d e fgh @@ -46,7 +46,7 @@ Exit: 1 # ... unless -t is given Name: trail1 -Run: echo >>$1 && ./judge-tok -t $1 $2 +Run: echo >>$1 && bin/judge-tok -t $1 $2 In1: abc d e fgh ijk lmn In2: abc d e fgh @@ -54,7 +54,7 @@ In2: abc d e fgh # Differences in case are not Name: case1 -Run: ./judge-tok $1 $2 +Run: bin/judge-tok $1 $2 In1: abc d e FGH IJK lmn In2: abc d e fgh @@ -63,7 +63,7 @@ Exit: 1 # ... unless -i is given Name: case2 -Run: ./judge-tok -i $1 $2 +Run: bin/judge-tok -i $1 $2 In1: abc d e FGH IJK lmn In2: abc d e fgh @@ -71,7 +71,7 @@ In2: abc d e fgh # By default, we compare everything literal Name: real1 -Run: ./judge-tok $1 $2 +Run: bin/judge-tok $1 $2 In1: 0.1000001 1. 1e-50 @@ -84,7 +84,7 @@ Exit: 1 # ... but if -r is given, we allow small differences Name: real2 -Run: ./judge-tok -r $1 $2 +Run: bin/judge-tok -r $1 $2 In1: 0.1000001 1. 1e-50 diff --git a/judge/tester b/judge/tester deleted file mode 100755 index d467b98..0000000 --- a/judge/tester +++ /dev/null @@ -1,139 +0,0 @@ -#!/usr/bin/perl -# A simple unit testing script -# (c) 2004--2007 Martin Mares -# (c) 2007 Pavel Charvat - -# Tests in the test file have a syntax similar to mail headers, -# individual test case are separated by blank lines and they can contain -# the following fields: -# -# Name: name of the case (default: sequence number since start of file) -# Run: command to run (default: command from the previous test case) -# This can be an arbitrary shell pipeline, sequences $0 to $9 are -# replaced by file names of In or Out files (see below). -# In: lines to pass to the program as standard input -# Out: lines to expect at the program's standard output -# In: lines to pass to the program as input file -# Out: lines to expect from the program in output file -# Both In and Out can be specified simultaneously if we -# are testing a program which modifies some of its input files. -# Exit: expected exit code of the program (default: 0) - -use Getopt::Long; - -my $verbose = 0; -my $rundir = "."; -GetOptions("verbose!" => \$verbose, - "rundir=s" => \$rundir) - or die "Usage: tester [--verbose] [--rundir=] \n"; - -my @tests = (); -my $tt; -my $append_to; - -while (<>) { - /^#/ && next; - if (/^\s*$/) { - $tt = undef; - $append_to = undef; - } elsif (defined($append_to) && /^\s+(.*)$/) { - $$append_to .= "\n$1"; - } elsif (my ($n,$v) = /^(\w+):\s+(.*)$/) { - if (!$tt) { - $tt = {}; - push @tests, $tt; - } - ($tt->{$n}) && die "$n already defined"; - $tt->{$n} = $v; - $append_to = \($tt->{$n}); - } else { - die "Test script syntax error"; - } -} - -if (! -d "$rundir/tmp") { - mkdir "$rundir/tmp" or die "Unable to create $rundir/tmp: $!"; -} - -my $i = 0; -my $errors = 0; -my $prev_run = undef; -TEST: foreach $tt (@tests) { - $i++; - my $name = $tt->{'Name'} || $i; - print "Test $name: "; - $run = ($tt->{'Run'} || $prev_run) or die "Don't know what to run"; - $prev_run = $run; - - my @out_files = (); - my @out_checks = (); - my $redirs = ""; - - if (defined $tt->{'In'}) { - my $ifi = "tmp/test$i.in"; - open X, ">$rundir/$ifi" or die "Unable to create $ifi"; - print X $tt->{'In'}, "\n"; - close X; - $redirs .= " <$ifi"; - } else { - $redirs .= " {'Out'}) { - my $ofi = "tmp/test$i.out"; - unlink "$rundir/$ofi"; - $redirs .= " >$ofi"; - push @out_files, $ofi; - push @out_checks, $tt->{'Out'}; - } else { - $redirs .= " >/dev/null"; - } - foreach my $arg (0..9) { - my $f = "tmp/test$i.$arg"; - if (defined $tt->{"Out$arg"}) { - unlink "$rundir/$f"; - push @out_files, $f; - push @out_checks, $tt->{"Out$arg"}; - } - if (defined $tt->{"In$arg"}) { - open X, ">$rundir/$f" or die "Unable to create $f"; - print X $tt->{"In$arg"}, "\n"; - close X; - } - } - $run =~ s/\$(\d)/tmp\/test$i.$1/g; - print "(running $run) " if $verbose; - system "cd $rundir && ( $run ) $redirs"; - if ($? % 256) { - print "FAILED with status code $?\n"; - $errors++; - next; - } - my $ec = $? / 256; - my $expect_ec = $tt->{'Exit'} || 0; - if ($ec != $expect_ec) { - print "FAILED: unexpected exit code $ec\n"; - $errors++; - next; - } - - for (my $i=0; $i<=$#out_files; $i++) { - my $ofi = $out_files[$i]; - open X, "<$rundir/$ofi" or die "Unable to read $ofi"; - my $out; - { - local $/ = undef; - $out = ; - } - close X; - if ($out ne $out_checks[$i] . "\n") { - print "FAILED (see $ofi)\n"; - $errors++; - next TEST; - } - } - - system "rm $rundir/tmp/test$i.*"; - print "OK\n"; -} - -exit !!$errors; diff --git a/judge/token.t b/judge/token.t index 4f4aa2e..2171c5d 100644 --- a/judge/token.t +++ b/judge/token.t @@ -4,7 +4,7 @@ # A simple test case with several spaces Name: std -Run: ./test-tok +Run: bin/test-tok In: abc 10 20 30 Out: @@ -14,7 +14,7 @@ Out: # The same test case in line mode Name: std-l -Run: ./test-tok -l +Run: bin/test-tok -l In: abc 10 20 30 Out: @@ -26,31 +26,31 @@ Out: # An unterminated line Name: unterm -Run: tr -d '\n' | ./test-tok +Run: tr -d '\n' | bin/test-tok In: abc Out: # An unterminated line in line mode Name: unterm-l -Run: tr -d '\n' | ./test-tok -l +Run: tr -d '\n' | bin/test-tok -l In: abc Out: # Small token size limit, but fits Name: big1 -Run: ./test-tok -s +Run: bin/test-tok -s In: abcdefghijklmnop Out: # Small token size limit, does not fit Name: big2 -Run: ./test-tok -s +Run: bin/test-tok -s In: abcdefghijklmnopq Exit: 1 # Testing parsers Name: parse1 -Run: ./test-tok -vl +Run: bin/test-tok -vl In: abcdef 0 5 -5 Out: @@ -62,7 +62,7 @@ Out: # More parsing: integer extremes Name: parse2 -Run: ./test-tok -v +Run: bin/test-tok -v In: -2147483647 2147483647 -2147483648 2147483648 -4294967295 4294967295 -- 2.39.2