The Perl and Raku Conference 2025: Greenville, South Carolina - June 27-29 Learn more

# vim: set ts=8 sts=2 sw=2 tw=100 et ft=perl :
use strictures 2;
use 5.020;
use stable 0.031 'postderef';
use experimental 'signatures';
no autovivification warn => qw(fetch store exists delete);
use if "$]" >= 5.022, experimental => 're_strict';
no if "$]" >= 5.031009, feature => 'indirect';
no if "$]" >= 5.033001, feature => 'multidimensional';
no if "$]" >= 5.033006, feature => 'bareword_filehandles';
use open ':std', ':encoding(UTF-8)'; # force stdin, stdout, stderr into utf8
use Test2::V0 ();
use Sereal::Decoder;
use lib 't/lib';
use Helper;
my $hub = Test2::API::test2_stack->top;
$hub->set_count(13);
# this is a test that is run from t/serialization.t, incorporating its results into that file.
my @serialized_attributes = sort qw(
specification_version
output_format
short_circuit
max_traversal_depth
validate_formats
validate_content_schemas
collect_annotations
scalarref_booleans
stringy_numbers
strict
_resource_index
_vocabulary_classes
_metaschema_vocabulary_classes
);
my $result = subtest 'thaw object in a separate process' => sub {
local $/;
binmode STDIN, ':raw';
my $thawed = Sereal::Decoder->new->decode(<>);
cmp_result(
[ sort keys %$thawed ],
[ sort @serialized_attributes ],
'thawed object in a new process contains all the right keys',
);
cmp_result(
$thawed->evaluate(1, 'https://my_schema')->TO_JSON,
{
valid => true,
annotations => [
map +{
instanceLocation => '',
keywordLocation => '/'.$_,
absoluteKeywordLocation => 'https://my_schema#/'.$_,
annotation => Test::Deep::ignore,
}, 'format', sort qw(type unknown properties contentMediaType contentSchema),
],
},
'in thawed object, evaluate data against schema with custom dialect; format and unknown keywords are collected as annotations',
);
my $strict_metaschema = {
'$vocabulary' => {
},
};
my $strict_schema = {
type => 'number',
format => 'ipv4',
unknown => 1,
properties => { hello => false },
contentMediaType => 'application/json',
contentSchema => {},
};
$thawed->add_schema($strict_metaschema);
$thawed->add_schema($strict_schema);
cmp_deeply(
$thawed->evaluate('foo', 'https://my_strict_schema')->TO_JSON,
{
valid => false,
errors => [
{
instanceLocation => '',
keywordLocation => '/format',
absoluteKeywordLocation => 'https://my_strict_schema#/format',
error => 'not a valid ipv4',
},
],
},
'evaluate data against schema with custom dialect; format-assertion is used',
);
};
# skip the END block which would normally try to print a plan
Test2::API::test2_stack->top->set_no_ending(1);
exit($result ? 0 : -1);