package Rumsti;
use TM;
use base qw(TM);
use Class::Trait ('TM::Synchronizable' => { exclude => 'mtime' } );
sub reset {
my $self = shift;
$self->{sync_in_called} = 0;
$self->{sync_out_called} = 0;
}
sub mtime {
#warn "rumsti mtime";
return time + 1;
}
sub source_in {
my $self = shift;
$self->{sync_in_called}++;
}
sub source_out {
my $self = shift;
$self->{sync_out_called}++;
}
1;
package Ramsti;
use base qw(Rumsti);
1;
package Remsti;
use base qw(Rumsti);
1;
package Romsti;
use base qw(Rumsti);
1;
#-- test suite
use strict;
use warnings;
# change 'tests => 1' to 'tests => last_test_to_print';
use Test::More qw(no_plan);
use Data::Dumper;
sub _chomp {
my $s = shift;
chomp $s;
return $s;
}
#== TESTS =====================================================================
require_ok ('TM::Tau::Federate');
eval {
my $f = new TM::Tau::Federate;
}; like ($@, qr/no left/, 'left operand missing');
use TM::Tau::Filter;
eval {
my $f = new TM::Tau::Federate (left => new TM::Tau::Filter (map => new TM));
}; like ($@, qr/no right/, 'right operand missing');
{ # structural
my $f = new TM::Tau::Federate (left => new TM::Tau::Filter (map => new Rumsti),
right => new TM::Tau::Federate (left => new TM::Tau::Filter (map => new Ramsti),
right => new TM::Tau::Filter (map => new Remsti)));
ok ($f->isa ('TM::Tau::Federate'), 'class');
ok (!$f->{map}, 'empty map');
ok ($f->{left}->isa ('TM::Tau::Filter'), 'left class');
ok ($f->{right}->isa ('TM::Tau::Federate'), 'right class');
ok ($f->{right}->{left}->isa ('TM::Tau::Filter'), 'rightleft class');
ok ($f->{right}->{right}->isa ('TM::Tau::Filter'), 'rightright class');
ok (!$f->{right}->{right}->{operand}, 'rightright operand class');
}
{
my $f = new TM::Tau::Federate (url => 'whatever:', # only if there is a URL, the infrastructure will try a sync out
left => new TM::Tau::Filter (left => new Rumsti (url => 'in1:'),
url => 'what:ever'),
right => new TM::Tau::Federate (left => new TM::Tau::Filter (left => new Ramsti (url => 'in2:'),
url => 'what:ever'),
right => new TM::Tau::Filter (left => new Remsti (url => 'in3:'),
url => 'what:ever'),
url => 'what:ever'));
use Class::Trait;
Class::Trait->apply ($f, 'TM::Synchronizable', { exclude => [ 'mtime', 'sync_out' ] });
$f->sync_in;
is ($f->left->left->{sync_in_called}, 1, 'tried sync in once');
is ($f->right->left->left->{sync_in_called}, 1, 'tried sync in once');
is ($f->right->right->left->{sync_in_called}, 1, 'tried sync in once');
$f->{last_mod} = time + 1; # make sure we fake change
# MUCH TO BE DONE HERE
# $f->sync_out;
# is ($f->left->left->{sync_in_called}, 1, 'tried sync in once');
# is ($f->right->left->left->{sync_in_called}, 1, 'tried sync in once');
# is ($f->right->right->left->{sync_in_called}, 1, 'tried sync in once');
}
__END__