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