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