]>
Commit | Line | Data |
---|---|---|
acb202c6 MG |
1 | #!/usr/bin/perl -w |
2 | use v5.14; | |
3 | ||
6d34ddc5 MG |
4 | use Test::More; |
5 | use Gruntmaster::App; | |
acb202c6 | 6 | use Gruntmaster::Data; |
6d34ddc5 | 7 | use App::Cmd::Tester; |
acb202c6 | 8 | |
6d34ddc5 MG |
9 | BEGIN { |
10 | eval { | |
6fb81f9a | 11 | dbinit 'dbi:Pg:dbname=gmtest'; 1; |
6d34ddc5 | 12 | } or plan skip_all => 'Cannot connect to test database. Create it by running make_test_db.sh before running this test. '. "Error: $@"; |
13af733e MG |
13 | no warnings 'redefine'; |
14 | *Gruntmaster::App::dbinit = sub {}; # Prevent reinit in Gruntmaster::App->run | |
f2005eb5 | 15 | plan tests => 30; |
acb202c6 MG |
16 | } |
17 | ||
6d34ddc5 MG |
18 | sub fakein { |
19 | open my $fakein, '<', \$_[0]; | |
20 | *STDIN = $fakein; | |
21 | } | |
acb202c6 | 22 | |
6d34ddc5 MG |
23 | sub ta { |
24 | my ($args, $out, $err) = @_; | |
25 | my $ret = test_app 'Gruntmaster::App' => $args; | |
26 | diag 'Error: ', $ret->error if defined $ret->error; | |
27 | is $ret->output, "$out\n", join ' ', gm => @$args if defined $out; | |
28 | $ret | |
29 | } | |
acb202c6 | 30 | |
6d34ddc5 | 31 | fakein <<EOF; |
acb202c6 MG |
32 | My cool contest |
33 | MGV | |
34 | 2014-01-01 00:00Z | |
35 | 2014-01-01 05:00Z | |
6d34ddc5 | 36 | EOF |
acb202c6 | 37 | |
6d34ddc5 | 38 | ta [qw/-c add ct/]; |
acb202c6 | 39 | |
6d34ddc5 MG |
40 | subtest 'gm -c add ct' => sub { |
41 | plan tests => 4; | |
42 | my $ct = contest_entry 'ct'; | |
43 | is $ct->{name}, 'My cool contest', 'contest name'; | |
44 | is $ct->{owner}, 'MGV', 'contest owner'; | |
45 | is $ct->{start}, 1388534400, 'contest start'; | |
46 | is $ct->{stop}, 1388534400 + 5 * 60 * 60, 'contest stop'; | |
47 | }; | |
acb202c6 | 48 | |
6d34ddc5 MG |
49 | { |
50 | my $out = ta([qw/-c show ct/])->output; | |
51 | like $out, qr/Name: My cool contest/, 'gm -c show ct contains Name' | |
52 | } | |
acb202c6 | 53 | |
6d34ddc5 MG |
54 | ta [qw/-c get ct owner/], 'MGV'; |
55 | ta [qw/-c set ct owner nobody/]; | |
56 | ta [qw/-c get ct owner/], 'nobody'; | |
57 | ta [qw/-c list/], join "\n", sort qw/fc rc pc ct/; | |
58 | ta [qw/-c rm ct/]; | |
59 | ok !defined contest_entry('ct'), 'gm -c rm ct'; | |
acb202c6 | 60 | |
6d34ddc5 | 61 | fakein <<EOF; |
acb202c6 | 62 | Test problem |
6d34ddc5 MG |
63 | y |
64 | pc | |
acb202c6 MG |
65 | Marius Gavrilescu |
66 | Smaranda Ciubotaru | |
67 | MGV | |
68 | b | |
6d34ddc5 | 69 | gm |
acb202c6 MG |
70 | c |
71 | a | |
72 | a | |
73 | 3 | |
74 | 1 | |
75 | 100 | |
76 | Ok | |
77 | Ok | |
78 | Ok | |
6d34ddc5 MG |
79 | EOF |
80 | ||
81 | ta [qw/-p add pb/]; | |
82 | ||
f2005eb5 MG |
83 | { |
84 | my $out = ta([qw/-p show pb/])->output; | |
85 | like $out, qr/Value \(points\): 250/, 'gm -p show pb contains Value' | |
86 | } | |
87 | ||
6d34ddc5 MG |
88 | subtest 'gruntmaster-problem add' => sub { |
89 | plan tests => 10; | |
90 | my $pb = problem_entry 'pb'; | |
91 | ok $pb, 'problem exists'; | |
92 | is $pb->{name}, 'Test problem', 'name'; | |
93 | ok $pb->{private}, 'private'; | |
94 | is $pb->{author}, 'Marius Gavrilescu', 'author'; | |
95 | is $pb->{writer}, 'Smaranda Ciubotaru', 'statement writer'; | |
96 | is $pb->{owner}, 'MGV', 'owner'; | |
97 | is $pb->{level}, 'easy', 'level'; | |
98 | is $pb->{timeout}, 1, 'time limit'; | |
99 | is $pb->{olimit}, 100, 'output limit'; | |
100 | ok contest_has_problem('ct', 'pb'), 'is in contest'; | |
acb202c6 MG |
101 | }; |
102 | ||
6d34ddc5 MG |
103 | ta [qw/-p get pb author/], 'Marius Gavrilescu'; |
104 | ta [qw/-p set pb owner nobody/]; | |
105 | ta [qw/-p get pb owner/], 'nobody'; | |
096c7331 MG |
106 | ta [qw/-p set --file pb statement README/]; |
107 | like problem_entry('pb')->{statement}, qr/Gruntmaster-Data/, 'gm -p set --file pb statement README'; | |
6d34ddc5 MG |
108 | ta [qw/-p list/], join "\n", sort qw/arc pca rca fca prv pb/; |
109 | ta [qw/-p rm pb/]; | |
110 | ok !defined problem_entry ('pb'), 'gm -p rm pb'; | |
111 | ||
112 | my $id = create_job extension => '.cpp', format => 'CPP', problem => 'arc', source => '...', owner => 'MGV'; | |
113 | ok abs (time - user_entry('MGV')->{lastjob}) < 2, 'create_job - lastjob looks sane'; | |
114 | ta [rerun => $id]; | |
115 | is job_entry($id)->{result}, -2, "gm rerun $id"; | |
116 | ta [qw/rm -j/, $id]; | |
117 | ||
d68b9d20 MG |
118 | ta [rerun => 'fca']; |
119 | my @fca_jobs = grep { $_->{problem} eq 'fca' } @{job_list()}; | |
120 | ok ((!grep { $_->{result} != -2 } @fca_jobs), "gm rerun fca"); | |
121 | ||
6d34ddc5 MG |
122 | sub terr { |
123 | my ($args, $err) = @_; | |
124 | my $ret = test_app 'Gruntmaster::App' => $args; | |
125 | like $ret->error, qr/$err/, join ' ', 'invalid:', gm => @$args; | |
126 | $ret | |
127 | } | |
acb202c6 | 128 | |
6d34ddc5 MG |
129 | terr [qw/add/], 'No table selected'; |
130 | terr [qw/-j add/], 'Don\'t know how to add to this table'; | |
131 | terr [qw/-c add/], 'Wrong number of arguments'; | |
132 | terr [qw/get/], 'No table selected'; | |
133 | terr [qw/-c get/], 'Wrong number of arguments'; | |
134 | terr [qw/list/], 'No table selected'; | |
d68b9d20 | 135 | terr [qw/-j rerun/], 'Not enough arguments'; |
6d34ddc5 MG |
136 | terr [qw/rm/], 'No table selected'; |
137 | terr [qw/-j rm/], 'Wrong number of arguments'; | |
138 | terr [qw/set/], 'No table selected'; | |
139 | terr [qw/-j set 1 owner/], 'Not enough arguments'; | |
140 | terr [qw/-j set 1 owner x name/], 'The number of arguments must be odd'; | |
141 | terr [qw/show/], 'No table selected'; | |
142 | terr [qw/-c show/], 'Wrong number of arguments'; |