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