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

use lib './t'; require 'testlib.pm';
use strict;
use warnings;
use Test::More tests => 48;
use Data::Schema;

valid  (2,  [int=>{divisible_by=>2}=>{"!divisible_by"=>3}], 'multiple attrhash 2.1');
valid  (3,  [int=>{divisible_by=>2}=>{"!divisible_by"=>3}], 'multiple attrhash 2.2');
valid  (1,  [int=>{divisible_by=>2}=>{"!divisible_by"=>3}], 'multiple attrhash 2.3');
invalid(1.1,[int=>{divisible_by=>2}=>{"!divisible_by"=>3}], 'multiple attrhash 2.4');

valid  (2, [int=>{one_of=>[2]}=>{"+one_of"=>[3]}], 'multiple attrhash 3.1');
valid  (3, [int=>{one_of=>[2]}=>{"+one_of"=>[3]}], 'multiple attrhash 3.2');
invalid(0, [int=>{one_of=>[2]}=>{"+one_of"=>[3]}], 'multiple attrhash 3.3');

invalid(2, [int=>{is=>2}=>{"*is"=>3}], 'multiple attrhash 4.1');
valid  (3, [int=>{is=>2}=>{"*is"=>3}], 'multiple attrhash 4.2');
invalid(0, [int=>{is=>2}=>{"*is"=>3}], 'multiple attrhash 4.3');

invalid(2,  [int=>{'^divisible_by'=>2}=>{"divisible_by"=>3}], 'multiple attrhash 5.1 (keep left attr)');
invalid(3,  [int=>{'^divisible_by'=>2}=>{"divisible_by"=>3}], 'multiple attrhash 5.2 (keep left attr)');
valid  (6,  [int=>{'^divisible_by'=>2}=>{"divisible_by"=>3}], 'multiple attrhash 5.3 (keep left attr)');

valid  (2,  [int=>{'^divisible_by'=>2}=>{"!divisible_by"=>3}], 'multiple attrhash 5.4 (keep left attr)');
invalid(3,  [int=>{'^divisible_by'=>2}=>{"!divisible_by"=>3}], 'multiple attrhash 5.5 (keep left attr)');

my $sch = [
    "hash",
    {  keys =>{a=>"int"  , b=>"int" ,   c =>"int",                   , "^f"=>"int"  ,   g=>"int"   }},
    {"*keys"=>{a=>"array",              c =>"int", d=>"int"          ,  "f"=>"array", "^g"=>"array"}},
    {"*keys"=>{            b=>"hash", "!c"=>"int",         , e=>"int",  "f"=>"hash" ,  "g"=>"hash" , ''=>{}}},
];
invalid({a=>1 }, $sch, 'merge 3: a replaced by 2: invalid');
valid  ({a=>[]}, $sch, 'merge 3: a replaced by 2: valid');
invalid({b=>1 }, $sch, 'merge 3: b replaced by 3: invalid');
valid  ({b=>{}}, $sch, 'merge 3: b replaced by 3: valid');
invalid({c=>1 }, $sch, 'merge 3: c removed by 3');
valid  ({d=>1 }, $sch, 'merge 3: d new from 2');
valid  ({e=>1 }, $sch, 'merge 3: e new from 3');
invalid({f=>[]}, $sch, 'merge 3: f keep from 1: invalid 1');
invalid({f=>{}}, $sch, 'merge 3: f keep from 1: invalid 2');
#valid  ({f=>1 }, $sch, 'merge 3: f keep from 1: valid');
#valid  ({g=>[]}, $sch, 'merge 3: g keep from 2: valid');
#invalid({g=>{}}, $sch, 'merge 3: g keep from 2: invalid 1');
#invalid({g=>1 }, $sch, 'merge 3: g keep from 2: invalid 2');