Add GolfScript
[gruntmaster-daemon.git] / t / 01-jobs.t
CommitLineData
5c5cd38a
MG
1#!/usr/bin/perl -w
2use v5.14;
3use strict;
4use warnings;
5
6use Gruntmaster::Daemon;
7
fe29da7c 8use Cwd qw/getcwd/;
10c4f6f5
MG
9use File::Basename qw/fileparse/;
10use File::Slurp qw/read_file/;
5c5cd38a 11use File::Temp qw/tempdir/;
b8f7001a 12use File::Which qw/which/;
7be5f054 13use Hash::Merge qw/merge/;
5c5cd38a
MG
14use List::Util qw/sum/;
15use Log::Log4perl;
16use Test::More;
64871a33 17use YAML::Tiny qw/LoadFile/;
5c5cd38a
MG
18
19##################################################
20
b8f7001a
MG
21use constant COMPILER => {
22 qw/C gcc
23 CPP g++
f8b954a9 24 GOLFSCRIPT golfscript
b8f7001a
MG
25 MONO gmcs
26 JAVA javac
27 PASCAL fpc
28 GOLANG go
29 GCCGO gccgo
30 HASKELL ghc
31 PERL perl
c88da74d 32 PYTHON python
cd0623f0 33 RUBY ruby
c88da74d 34 SBCL sbcl/};
b8f7001a 35
f8b954a9
MG
36my %needs_fork = map { $_ => 1 } qw/GOLANG GOLFSCRIPT GCCGO JAVA RUBY/;
37
d5200925 38my $loglevel = $ENV{TEST_LOG_LEVEL} // ($ENV{TEST_VERBOSE} ? 'TRACE' : 'OFF');
5c5cd38a
MG
39my $log_conf = <<CONF;
40log4perl.category.Gruntmaster.Daemon = $loglevel, stderr
41
42log4perl.appender.stderr = Log::Log4perl::Appender::Screen
43log4perl.appender.stderr.layout = Log::Log4perl::Layout::PatternLayout
44log4perl.appender.stderr.layout.ConversionPattern = [\%d] [\%F{1}:\%M{1}:\%L] [\%p] \%m\%n
45CONF
46Log::Log4perl->init(\$log_conf);
47
fe29da7c 48$ENV{PATH} = getcwd . ':' . $ENV{PATH};
436deb11 49umask 0022;
da905f9e 50
5c5cd38a 51sub check_job{
7be5f054 52 my $meta = shift;
197cd6a3 53 if (defined $meta->{results}) {
56187177 54 delete $meta->{results}[$_]{time} for keys @{$meta->{results}};
197cd6a3 55 }
ee638edb
MG
56 my $desc = $meta->{name} . ': ' . $meta->{test_name};
57 is $meta->{result}, $meta->{expected_result}, "Result is correct ($desc)";
58 is $meta->{result_text}, $meta->{expected_result_text}, "Result text is correct ($desc)";
59 is_deeply $meta->{results}, $meta->{expected_results}, "Results are correct ($desc)";
5c5cd38a
MG
60}
61
62my @problems = exists $ENV{TEST_PROBLEMS} ? map {"t/problems/$_"} split ' ', $ENV{TEST_PROBLEMS} : <t/problems/*>;
b8f7001a
MG
63@problems = grep { $_ !~ /hello/ } @problems unless $ENV{RELEASE_TESTING} || $ENV{TEST_PROBLEMS};
64
5c5cd38a
MG
65plan tests => 3 * sum map { my @temp = <$_/tests/*>; scalar @temp } @problems;
66note "Problems to be tested: " . join ', ', @problems;
67
23b3dc5a 68my $tempdir = tempdir "gruntmasterd-testingXXXX", TMPDIR => 1, CLEANUP => 1;
f028e0a8 69chmod 0777, $tempdir;
10c4f6f5
MG
70
71my $job = 0;
5c5cd38a
MG
72
73for my $problem (@problems) {
7be5f054
MG
74 my $pbmeta = LoadFile "$problem/meta.yml";
75 for (1 .. $pbmeta->{testcnt}) {
76 $pbmeta->{infile}[$_ - 1] = read_file "$problem/$_.in" if $pbmeta->{generator} eq 'File';
00a45f89 77 $pbmeta->{okfile}[$_ - 1] = read_file "$problem/$_.ok" if $pbmeta->{runner} && $pbmeta->{runner} eq 'File';
197cd6a3 78 }
7be5f054 79 if (exists $pbmeta->{files}) {
759d3ca5 80 $_->{content} = read_file "$problem/$_->{name}" for values %{$pbmeta->{files}}
197cd6a3 81 }
10c4f6f5 82
197cd6a3 83 TODO: {
7be5f054 84 note "Now testing problem $pbmeta->{name} ($pbmeta->{description})";
10c4f6f5 85
197cd6a3 86 for my $source (<$problem/tests/*>) {
b8f7001a
MG
87 SKIP: {
88 my $meta = LoadFile "$source/meta.yml";
fcfcfb93 89 if ($meta->{files}{prog}) {
fd807ac9
MG
90 my $format = $meta->{files}{prog}{format};
91 my $compiler = COMPILER->{$format};
fcfcfb93 92 skip "$compiler not found in path", 3 unless $ENV{GRUNTMASTER_VM} || which $compiler;
f8b954a9 93 skip "$format requires multiple processes. Set GRUNTMASTER_KILL_USER and GRUNTMASTER_SUDO to allow multiple processes.", 3 if !$ENV{GRUNTMASTER_KILL_USER} && $needs_fork{$format};
fcfcfb93
MG
94 $meta->{files}{prog}{content} = read_file "$source/$meta->{files}{prog}{name}";
95 }
b8f7001a 96 $meta = merge $meta, $pbmeta;
fd807ac9 97 local $TODO = $meta->{todo} if exists $meta->{todo};
b8f7001a 98 note "Running $meta->{test_name} ($meta->{test_description})...";
fe29da7c 99 my $savedcwd = getcwd;
b8f7001a
MG
100 chdir $tempdir;
101 Gruntmaster::Daemon::process $meta;
102 chdir $savedcwd;
103 check_job $meta;
104 }
197cd6a3 105 }
5c5cd38a 106 }
5c5cd38a 107}
This page took 0.024547 seconds and 4 git commands to generate.