KeyMangler example app
[scpubgit/DKit.git] / t / findall.t
1 use strictures 1;
2 use Test::More;
3 use DX::Solver;
4 use DX::OrderedSet;
5
6 my $solver = DX::Solver->new;
7
8 { package My::Server;
9   use Moo;
10   has name => (is => 'ro', required => 1);
11
12   package My::ShellInstalled;
13   use Moo;
14   has server => (is => 'ro', required => 1);
15   has shell => (is => 'ro', required => 1);
16 }
17
18 $solver->facts->{server} = DX::OrderedSet->new(
19   values => [ map My::Server->new(name => $_), qw(one two three four five) ]
20 );
21 $solver->facts->{shell_installed} = DX::OrderedSet->new(
22   values => [
23     (map My::ShellInstalled->new(server => $_, shell => 'bash'),
24        qw(one three four)),
25     (map My::ShellInstalled->new(server => $_, shell => 'csh'),
26        qw(two three five)),
27   ],
28 );
29
30 $solver->add_rule(has_shell => [ 'Srv', 'Shell' ],
31   [ member_of => 'SI', \'shell_installed' ],
32   [ prop => 'SI' => \'server' => 'Name' ],
33   [ prop => 'Srv' => \'name' => 'Name' ],
34   [ prop => 'SI' => \'shell' => 'Shell' ]
35 );
36
37 my @r = $solver->query(
38   [ findall => X => S => [
39     [ member_of => 'S', \'server' ],
40     [ has_shell => 'S', \'bash' ],
41   ] ]
42 )->results;
43
44 is_deeply(
45   [ map $_->name, $r[0]->value_for('X')->all ],
46   [ qw(one three four) ]
47 );
48
49 @r = $solver->query(
50   [ foreach => S => [ [ member_of => 'S', \'server' ] ],
51     [ [ has_shell => 'S' => \'bash' ] ] ]
52 )->results;
53
54 ok(!@r, 'No results for only bash');
55
56 $solver->add_rule(has_any_shell => [ 'S' ] => [ has_shell => 'S' => \'bash' ]);
57 $solver->add_rule(has_any_shell => [ 'S' ] => [ has_shell => 'S' => \'csh' ]);
58
59 @r = $solver->query(
60   [ foreach => S => [ [ member_of => 'S', \'server' ] ],
61     [ [ has_any_shell => 'S' ] ] ]
62 )->results;
63
64 # only three matches both legs of has_any_shell
65
66 is(scalar(@r), 2, 'Two solutions for any shell');
67
68 done_testing;