The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl

use 5.010;
use strict;
use warnings;

use Test::More 0.98;
use Test::Perinci::Sub::Wrapper qw(test_wrap);

test_wrap(
    name => 'internal properties are ignored',
    wrap_args => {sub=>{}, meta=>{v=>1.1, _foo=>1}},
);

subtest 'double wrapping' => sub {
    my $meta;
    test_wrap(
        name => 'wrap 1',
        wrap_args => {sub=>{}, meta=>{v=>1.1}},
        posttest => sub {
            my ($wrap_res, $call_res) = @_;
            $meta = $wrap_res->[2]{meta};
            my $log = $meta->{"x.perinci.sub.wrapper.logs"};
            ok($log->[-1]{normalize_schema}, "normalize_schema is by default 1");
            ok($log->[-1]{validate_args}   , "validate_args is by default 1");
            ok($log->[-1]{validate_result} , "validate_result is by default 1");
        },
    );
    test_wrap(
        name => 'second wrapping',
        wrap_args => {sub=>{}, meta=>$meta},
        posttest => sub {
            my ($wrap_res, $call_res) = @_;
            $meta = $wrap_res->[2]{meta};
            my $log = $meta->{"x.perinci.sub.wrapper.logs"};
            is(~~@$log, 2, "there are two log entries");
            ok(!$log->[-1]{normalize_schema}, "normalize_schema is by default 0");
            ok(!$log->[-1]{validate_args}   , "validate_args is by default 0");
            ok(!$log->[-1]{validate_result} , "validate_result is by default 0");
        },
    );
};

subtest "meta attribute 'x.perinci.sub.wrapper.disable_validate_args'" => sub {
    test_wrap(
        name => "meta attribute 'x.perinci.sub.wrapper.disable_validate_args' is consulted",
        wrap_args => {sub=>{}, meta=>{v=>1.1, 'x.perinci.sub.wrapper.disable_validate_args'=>1}},
        posttest => sub {
            my ($wrap_res, $call_res) = @_;
            my $meta = $wrap_res->[2]{meta};
            my $log = $meta->{"x.perinci.sub.wrapper.logs"};
            ok(!$log->[-1]{validate_args}, "validate_args is 0");
        },
    );
};

subtest "meta attribute 'x.perinci.sub.wrapper.disable_validate_result'" => sub {
    my $meta;
    test_wrap(
        name => "meta attribute 'x.perinci.sub.wrapper.disable_validate_result' is consulted",
        wrap_args => {sub=>{}, meta=>{v=>1.1, 'x.perinci.sub.wrapper.disable_validate_result'=>1}},
        posttest => sub {
            my ($wrap_res, $call_res) = @_;
            $meta = $wrap_res->[2]{meta};
            my $log = $meta->{"x.perinci.sub.wrapper.logs"};
            ok(!$log->[-1]{validate_result}, "validate_result is 0");
        },
    );
};

# XXX test function returns result metadata stream=>1 (even though result/stream => 0)

DONE_TESTING:
done_testing;