package TestAPRlib::brigade;

# testing APR::Brigade in this tests.
# Other tests do that too:
# TestAPR::flatten : flatten()
# TestAPR::bucket  : is_empty(), first(), last()

use strict;
use warnings FATAL => 'all';

use Apache::Test;
use Apache::TestUtil;

use APR::Pool ();
use APR::Brigade ();
use APR::Bucket ();
use APR::BucketAlloc ();

use Apache2::Const -compile => 'OK';

sub num_of_tests {
    return 14;
}

sub test {

    my $p = APR::Pool->new();
    my $ba   = APR::BucketAlloc->new($p);

    # basic + pool + destroy
    {
        my $bb = APR::Brigade->new($p, $ba);

        t_debug('$bb is defined');
        ok defined $bb;

        t_debug('$bb ISA APR::Brigade object');
        ok $bb->isa('APR::Brigade');

        my $pool = $bb->pool;

        t_debug('$pool is defined');
        ok defined $pool;

        t_debug('$pool ISA APR::Pool object');
        ok $pool->isa('APR::Pool');

        t_debug("destroy");
        $bb->destroy;
        ok 1;
    }

    # concat / split / length / flatten
    {
        my $bb1 = APR::Brigade->new($p, $ba);
        $bb1->insert_head(APR::Bucket->new($ba, "11"));
        $bb1->insert_tail(APR::Bucket->new($ba, "12"));

        my $bb2 = APR::Brigade->new($p, $ba);
        $bb2->insert_head(APR::Bucket->new($ba, "21"));
        $bb2->insert_tail(APR::Bucket->new($ba, "22"));

        # concat
        $bb1->concat($bb2);
        # bb1: 11, 12, 21, 22
        ok t_cmp($bb1->length, 8, "total data length in bb");
        my $len = $bb1->flatten(my $data);
        ok t_cmp($len, 8, "bb flatten/len");
        ok t_cmp($data, "11122122", "bb flatten/data");
        t_debug('$bb2 is empty');
        ok $bb2->is_empty;

        # split
        my $b = $bb1->first; # 11
        $b = $bb1->next($b); # 12
        my $bb3 = $bb1->split($b);

        # bb1: 11, bb3: 12, 21, 22
        $len = $bb1->flatten($data);
        ok t_cmp($len, 2, "bb1 flatten/len");
        ok t_cmp($data, "11", "bb1 flatten/data");
        $len = $bb3->flatten($data);
        ok t_cmp($len, 6, "bb3 flatten/len");
        ok t_cmp($data, "122122", "bb3 flatten/data");
    }

    # out-of-scope pools
    {
        my $bb1 = APR::Brigade->new(APR::Pool->new, $ba);
        $bb1->insert_head(APR::Bucket->new($ba, "11"));
        $bb1->insert_tail(APR::Bucket->new($ba, "12"));

        # try to overwrite the temp pool data
        require APR::Table;
        my $table = APR::Table::make(APR::Pool->new, 50);
        $table->set($_ => $_) for 'aa'..'za';
        # now test that we are still OK

        my $len = $bb1->flatten(my $data);
        ok t_cmp($data, "1112", "correct data");
    }

    Apache2::Const::OK;
}

1;
