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

use strict;
use warnings;
use Test::More tests => 36;

use lib './t';
do 'testlib.pm';

use Data::ModeMerge;

merge_is  ({"+a"=>2}, {"+a"=>7}, {"+a"=>9 }, 'add+add');
merge_fail({"+a"=>2}, {".a"=>7},             'add+concat');
merge_is  ({"+a"=>2}, {"!a"=>7}, {        }, 'add+delete');
merge_fail({"+a"=>2}, {"^a"=>7},             'add+keep');
merge_is  ({"+a"=>2}, {"*a"=>7}, { "a"=>7 }, 'add+normal');
merge_is  ({"+a"=>2}, {"-a"=>7}, {"+a"=>-5}, 'add+subtract');

merge_fail({".a"=>2}, {"+a"=>7},             'concat+add');
merge_is  ({".a"=>2}, {".a"=>7}, {".a"=>27}, 'concat+concat');
merge_is  ({".a"=>2}, {"!a"=>7}, {        }, 'concat+delete');
merge_fail({".a"=>2}, {"^a"=>7},             'concat+keep');
merge_is  ({".a"=>2}, {"*a"=>7}, { "a"=>7 }, 'concat+normal');
merge_fail({".a"=>2}, {"-a"=>7},             'concat+subtract');

merge_is  ({"!a"=>2}, {"+a"=>7}, {"+a"=>7 }, 'delete+add');
merge_is  ({"!a"=>2}, {".a"=>7}, {".a"=>7 }, 'delete+concat');
merge_is  ({"!a"=>2}, {"!a"=>7}, {        }, 'delete+delete');
merge_is  ({"!a"=>2}, {"^a"=>7}, {"^a"=>7 }, 'delete+keep');
merge_is  ({"!a"=>2}, {"*a"=>7}, { "a"=>7 }, 'delete+normal');
merge_is  ({"!a"=>2}, {"-a"=>7}, {"-a"=>7 }, 'delete+subtract');

merge_is  ({"^a"=>2}, {"+a"=>7}, {"^a"=>2 }, 'keep+add');
merge_is  ({"^a"=>2}, {".a"=>7}, {"^a"=>2 }, 'keep+concat');
merge_is  ({"^a"=>2}, {"!a"=>7}, {"^a"=>2 }, 'keep+delete');
merge_is  ({"^a"=>2}, {"^a"=>7}, {"^a"=>2 }, 'keep+keep');
merge_is  ({"^a"=>2}, {"*a"=>7}, {"^a"=>2 }, 'keep+normal');
merge_is  ({"^a"=>2}, {"-a"=>7}, {"^a"=>2 }, 'keep+subtract');

merge_is  ({"*a"=>2}, {"+a"=>7}, { "a"=>9 }, 'normal+add');
merge_is  ({"*a"=>2}, {".a"=>7}, { "a"=>27}, 'normal+concat');
merge_is  ({"*a"=>2}, {"!a"=>7}, {        }, 'normal+delete');
merge_is  ({"*a"=>2}, {"^a"=>7}, {"^a"=>7 }, 'normal+keep');
merge_is  ({"*a"=>2}, {"*a"=>7}, { "a"=>7 }, 'normal+normal');
merge_is  ({"*a"=>2}, {"-a"=>7}, { "a"=>-5}, 'normal+subtract');

merge_is  ({"-a"=>2}, {"+a"=>7}, {"-a"=>-5}, 'subtract+add');
merge_fail({"-a"=>2}, {".a"=>7},             'subtract+concat');
merge_is  ({"-a"=>2}, {"!a"=>7}, {        }, 'subtract+delete');
merge_fail({"-a"=>2}, {"^a"=>7},             'subtract+keep');
merge_is  ({"-a"=>2}, {"*a"=>7}, { "a"=>7 }, 'subtract+normal');
merge_is  ({"-a"=>2}, {"-a"=>7}, {"-a"=>9 }, 'subtract+subtract');