X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2Fbasic.t;h=3bd068424f6005df8f373859556d813db452821f;hb=5622b4df271135b1574c6346e50f3812f55a7c68;hp=5539ff4a262854664155b01ea4dc02ea08370d1a;hpb=94565614cc7abfa71ad664816ba845bc6ea14741;p=scpubgit%2FDKit.git diff --git a/t/basic.t b/t/basic.t index 5539ff4..3bd0684 100644 --- a/t/basic.t +++ b/t/basic.t @@ -36,36 +36,70 @@ sub bind_array { } } +sub test_values { + my ($vars, $test) = @_; + sub { + my ($self, $state) = @_; + my @values = map $state->scope_var($_)->bound_value, @$vars; + if ($test->(@values)) { + return $state->then($self->next); + } + return $state->backtrack; + } +} + my $op = FromCode->new( code => bind_array(S => \@servers), next => FromCode->new( - code => sub { - my ($self, $state) = @_; - my $server = $state->scope_var('S')->bound_value; - if ($server =~ /\.example\.com$/) { - return $state->then($self->next); - } - return $state->backtrack; - }, + code => test_values([ 'S' ], sub { $_[0] =~ /\.example\.com$/ }) ) ); -my %scope = map +($_ => $_), qw(S); -my %by_id = map +($_ => DX::Var->new(id => $_)), qw(S); +sub make_state { + my ($vars, $op) = @_; -my $state = DX::State->new( - next_op => $op, - return_stack => [], - by_id => \%by_id, - scope => \%scope, - last_choice => [] -); + my %scope = map +($_ => $_), @{$vars}; + my %by_id = map +($_ => DX::Var->new(id => $_)), @{$vars}; + + DX::State->new( + next_op => $op, + return_stack => [], + by_id => \%by_id, + scope => \%scope, + last_choice => [] + ); +} -my $stream = DX::ResultStream->new(for_state => $state); +my $stream = DX::ResultStream->new(for_state => make_state([ 'S' ], $op)); is($stream->next->{'S'}, $_) for qw(jim.example.com joe.example.com bob.example.com); -dies_ok { $stream->next } 'No more'; +is($stream->next, undef, 'No more'); + +exit 0; + +my $complex_op = FromCode->new( + code => bind_array(S => \@servers), + next => FromCode->new( + code => test_values([ 'S' ], sub { $_[0] =~ /\.example\.com$/ }), + next => FromCode->new( + code => bind_array(P => \@shells), + next => FromCode->new( + code => test_values([ qw(S P) ], sub { $shells{$_[1]}{$_[0]} }), + ) + ) + ) +); + +my $cstream = DX::ResultStream->new( + for_state => make_state([ qw(S P) ], $complex_op) +); + +::Dwarn($cstream->next); +::Dwarn($cstream->next); +::Dwarn($cstream->next); +::Dwarn($cstream->next); +::Dwarn($cstream->next); done_testing;