X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=grading%2Flib%2FPintos%2FGrading.pm;h=7e5ec67fb008f7fc5ad06353b1f2c9ae574eb98f;hb=6ebebc408e12133c4130923081c40bbfbdd281d4;hp=3ebeb223b6a7ee53f5b7c6f11e943c2010075156;hpb=5d3c07d8b0aad51ade536e35f63267f5826524c5;p=pintos-anon diff --git a/grading/lib/Pintos/Grading.pm b/grading/lib/Pintos/Grading.pm index 3ebeb22..7e5ec67 100644 --- a/grading/lib/Pintos/Grading.pm +++ b/grading/lib/Pintos/Grading.pm @@ -13,13 +13,20 @@ our $action; our $hw; use POSIX; -use Getopt::Long; +use Getopt::Long qw(:config no_ignore_case); use Algorithm::Diff; +# We execute lots of subprocesses. +# Without this, our stdout output can get flushed multiple times, +# which is harmless but looks bizarre. +$| = 1; + sub parse_cmd_line { + my ($do_regex, $no_regex); GetOptions ("v|verbose+" => \$verbose, "h|help" => sub { usage (0) }, - "tests=s" => \@TESTS, + "d|do-tests=s" => \$do_regex, + "n|no-tests=s" => \$no_regex, "c|clean" => sub { set_action ('clean'); }, "x|extract" => sub { set_action ('extract'); }, "b|build" => sub { set_action ('build'); }, @@ -33,6 +40,11 @@ sub parse_cmd_line { if (!defined $action) { $action = -e 'review.txt' ? 'assemble' : 'test'; } + + my (@default_tests) = @_; + @TESTS = @default_tests; + @TESTS = grep (/$do_regex/, @TESTS) if defined $do_regex; + @TESTS = grep (!/$no_regex/, @TESTS) if defined $no_regex; } sub set_action { @@ -70,7 +82,8 @@ Workflow: Options: -c, --clean Delete test results and temporary files, then exit. - --tests=TESTS Run only the specified comma-separated tests. + -d, --do-tests=RE Run only tests that match the given regular expression. + -n, --no-tests=RE Do not run tests that match the given regular expression. -x, --extract Stop after step 1. -b, --build Stop after step 2. -t, --test Stop after step 3 (default if "review.txt" not present). @@ -400,7 +413,9 @@ sub run_pintos { # Grade the test. sub grade_test { # Read test output. - my (@output) = snarf ("output/$test/run.out"); + my ($outfile) = "output/$test/run.out"; + die "$outfile: missing test output file (make failed?)" if ! -e $outfile; + my (@output) = snarf ($outfile); # If there's a function "grade_$test", use it to evaluate the output. # If there's a file "$GRADES_DIR/$test.exp", compare its contents @@ -817,5 +832,12 @@ sub file_contains { close (FILE); return $equal; } + +sub success { + for my $test (@TESTS) { + return 1 if !defined ($result{$test}) || $result{$test} ne 'ok'; + } + return 0; +} 1;