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

use strict;
require_ok 'JSON::TypeInference::Type::Array';
require_ok 'JSON::TypeInference::Type::Boolean';
require_ok 'JSON::TypeInference::Type::Maybe';
require_ok 'JSON::TypeInference::Type::Null';
require_ok 'JSON::TypeInference::Type::Number';
require_ok 'JSON::TypeInference::Type::Object';
require_ok 'JSON::TypeInference::Type::String';
require_ok 'JSON::TypeInference::Type::Union';
require_ok 'JSON::TypeInference::Type::Unknown';
subtest '#signature' => sub {
subtest 'array' => sub {
my $string = JSON::TypeInference::Type::String->new;
my $string_array = JSON::TypeInference::Type::Array->new($string);
is $string_array->signature, 'array[string]';
};
subtest 'boolean' => sub {
my $boolean = JSON::TypeInference::Type::Boolean->new;
is $boolean->signature, 'boolean';
};
subtest 'maybe' => sub {
my $string = JSON::TypeInference::Type::String->new;
my $maybe_string = JSON::TypeInference::Type::Maybe->new($string);
is $maybe_string->signature, 'maybe[string]';
};
subtest 'null' => sub {
my $null = JSON::TypeInference::Type::Null->new;
is $null->signature, 'null';
};
subtest 'number' => sub {
my $number = JSON::TypeInference::Type::Number->new;
is $number->signature, 'number';
};
subtest 'object' => sub {
my $string = JSON::TypeInference::Type::String->new;
my $number = JSON::TypeInference::Type::Number->new;
my $object = JSON::TypeInference::Type::Object->new({ name => $string, id => $number });
is $object->signature, 'object[id:number, name:string]';
};
subtest 'string' => sub {
my $string = JSON::TypeInference::Type::String->new;
is $string->signature, 'string';
};
subtest 'union' => sub {
my $string = JSON::TypeInference::Type::String->new;
my $number = JSON::TypeInference::Type::Number->new;
my $string_or_number = JSON::TypeInference::Type::Union->new($string, $number);
is $string_or_number->signature, 'number|string';
};
subtest 'unknown' => sub {
my $unknown = JSON::TypeInference::Type::Unknown->new;
is $unknown->signature, 'unknown';
};
};
subtest '#accepts' => sub {
subtest 'string' => sub {
ok + JSON::TypeInference::Type::String->accepts('a');
ok ! JSON::TypeInference::Type::String->accepts(1);
ok ! JSON::TypeInference::Type::String->accepts(\1);
ok ! JSON::TypeInference::Type::String->accepts(\0);
ok ! JSON::TypeInference::Type::String->accepts([]);
ok ! JSON::TypeInference::Type::String->accepts({});
ok ! JSON::TypeInference::Type::String->accepts(undef);
};
subtest 'number' => sub {
ok ! JSON::TypeInference::Type::Number->accepts('a');
ok + JSON::TypeInference::Type::Number->accepts(1);
ok ! JSON::TypeInference::Type::Number->accepts(\1);
ok ! JSON::TypeInference::Type::Number->accepts(\0);
ok ! JSON::TypeInference::Type::Number->accepts([]);
ok ! JSON::TypeInference::Type::Number->accepts({});
ok ! JSON::TypeInference::Type::Number->accepts(undef);
};
subtest 'null' => sub {
ok ! JSON::TypeInference::Type::Null->accepts('a');
ok ! JSON::TypeInference::Type::Null->accepts(1);
ok ! JSON::TypeInference::Type::Null->accepts(\1);
ok ! JSON::TypeInference::Type::Null->accepts(\0);
ok ! JSON::TypeInference::Type::Null->accepts([]);
ok ! JSON::TypeInference::Type::Null->accepts({});
ok + JSON::TypeInference::Type::Null->accepts(undef);
};
subtest 'array' => sub {
ok ! JSON::TypeInference::Type::Array->accepts('a');
ok ! JSON::TypeInference::Type::Array->accepts(1);
ok ! JSON::TypeInference::Type::Array->accepts(\1);
ok ! JSON::TypeInference::Type::Array->accepts(\0);
ok + JSON::TypeInference::Type::Array->accepts([]);
ok ! JSON::TypeInference::Type::Array->accepts({});
ok ! JSON::TypeInference::Type::Array->accepts(undef);
};
subtest 'object' => sub {
ok ! JSON::TypeInference::Type::Object->accepts('a');
ok ! JSON::TypeInference::Type::Object->accepts(1);
ok ! JSON::TypeInference::Type::Object->accepts(\1);
ok ! JSON::TypeInference::Type::Object->accepts(\0);
ok ! JSON::TypeInference::Type::Object->accepts([]);
ok + JSON::TypeInference::Type::Object->accepts({});
ok ! JSON::TypeInference::Type::Object->accepts(undef);
};
subtest 'boolean' => sub {
ok ! JSON::TypeInference::Type::Boolean->accepts('a');
ok ! JSON::TypeInference::Type::Boolean->accepts(1);
ok ! JSON::TypeInference::Type::Boolean->accepts(\(my $str = 'str'));
ok + JSON::TypeInference::Type::Boolean->accepts(Types::Serialiser::true);
ok + JSON::TypeInference::Type::Boolean->accepts(Types::Serialiser::false);
ok ! JSON::TypeInference::Type::Boolean->accepts([]);
ok ! JSON::TypeInference::Type::Boolean->accepts({});
ok ! JSON::TypeInference::Type::Boolean->accepts(undef);
};
subtest 'maybe' => sub {
ok ! JSON::TypeInference::Type::Maybe->accepts('a');
ok ! JSON::TypeInference::Type::Maybe->accepts(1);
ok ! JSON::TypeInference::Type::Maybe->accepts(\1);
ok ! JSON::TypeInference::Type::Maybe->accepts(\0);
ok ! JSON::TypeInference::Type::Maybe->accepts([]);
ok ! JSON::TypeInference::Type::Maybe->accepts({});
ok ! JSON::TypeInference::Type::Maybe->accepts(undef);
};
subtest 'union' => sub {
ok ! JSON::TypeInference::Type::Union->accepts('a');
ok ! JSON::TypeInference::Type::Union->accepts(1);
ok ! JSON::TypeInference::Type::Union->accepts(\1);
ok ! JSON::TypeInference::Type::Union->accepts(\0);
ok ! JSON::TypeInference::Type::Union->accepts([]);
ok ! JSON::TypeInference::Type::Union->accepts({});
ok ! JSON::TypeInference::Type::Union->accepts(undef);
};
subtest 'unknown' => sub {
ok ! JSON::TypeInference::Type::Unknown->accepts('a');
ok ! JSON::TypeInference::Type::Unknown->accepts(1);
ok ! JSON::TypeInference::Type::Unknown->accepts(\1);
ok ! JSON::TypeInference::Type::Unknown->accepts(\0);
ok ! JSON::TypeInference::Type::Unknown->accepts([]);
ok ! JSON::TypeInference::Type::Unknown->accepts({});
ok ! JSON::TypeInference::Type::Unknown->accepts(undef);
};
};
done_testing;