From Code to Community: Sponsoring The Perl and Raku Conference 2025 Learn more

use Test::More tests => 21;
# These tests are for the add_value and add_property
# methods which take Perl values and generate sensible
# JSON representations.
test_jsonw("Empty array", "[]", sub {
my $jsonw = shift;
$jsonw->add_value([]);
});
test_jsonw("Empty object", "{}", sub {
my $jsonw = shift;
$jsonw->add_value({});
});
test_jsonw("Array containing string", '["ok"]', sub {
my $jsonw = shift;
$jsonw->add_value(["ok"]);
});
test_jsonw("Object containing string", '{"key":"value"}', sub {
my $jsonw = shift;
$jsonw->add_value({"key" => "value"});
});
test_jsonw("Array containing two nulls", '[null,null]', sub {
my $jsonw = shift;
$jsonw->add_value([undef,undef]);
});
test_jsonw("Array containing three nulls", '[null,null,null]', sub {
my $jsonw = shift;
$jsonw->add_value([undef,undef,undef]);
});
test_jsonw("Array containing an integer", '[1]', sub {
my $jsonw = shift;
$jsonw->add_value([1]);
});
test_jsonw("Array containing an number", '[1.5]', sub {
my $jsonw = shift;
$jsonw->add_value([1.5]);
});
test_jsonw("Array containing a weird number", '[1e-20]', sub {
my $jsonw = shift;
$jsonw->add_value([1e-20]);
});
test_jsonw("Array containing both booleans", '[true,false]', sub {
my $jsonw = shift;
$jsonw->add_value([\1, \0]);
});
test_jsonw_croak("Top-level string causes croak", sub {
my $jsonw = shift;
$jsonw->add_value("Hello");
});
test_jsonw_croak("Top-level integer causes croak", sub {
my $jsonw = shift;
$jsonw->add_value(1);
});
test_jsonw_croak("Top-level number causes croak", sub {
my $jsonw = shift;
$jsonw->add_value(1.5);
});
test_jsonw_croak("Top-level null causes croak", sub {
my $jsonw = shift;
$jsonw->add_value(undef);
});
test_jsonw_croak("Top-level boolean causes croak", sub {
my $jsonw = shift;
$jsonw->add_value(\1);
});
test_jsonw("add_property inside an object", '{"hello":"world"}', sub {
my $jsonw = shift;
$jsonw->start_object();
$jsonw->add_property("hello" => "world");
$jsonw->end_object();
});
test_jsonw("add_value inside an array", '["foo"]', sub {
my $jsonw = shift;
$jsonw->start_array();
$jsonw->add_value("foo");
$jsonw->end_array();
});
test_jsonw_croak("add_property inside an array fails", sub {
my $jsonw = shift;
$jsonw->intentionally_ending_early();
$jsonw->start_array();
$jsonw->add_property("hello" => "world");
$jsonw->end_array();
});
test_jsonw_croak("add_value inside an object fails", sub {
my $jsonw = shift;
$jsonw->intentionally_ending_early();
$jsonw->start_object();
$jsonw->add_value("foo");
$jsonw->end_object();
});
test_jsonw_croak("add_property at the top level fails", sub {
my $jsonw = shift;
$jsonw->intentionally_ending_early();
$jsonw->add_property("hello" => "world");
});
test_jsonw("both add_property and explicity start_property inside an object", '{"simple":true,"normal":false}', sub {
my $jsonw = shift;
$jsonw->start_object();
$jsonw->add_property("simple" => \1);
$jsonw->start_property("normal");
$jsonw->add_value(\0);
$jsonw->end_property();
$jsonw->end_object();
});