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