expunge [ value => $value ] style in favour of scalarrefs
[scpubgit/DKit.git] / t / basic_rule.t
CommitLineData
b40e416a 1use strictures 1;
2use Test::More;
3use DX::Solver;
c2e9a3a3 4use DX::SetOver;
b40e416a 5
6my @servers = qw(
7 kitty.scsys.co.uk
8 jim.example.com
9 joe.example.com
10 pryde.scsys.co.uk
11 bob.example.com
12);
13
14my %servers = map +($_ => { name => $_ }), @servers;
15
16my @shells = qw(csh bash);
17
18my %shells = (
19 bash => { name => 'bash',
20 installed_on => {
21 map +($_ => 1),
22 qw(joe.example.com kitty.scsys.co.uk)
23 },
24 },
25 csh => { name => 'csh',
26 installed_on => {
27 map +($_ => 1),
28 qw(jim.example.com joe.example.com bob.example.com)
29 },
30 },
31);
32
33my $solver = DX::Solver->new(
c2e9a3a3 34 facts => {
35 servers => DX::SetOver->new(
36 over => sub { $_[0]->{name} }, values => \%servers,
37 ),
38 shells => DX::SetOver->new(
39 over => sub { $_[0]->{name} }, values => \%shells,
40 ),
41 }
b40e416a 42);
43
385fa954 44$solver->add_rule(
ccfe7414 45 server => [ 'S' ] => [ member_of => S => \'servers' ]
385fa954 46);
b40e416a 47
7d384eca 48my $s = $solver->query([ server => 'S' ]);
b40e416a 49
deec7cc4 50is_deeply([ map $_->value_for('S')->{name}, $s->results ], [ sort @servers ]);
b40e416a 51
385fa954 52$solver->add_rule(
ccfe7414 53 shell => [ 'S' ] => [ member_of => S => \'shells' ])
b40e416a 54 ->add_rule(name => [ qw(T N) ],
55 [ constrain => [ qw(T N) ],
6d533c9d 56 sub { $_[0]->{name} eq $_[1] } ]
b40e416a 57 )
58 ->add_rule(shell_installed_on => [ qw(Shell Srv) ],
59 [ constrain => [ qw(Shell Srv) ],
60 sub { $_[0]->{installed_on}{$_[1]->{name}} } ]
61 );
62
63$s = $solver->query(
6d533c9d 64 [ shell => 'Shell' ],
ccfe7414 65 [ name => 'Shell', \'bash' ],
6d533c9d 66 [ server => 'Srv' ],
67 [ shell_installed_on => qw(Shell Srv) ],
b40e416a 68 );
69
6d533c9d 70is_deeply(
deec7cc4 71 [ sort map $_->value_for('Srv')->{name}, $s->results ],
6d533c9d 72 [ qw(joe.example.com kitty.scsys.co.uk) ]
73);
b40e416a 74
75done_testing;