#!/usr/bin/perl # Test of Net::IMP::Cascade combined with Net::IMP::Pattern # check behavior for bidirectional data use strict; use warnings; use Net::IMP; use Net::IMP::Cascade; use Net::IMP::Pattern; use Net::IMP::Debug; use Data::Dumper; use Test::More tests => 1; $DEBUG=0; # enable for extensiv debugging my $analyzer = Net::IMP::Cascade->new_factory( parts => [ Net::IMP::Pattern->new_factory( rx => qr/abcd/, rxlen => 4, action => 'replace', actdata => 'ABCD' ), Net::IMP::Pattern->new_factory( rx => qr/CDEF/, rxlen => 4, action => 'replace', actdata => 'cdef' ), PrePass->new_factory( window => IMP_MAXOFFSET ), ])->new_analyzer; my @rv; $analyzer->set_callback( sub { debug(Dumper(\@_)); push @rv,@_; }); $analyzer->data(0,'abcdEF abCDEF'); $analyzer->data(1,'abcdEF abCDEF'); $analyzer->data(1,''); $analyzer->data(0,''); my @expect = ( [ 'replace', 0, 6, 'ABcdef' ], [ 'prepass', 0, 7 ], [ 'replace', 1, 4, 'ABCD' ], [ 'prepass', 1, 6 ], [ 'prepass', 1, 7 ], [ 'replace', 1, 11, 'ABCD' ], [ 'replace', 1, 13, 'ef' ], [ 'prepass', 1, 13 ], [ 'prepass', 0, 9 ], [ 'replace', 0, 13, 'cdef' ] ); if ( Dumper(\@expect) ne Dumper(\@rv)) { fail("cascade-bidi"); diag("expected ".Dumper(\@expect)."\ngot ".Dumper(\@rv)); } else { pass("cascade-bidi"); } package PrePass; use base 'Net::IMP::Base'; use fields qw(window pos); use Net::IMP; sub new_analyzer { my ($class,%args) = @_; my $window = delete $args{window}; my $self = $class->SUPER::new_analyzer(%args); $self->{window} = $window; $self->{pos} = 0; return $self; } sub data { my ($self,$dir,$data,$offset) = @_; my $pos = $self->{pos}; if ( $offset ) { die "overlapping $offset<$pos" if $offset<$pos; die "gaps not supported" if $offset>$pos; } $self->{pos} += length($data); my $off = ($self->{window} == IMP_MAXOFFSET) ? IMP_MAXOFFSET : $self->{pos} + $self->{window}; $self->run_callback([ IMP_PREPASS, $dir, $off ]); }