Commit | Line | Data |
9a4942da |
1 | use strictures 1; |
2 | use Test::More; |
3 | use DX::Solver; |
4 | use DX::SetOver; |
5 | |
6 | { |
7 | package My::PathStatus; |
8 | |
9 | use Moo; |
10 | |
11 | has path => (is => 'ro', required => 1); |
12 | has info => (is => 'ro', required => 1); |
13 | |
14 | package My::PathStatusInfo; |
15 | |
16 | use Moo; |
17 | |
18 | has is_directory => (is => 'ro', default => 0); |
19 | has is_file => (is => 'ro', default => 0); |
20 | has mode => (is => 'ro', required => 1); |
21 | } |
22 | |
23 | @INC{qw(My/PathStatus.pm My/PathStatusInfo.pm)} = (__FILE__,__FILE__); |
24 | |
25 | my %protos = ( |
26 | '.ssh' => My::PathStatus->new( |
27 | path => '.ssh', |
28 | info => My::PathStatusInfo->new(is_directory => 1, mode => '0755') |
29 | ), |
30 | '.ssh/authorized_keys' => My::PathStatus->new( |
31 | path => '.ssh/authorized_keys', |
32 | info => My::PathStatusInfo->new(is_file => 1, mode => '0644') |
33 | ), |
34 | ); |
35 | |
36 | my %path_status; |
37 | |
38 | my $solver = DX::Solver->new( |
39 | facts => { path_status => DX::SetOver->new( |
40 | over => 'path', |
41 | values => \%path_status, |
42 | ) }, |
43 | ); |
44 | |
45 | my @rules = ( |
46 | [ path_status => [ qw(PS) ], |
47 | [ member_of => 'PS', [ value => 'path_status' ] ] ], |
48 | [ path => [ qw(PS P) ], |
49 | [ constrain => [ qw(PS P) ], sub { $_[0]->path eq $_[1] } ] ], |
50 | [ mode => [ qw(PS M) ], |
51 | [ constrain => [ qw(PS M) ], |
52 | sub { $_[0]->info and $_[0]->info->mode eq $_[1] } ] ], |
53 | [ is_directory => [ qw(PS) ], |
54 | [ constrain => [ qw(PS) ], |
55 | sub { $_[0]->info and $_[0]->info->is_directory } ] ], |
56 | [ is_file => [ qw(PS) ], |
57 | [ constrain => [ qw(PS) ], |
58 | sub { $_[0]->info and $_[0]->info->is_file } ] ], |
59 | ); |
60 | |
61 | $solver->add_rule(@$_) for @rules; |
62 | |
63 | %path_status = %protos; |
64 | |
65 | sub paths_for { |
66 | join ' ', map $_->{PS}{path}, $solver->query( |
67 | [ qw(PS) ], [ path_status => 'PS'], @_ |
68 | )->results; |
69 | } |
70 | |
71 | is(paths_for(), '.ssh .ssh/authorized_keys'); |
72 | |
73 | is(paths_for([ is_directory => 'PS' ]), '.ssh'); |
74 | |
75 | is(paths_for([ is_file => 'PS' ]), '.ssh/authorized_keys'); |
76 | |
77 | is(paths_for([ mode => 'PS', [ value => '0755' ] ]), '.ssh'); |