use strictures 1; use MooseX::Declare; class Test::Irssi::Test { use Test::Irssi; use Test::Irssi::Driver; use feature qw/say/; has 'parent' => ( is => 'ro', isa => 'Test::Irssi', required => 1, ); has 'name' => ( is => 'ro', isa => 'Str', required => 1, ); has 'description' => ( is => 'rw', isa => 'Str', default => '', ); has 'states' => ( is => 'ro', isa => 'ArrayRef', traits => [qw/Array/], default => sub { [] }, lazy => 1, handles => { add_state => 'push', state_count => 'count', get_state => 'get', }, ); has 'results' => ( is => 'ro', isa => 'ArrayRef', default => sub { [] }, ); has '_next_state' => ( is => 'rw', isa => 'Int', default => 0, traits => [qw/Counter/], handles => { _increment_state_counter => 'inc', _clear_state => 'reset', }, ); method add_input_sequence(Str $input) { $self->add_state({input => $input }); $self->log("Adding $input as input"); } method add_delay (Num $delay) { $self->add_state({delay => $delay }); $self->log("Adding $delay as delay"); } sub add_pattern_match { my ($self, $pattern, $constraints) = @_; $self->add_state({output => 1, pattern => $expected, constraints => $constraints}); $self->log("Adding $expected as output match "); } sub add_evaluation_function { my ($self, $coderef) = @_; $self->add_state({code => $coderef}); } method process_next_state { my $state_num = $self->_next_state; $self->log("PNS: $state_num"); my $state = $self->states->[$state_num]; my $return = 0; $self->_next_state($state_num+1); if ($self->has_next_state) { $self->log("Has another state"); } else { $self->log("Has no more state"); return 2; } return $return; } sub check_output { my ($self, $pattern) = @_; say "All Goodn\n\n"; } sub get_next_state { my ($self) = @_; my $item = $self->get_state($self->_next_state); $self->_increment_state_counter; return $item; } sub execute { my ($self) = @_; # set this as hte currently active test. $self->parent->active_test($self); $self->evaluate_test; } sub evaluate_test { my ($self) = @_; $self->log("Eval Test:"); while (my $state = $self->get_next_state) { if ( exists($state->{delay})) { $self->parent->apply_delay($state->{delay}); return; } else { if (exists $state->{input}) { $self->parent->inject_text($state->{input}); $self->log("input: ". $state->{input}); } if (exists $state->{code}) { my @args = ($self, $self->parent, $self->parent->vt); my $ret = $state->{code}->(@args); if (exists $state->{output}) { my $pattern = $state->{pattern}; $self->check_output($pattern); } } } $self->log("Execution Finished"); } sub resume_from_timer { my ($self) = @_; $self->log("Resuming after timeout"); $self->evaluate_test; } sub log { my ($self, $msg) = @_; $self->parent->_logfile_fh->say($msg); } } __END__