The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# Each filter should have access to blocks/block internals.
use Test::Base tests => 20 * 2;

run {};

package Test::Base::Filter;
use Test::More;

sub foo {
    my $self = shift;
    my $value = shift;
    
# Test access to Test::Base::Filter object.
    ok ref($self), 
       '$self is an object';
    is ref($self), 
       'Test::Base::Filter', 
       '$self is a Test:Base::Filter object';
    like $value,
         qr/^This is some .*text.\z/,
         'Filter value is correct';   

# Test access to Test::Base::Block object.
    my $block = $self->current_block;
    is ref($block), 
       'Test::Base::Block', 
       'Have a reference to our block object';

    ok not($block->is_filtered),
       'Block is not completely filtered yet';

    my $name = shift || 'One';
    is $block->name,
       $name,
       'name is correct';

    my $description = shift || 'One';
    is $block->description,
       $description,
       'description is correct';

    my $original = shift || "This is some text.";
    is $block->original_values->{xxx},
       $original,
       'Access to the original value';

    my $seq_num = shift || 1;
    cmp_ok $block->seq_num,
           '==',
           $seq_num,
           'Sequence number (seq_num) is correct';

    my $array_xxx = shift || ["This is some text."];
    is_deeply $block->{xxx},
              $array_xxx,
             'Test raw content of $block->{xxx}';

    my $method_xxx = shift || "This is some text.";
    is $block->xxx,
       $method_xxx,
       'Test method content of $block->xxx';

# Test access to Test::Base object.
    my $blocks = $block->blocks_object;
    my $block_list = $blocks->block_list;
    is ref($block_list), 
       'ARRAY',
       'Have an array of all blocks';

    is scalar(@$block_list), 
       '2',
       'Is there 2 blocks?';

    is $blocks->block_class,
       "Test::Base::Block",
       'block class';

    is $blocks->filter_class,
       "Test::Base::Filter",
       'filter class';

    is_deeply
       $blocks->{_filters},
       [qw(norm trim)],
       'default filters are ok';

    is $blocks->block_delim,
       '===',
       'block delimiter';

    is $blocks->data_delim,
       '---',
       'data delimiter';

    my $spec = <<END;
=== One
--- xxx foo: This is some text.
=== Two
This is the 2nd description.
Right here.

--- xxx chomp bar
This is some more text.

END
    is $blocks->spec,
       $spec,
       'spec is ok';

    is $block_list->[$seq_num - 1],
       $block,
       'test block ref in list';
}

sub bar {
    my $self = shift;
    my $value = shift;
    $self->foo($value,
        'Two',
        "This is the 2nd description.\nRight here.",
        "This is some more text.\n\n",
        2,
        ["This is some more text."],
        "This is some more text.",
    );
}

__END__
=== One
--- xxx foo: This is some text.
=== Two
This is the 2nd description.
Right here.

--- xxx chomp bar
This is some more text.