Commit | Line | Data |
b40e416a |
1 | use strictures 1; |
2 | use Test::More; |
3 | use DX::Solver; |
4 | |
5 | my @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 | |
13 | my %servers = map +($_ => { name => $_ }), @servers; |
14 | |
15 | my @shells = qw(csh bash); |
16 | |
17 | my %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 | |
32 | my $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 | |
40 | my $s = $solver->query([ 'S' ], [ call => server => 'S' ]); |
41 | |
42 | is_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 |
63 | is_deeply( |
64 | [ sort map $_->{Srv}{name}, $s->results ], |
65 | [ qw(joe.example.com kitty.scsys.co.uk) ] |
66 | ); |
b40e416a |
67 | |
68 | done_testing; |