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