1use strict;
2use warnings;
3use Test::More 0.88;
4
5use CPAN::Meta::Prereqs;
6
7delete $ENV{$_} for qw/PERL_JSON_BACKEND PERL_YAML_BACKEND/; # use defaults
8
9sub dies_ok (&@) {
10  my ($code, $qr, $comment) = @_;
11
12  my $lived = eval { $code->(); 1 };
13
14  if ($lived) {
15    fail("$comment: did not die");
16  } else {
17    like($@, $qr, $comment);
18  }
19}
20
21my $prereqs_struct = {
22  runtime => {
23    requires => {
24      'Config' => '1.234',
25      'Cwd'    => '876.5',
26      'IO::File'   => 0,
27      'perl'       => '5.005_03',
28    },
29    recommends => {
30      'Pod::Text' => 0,
31      'YAML'      => '0.35',
32    },
33  },
34  build => {
35    requires => {
36      'Test' => 0,
37    },
38  }
39};
40
41my $prereqs = CPAN::Meta::Prereqs->new($prereqs_struct);
42
43isa_ok($prereqs, 'CPAN::Meta::Prereqs');
44
45$prereqs->finalize;
46
47ok($prereqs->is_finalized, 'cloned obj is not finalized');
48
49is_deeply($prereqs->as_string_hash, $prereqs_struct, '...and still round-trip');
50
51$prereqs->requirements_for(qw(runtime requires))->add_minimum(Cwd => 10);
52
53pass('...we can add a minimum if it has no effect');
54
55dies_ok
56  { $prereqs->requirements_for(qw(runtime requires))->add_minimum(Cwd => 1000) }
57  qr{finalized req},
58  '...but we die if it would alter a finalized prereqs';
59
60$prereqs->requirements_for(qw(develop suggests));
61
62pass('...we can get a V:R object for a previously unconfigured phase');
63
64dies_ok
65  { $prereqs->requirements_for(qw(develop suggests))->add_minimum(Foo => 1) }
66  qr{finalized req},
67  '...but we die if we try to put anything in it';
68
69my $clone = $prereqs->clone;
70
71isa_ok($clone, 'CPAN::Meta::Prereqs', 'cloned prereqs obj');
72
73ok(! $clone->is_finalized, 'cloned obj is not finalized');
74
75is_deeply($clone->as_string_hash, $prereqs_struct, '...it still round-trips');
76
77$clone->requirements_for(qw(runtime requires))->add_minimum(Cwd => 10);
78
79pass('...we can add minimum if it has no effect');
80
81$clone->requirements_for(qw(runtime requires))->add_minimum(Cwd => 1000);
82
83pass('...or if it has an effect');
84
85$clone->requirements_for(qw(develop suggests));
86
87pass('...we can get a V:R object for a previously unconfigured phase');
88
89$clone->requirements_for(qw(develop suggests))->add_minimum(Foo => 1);
90
91pass('...and we can add stuff to it');
92
93done_testing;
94