use Test::More;
use DX::Solver;
use DX::SetOver;
+use DX::Observer::FromCode;
use Test::Exception;
{
%path_status = %protos;
-sub paths_for {
+sub paths_for_simple {
join ' ', map $_->{PS}->path, $solver->query(
[ qw(PS) ], [ path_status => 'PS' ], @_
)->results;
}
-is(paths_for(), '.ssh .ssh/authorized_keys');
+is(paths_for_simple(), '.ssh .ssh/authorized_keys');
-is(paths_for([ is_directory => 'PS' ]), '.ssh');
+is(paths_for_simple([ is_directory => 'PS' ]), '.ssh');
-is(paths_for([ is_file => 'PS' ]), '.ssh/authorized_keys');
+is(paths_for_simple([ is_file => 'PS' ]), '.ssh/authorized_keys');
-is(paths_for([ mode => 'PS', [ value => '0755' ] ]), '.ssh');
+is(paths_for_simple([ mode => 'PS', [ value => '0755' ] ]), '.ssh');
$solver->add_rule(
path_status_at => [ 'PS', 'P' ],
is(join(' ', map $_->{PS}->path, @res), '.ssh');
-#::Dwarn($solver->query([ qw(PS) ], [ path_status_at => 'PS', [ value => '.ssh' ] ])->results);
+delete $solver->rule_set->rules->{'path_status_at/2'};
+
+$solver->add_rule(
+ path_status_at => [ 'PS', 'P' ],
+ [ path_status => 'PS' ],
+ [ path => qw(PS P) ],
+ [ 'cut' ],
+);
+
+my %ob_res;
+
+$solver->add_rule(
+ path_status_at => [ 'PS', 'P' ],
+ [ observe => [ 'P' ],
+ sub {
+ my ($path) = $_[0];
+ DX::Observer::FromCode->new(
+ code => sub { (path_status => $ob_res{$path}) }
+ )
+ }
+ ],
+ [ path_status => 'PS' ],
+ [ path => qw(PS P) ],
+);
+
+%path_status = ('.ssh/authorized_keys' => $protos{'.ssh/authorized_keys'});
+
+$ob_res{'.ssh'} = $protos{'.ssh'};
+
+sub paths_for {
+ join ' ', map $_->{PS}->path, $solver->query([ 'PS' ], @_)->results;
+}
+
+is(
+ paths_for([ path_status => 'PS' ], [ path => 'PS', [ value => '.ssh' ] ]),
+ '',
+ 'no .ssh entry'
+);
+
+throws_ok { paths_for([ path_status_at => 'PS', [ value => '.ssh' ] ]) }
+ qr/refused/;
+
+$solver->{observation_policy} = sub { 1 };
+
+is(
+ paths_for([ path_status_at => 'PS', [ value => '.ssh' ] ]),
+ '.ssh',
+ 'observation'
+);
+
+is($path_status{'.ssh'}, $ob_res{'.ssh'});
+
+delete $solver->{observation_policy};
+
+lives_ok { paths_for([ path_status_at => 'PS', [ value => '.ssh' ] ]) }
+ 'No observation required anymore';
done_testing;