package JSON::Streaming::Writer::TestUtil;
# Just some utility bits for the test scripts to use.
use strict;
use warnings;
use base qw(Exporter);
use JSON::Streaming::Writer;
use Symbol;
our @EXPORT = qw(test_jsonw test_jsonw_croak);
sub test_jsonw {
my ($test_name, $correct_output, $code) = @_;
my $fh = JSON::Streaming::Writer::TestUtil::FakeHandle->new();
my $jsonw = JSON::Streaming::Writer->for_stream($fh);
$code->($jsonw);
my $actual_output = $fh->result;
Test::More::is($correct_output, $actual_output, $test_name) if defined($correct_output);
}
sub test_jsonw_croak {
my ($test_name, $code) = @_;
eval {
test_jsonw($test_name, undef, $code);
};
if ($@) {
Test::More::pass($test_name);
}
else {
Test::More::fail($test_name);
}
}
package JSON::Streaming::Writer::TestUtil::FakeHandle;
sub new {
my ($class) = @_;
my $sym = Symbol::gensym();
return tie(*$sym, __PACKAGE__);
}
sub TIEHANDLE {
my ($class) = @_;
my $buf = "";
my $ret = \$buf;
my $self = bless $ret, $class;
return $ret;
}
sub print {
${(shift)} .= join('', @_);
}
sub result {
return ${$_[0]};
}
1;