YAML-PP

 view release on metacpan or  search on metacpan

t/31.schema.t  view on Meta::CPAN



subtest 'invalid-option' => sub {
    eval {
        YAML::PP->new( boolean => $boolean, schema => [qw/ JSON empty=lala /] );
    };
    my $err = $@;
    like($err, qr{Invalid option}, 'Invalid option is fatal');
};

my %loaders = (
    failsafe => $failsafe,
    json => $json,
    core => $core,
    yaml11 => $yaml11,
    json_empty_null => $json_empty_null,
);
my $inf = 0 + 'inf';
my $inf_negative = 0 - 'inf';
my $nan = 0 + 'nan';
diag("inf: $inf -inf: $inf_negative nan: $nan");
my $inf_broken = $inf eq '0';
$inf_broken and diag("inf/nan seem broken, skipping those tests");

my %check = (
    null => sub { not defined $_[0] },
    inf => sub {
        my ($float) = @_;
        return $float eq $inf;
    },
    'inf-neg' => sub {
        my ($float) = @_;
        return $float eq $inf_negative;
    },
    nan => sub {
        my ($float) = @_;
        return $float eq $nan;
    },
);
if ($jsonpp) {
    %check = (
        %check,
        true => sub {
            blessed($_[0]) eq 'JSON::PP::Boolean'
            and $_[0]
        },
        false => sub {
            blessed($_[0]) eq 'JSON::PP::Boolean'
            and not $_[0]
        },
    );
}

my $i = 0;
for my $input (sort keys %$schema_data) {
    my $test_data = $schema_data->{ $input };
#    note("Input: $input");

    for my $schema_names (sort keys %$test_data) {
        note("[$input] Schemas: " . $schema_names);
        my @names = split m/ *, */, $schema_names;
        my $test = $test_data->{ $schema_names };
        for my $name (@names) {
            my $yp = $loaders{ $name };
            my %def;
            @def{ qw/ type data dump /} = @$test;
            next if ($def{type} eq 'bool' and not $jsonpp);
            my $func;
            my $data = $yp->load_string('--- ' . $input);
            my $data_orig = $data; # avoid stringifying original data

            my $flags = B::svref_2object(\$data)->FLAGS;
            my $is_str = $flags & B::SVp_POK;
            my $is_int = $flags & B::SVp_IOK;
            my $is_float = $flags & B::SVp_NOK;

            my $type = $def{type};
            my $label = sprintf "(%s) type %s: load(%s)", $name, $def{type}, $input;
            if ($def{data} =~ m/^([\w-]+)\(\)$/) {
                my $func_name = $1;
                $func = $check{ $func_name };
                my $ok = $func->($data);
                ok($ok, "$label - check $func_name() ok");
            }
            if ($type eq 'str') {
                ok($is_str, "$label is str");
                ok(! $is_int, "$label is not int");
                ok(! $is_float, "$label is not float");

                unless ($func) {
                    cmp_ok($def{data}, 'eq', $data, "$label eq '$def{data}'");
                }
            }
            elsif ($type eq 'int') {
                ok($is_int, "$label is int");
                ok(!$is_str, "$label is not str");

                unless ($func) {
                    cmp_ok($data, '==', $def{data}, "$label == '$def{data}'");
                }
            }
            elsif ($type eq 'float' or $type eq 'inf' or $type eq 'nan') {
                unless ($inf_broken) {
                    ok($is_float, "$label is float");
                    ok(!$is_str, "$label is not str");
                }

                unless ($func) {
                    cmp_ok(sprintf("%.2f", $data), '==', $def{data}, "$label == '$def{data}'");
                }
            }
            elsif ($type eq 'bool' or $type eq 'null') {
            }
            else {
                ok(0, "unknown type $type");
            }

            unless ($inf_broken) {
                my $yaml_dump = $yp->dump_string($data_orig);
                $yaml_dump =~ s/\n\z//;
                cmp_ok($yaml_dump, 'eq', $def{dump}, "$label-dump as expected");



( run in 0.977 second using v1.01-cache-2.11-cpan-71847e10f99 )