Add D
[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 21use constant COMPILER => {
fb85e61f
S
22 qw/BRAINFUCK bfc
23 C gcc
b8f7001a 24 CPP g++
49b65824 25 D dmd
f8b954a9 26 GOLFSCRIPT golfscript
b8f7001a
MG
27 MONO gmcs
28 JAVA javac
6d1f2d94 29 JULIA julia
b8f7001a
MG
30 PASCAL fpc
31 GOLANG go
32 GCCGO gccgo
33 HASKELL ghc
34 PERL perl
8473542d 35 PHP php
92fbf933 36 PYTHON python2.7
cd0623f0 37 RUBY ruby
27be8560 38 RUST rustc
34e16771 39 OCAML ocaml
c88da74d 40 SBCL sbcl/};
b8f7001a 41
6d1f2d94 42my %needs_fork = map { $_ => 1 } qw/GOLANG GOLFSCRIPT GCCGO JAVA JULIA RUBY/;
f8b954a9 43
d5200925 44my $loglevel = $ENV{TEST_LOG_LEVEL} // ($ENV{TEST_VERBOSE} ? 'TRACE' : 'OFF');
5c5cd38a
MG
45my $log_conf = <<CONF;
46log4perl.category.Gruntmaster.Daemon = $loglevel, stderr
47
48log4perl.appender.stderr = Log::Log4perl::Appender::Screen
49log4perl.appender.stderr.layout = Log::Log4perl::Layout::PatternLayout
50log4perl.appender.stderr.layout.ConversionPattern = [\%d] [\%F{1}:\%M{1}:\%L] [\%p] \%m\%n
51CONF
52Log::Log4perl->init(\$log_conf);
53
fe29da7c 54$ENV{PATH} = getcwd . ':' . $ENV{PATH};
436deb11 55umask 0022;
da905f9e 56
5c5cd38a 57sub check_job{
7be5f054 58 my $meta = shift;
197cd6a3 59 if (defined $meta->{results}) {
56187177 60 delete $meta->{results}[$_]{time} for keys @{$meta->{results}};
197cd6a3 61 }
ee638edb
MG
62 my $desc = $meta->{name} . ': ' . $meta->{test_name};
63 is $meta->{result}, $meta->{expected_result}, "Result is correct ($desc)";
64 is $meta->{result_text}, $meta->{expected_result_text}, "Result text is correct ($desc)";
65 is_deeply $meta->{results}, $meta->{expected_results}, "Results are correct ($desc)";
5c5cd38a
MG
66}
67
68my @problems = exists $ENV{TEST_PROBLEMS} ? map {"t/problems/$_"} split ' ', $ENV{TEST_PROBLEMS} : <t/problems/*>;
b8f7001a
MG
69@problems = grep { $_ !~ /hello/ } @problems unless $ENV{RELEASE_TESTING} || $ENV{TEST_PROBLEMS};
70
5c5cd38a
MG
71plan tests => 3 * sum map { my @temp = <$_/tests/*>; scalar @temp } @problems;
72note "Problems to be tested: " . join ', ', @problems;
73
23b3dc5a 74my $tempdir = tempdir "gruntmasterd-testingXXXX", TMPDIR => 1, CLEANUP => 1;
f028e0a8 75chmod 0777, $tempdir;
10c4f6f5
MG
76
77my $job = 0;
5c5cd38a
MG
78
79for my $problem (@problems) {
7be5f054
MG
80 my $pbmeta = LoadFile "$problem/meta.yml";
81 for (1 .. $pbmeta->{testcnt}) {
82 $pbmeta->{infile}[$_ - 1] = read_file "$problem/$_.in" if $pbmeta->{generator} eq 'File';
00a45f89 83 $pbmeta->{okfile}[$_ - 1] = read_file "$problem/$_.ok" if $pbmeta->{runner} && $pbmeta->{runner} eq 'File';
197cd6a3 84 }
7be5f054 85 if (exists $pbmeta->{files}) {
759d3ca5 86 $_->{content} = read_file "$problem/$_->{name}" for values %{$pbmeta->{files}}
197cd6a3 87 }
10c4f6f5 88
197cd6a3 89 TODO: {
7be5f054 90 note "Now testing problem $pbmeta->{name} ($pbmeta->{description})";
10c4f6f5 91
197cd6a3 92 for my $source (<$problem/tests/*>) {
b8f7001a
MG
93 SKIP: {
94 my $meta = LoadFile "$source/meta.yml";
fcfcfb93 95 if ($meta->{files}{prog}) {
fd807ac9
MG
96 my $format = $meta->{files}{prog}{format};
97 my $compiler = COMPILER->{$format};
fcfcfb93 98 skip "$compiler not found in path", 3 unless $ENV{GRUNTMASTER_VM} || which $compiler;
f8b954a9 99 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
100 $meta->{files}{prog}{content} = read_file "$source/$meta->{files}{prog}{name}";
101 }
b8f7001a 102 $meta = merge $meta, $pbmeta;
fd807ac9 103 local $TODO = $meta->{todo} if exists $meta->{todo};
b8f7001a 104 note "Running $meta->{test_name} ($meta->{test_description})...";
fe29da7c 105 my $savedcwd = getcwd;
b8f7001a
MG
106 chdir $tempdir;
107 Gruntmaster::Daemon::process $meta;
108 chdir $savedcwd;
109 check_job $meta;
110 }
197cd6a3 111 }
5c5cd38a 112 }
5c5cd38a 113}
This page took 0.024638 seconds and 4 git commands to generate.