Add D
[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/BRAINFUCK bfc
23 C gcc
24 CPP g++
25 D dmd
26 GOLFSCRIPT golfscript
27 MONO gmcs
28 JAVA javac
29 JULIA julia
30 PASCAL fpc
31 GOLANG go
32 GCCGO gccgo
33 HASKELL ghc
34 PERL perl
35 PHP php
36 PYTHON python2.7
37 RUBY ruby
38 RUST rustc
39 OCAML ocaml
40 SBCL sbcl/};
41
42my %needs_fork = map { $_ => 1 } qw/GOLANG GOLFSCRIPT GCCGO JAVA JULIA RUBY/;
43
44my $loglevel = $ENV{TEST_LOG_LEVEL} // ($ENV{TEST_VERBOSE} ? 'TRACE' : 'OFF');
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
54$ENV{PATH} = getcwd . ':' . $ENV{PATH};
55umask 0022;
56
57sub check_job{
58 my $meta = shift;
59 if (defined $meta->{results}) {
60 delete $meta->{results}[$_]{time} for keys @{$meta->{results}};
61 }
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)";
66}
67
68my @problems = exists $ENV{TEST_PROBLEMS} ? map {"t/problems/$_"} split ' ', $ENV{TEST_PROBLEMS} : <t/problems/*>;
69@problems = grep { $_ !~ /hello/ } @problems unless $ENV{RELEASE_TESTING} || $ENV{TEST_PROBLEMS};
70
71plan tests => 3 * sum map { my @temp = <$_/tests/*>; scalar @temp } @problems;
72note "Problems to be tested: " . join ', ', @problems;
73
74my $tempdir = tempdir "gruntmasterd-testingXXXX", TMPDIR => 1, CLEANUP => 1;
75chmod 0777, $tempdir;
76
77my $job = 0;
78
79for my $problem (@problems) {
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';
83 $pbmeta->{okfile}[$_ - 1] = read_file "$problem/$_.ok" if $pbmeta->{runner} && $pbmeta->{runner} eq 'File';
84 }
85 if (exists $pbmeta->{files}) {
86 $_->{content} = read_file "$problem/$_->{name}" for values %{$pbmeta->{files}}
87 }
88
89 TODO: {
90 note "Now testing problem $pbmeta->{name} ($pbmeta->{description})";
91
92 for my $source (<$problem/tests/*>) {
93 SKIP: {
94 my $meta = LoadFile "$source/meta.yml";
95 if ($meta->{files}{prog}) {
96 my $format = $meta->{files}{prog}{format};
97 my $compiler = COMPILER->{$format};
98 skip "$compiler not found in path", 3 unless $ENV{GRUNTMASTER_VM} || which $compiler;
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};
100 $meta->{files}{prog}{content} = read_file "$source/$meta->{files}{prog}{name}";
101 }
102 $meta = merge $meta, $pbmeta;
103 local $TODO = $meta->{todo} if exists $meta->{todo};
104 note "Running $meta->{test_name} ($meta->{test_description})...";
105 my $savedcwd = getcwd;
106 chdir $tempdir;
107 Gruntmaster::Daemon::process $meta;
108 chdir $savedcwd;
109 check_job $meta;
110 }
111 }
112 }
113}
This page took 0.008873 seconds and 4 git commands to generate.