# $Id: 2_buffermgr.t,v 1.1.1.1 2002/06/14 20:39:49 grantm Exp $
use strict;
use Test::More;
BEGIN { # Seems to be required by older Perls
unless(eval { require XML::SAX::Writer }) {
plan skip_all => 'XML::SAX::Writer not installed';
}
unless(eval { require XML::SAX::ParserFactory }) {
plan skip_all => 'XML::SAX::ParserFactory not installed';
}
}
plan tests => 13;
$^W = 1;
##############################################################################
# Confirm that the module compiles
#
use XML::Filter::Sort::BufferMgr;
ok(1, 'XML::Filter::Sort::BufferMgr compiled OK');
##############################################################################
# Try creating a BufferMgr object
#
my $bm = XML::Filter::Sort::BufferMgr->new(
Keys => [
[ '.', 'a', 'a' ] # All text alpha ascending
]
);
ok(ref($bm), 'Created a buffer manager object');
isa_ok($bm, 'XML::Filter::Sort::BufferMgr');
##############################################################################
# Use it to create a Buffer object
#
my $buffer = $bm->new_buffer();
ok(ref($buffer), 'Created a buffer object');
isa_ok($buffer, 'XML::Filter::Sort::Buffer');
##############################################################################
# Poke some SAX events into the Buffer, close it and confirm that the
# BufferMgr got the correct sort key value out and stored the Buffer in the
# expected place.
#
my $rec_elem = {
Name => 'record',
LocalName => 'record',
Prefix => '',
NamespaceURI => '',
Attributes => {},
};
$buffer->start_element($rec_elem);
$buffer->characters({ Data => 'text content'});
$buffer->end_element($rec_elem);
$bm->close_buffer($buffer);
my($keyval) = keys(%{$bm->{records}});
is($keyval, 'text content', 'Sort key value extracted and buffer stored');
is(ref($bm->{records}->{$keyval}), 'ARRAY',
'Container for single-key records');
##############################################################################
# Ask the BufferMgr to regurgitate its buffers as SAX events to a SAX Writer
# handler and confirm the results.
#
my $xmlout = '';
my $writer = XML::SAX::Writer->new(Output => \$xmlout);
$writer->start_document();
$bm->to_sax($writer);
$writer->end_document();
is($xmlout, 'text content',
'XML returned OK from single-level buffer'
);
##############################################################################
# Create a new BufferMgr object to handle multiple (2) sort keys. Get a
# Buffer, poke some SAX events into it; confirm the sort key values were
# extracted correctly and the storage of the buffer uses a layer of indirection
# for the second key value.
#
$bm = XML::Filter::Sort::BufferMgr->new(
Keys => [
[ './@height', 'n', 'a' ], # primary sort key
[ './@width', 'n', 'a' ], # secondary sort key
]
);
$rec_elem->{Attributes} = {
'{}width' => {
Name => 'width',
LocalName => 'width',
Prefix => '',
NamespaceURI => '',
Value => '1024',
},
'{}height' => {
Name => 'height',
LocalName => 'height',
Prefix => '',
NamespaceURI => '',
Value => '768',
},
};
$buffer = $bm->new_buffer();
$buffer->characters({ Data => ' '});
$buffer->start_element($rec_elem);
$buffer->characters({ Data => 'text content'});
$buffer->end_element($rec_elem);
$bm->close_buffer($buffer);
my($pkeyval) = keys(%{$bm->{records}});
is($pkeyval, 768, 'Primary sort key value extracted and buffer stored');
is(ref($bm->{records}->{$pkeyval}), 'XML::Filter::Sort::BufferMgr',
'High level container for multi-key records');
my($skeyval) = keys(%{$bm->{records}->{$pkeyval}->{records}});
is($skeyval, 1024, 'Secondary sort key value extracted and buffer stored');
is(ref($bm->{records}->{$pkeyval}->{records}->{$skeyval}), 'ARRAY',
'Lowest level container for multi-key records');
##############################################################################
# Get the buffer contents back via a SAX Writer and confirm they are as
# expected.
#
$xmlout = '';
$writer = XML::SAX::Writer->new(Output => \$xmlout);
$writer->start_document();
$bm->to_sax($writer);
$writer->end_document();
$xmlout =~ s/"/'/sg;
like($xmlout,
qr{^ text content},
'XML returned OK from multi-level buffer'
);