Data-Overlay

 view release on metacpan or  search on metacpan

t/actions.t  view on Meta::CPAN

use strict;
use warnings;

use Test::More;
use Test::Deep;
use Data::Overlay qw(overlay overlay_all);
use FindBin;
use lib "$FindBin::Bin/inc";
use Data::Overlay::Test qw(olok dt);

# olok is overlay ok
# dt is dump terse

=for debugging
perl -Ilib -MYAML::XS -MData::Overlay -le 'print "TOP ", Dump ' -e \
    'overlay({a=>2},{a=>{"=defor"=>1}})'
=cut

# =defor
olok({a=>2},{a=>{'=defor'=>1}} => {a=>2});
olok({a=>0},{a=>{'=defor'=>1}} => {a=>0});
olok({a=>''},{a=>{'=or'=>1}} => {a=>1});
olok({a=>undef},{a=>{'=defor'=>1}} => {a=>1});
olok({a=>{b=>2}},{a=>{'=defor'=>1}} => {a=>{b=>2}});

# =or
olok({a=>2},{a=>{'=or'=>1}} => {a=>2});
olok({a=>0},{a=>{'=or'=>1}} => {a=>1});
olok({a=>''},{a=>{'=or'=>1}} => {a=>1});
olok({a=>undef},{a=>{'=or'=>1}} => {a=>1});
olok({a=>{b=>2}},{a=>{'=or'=>1}} => {a=>{b=>2}});

# =defaults
olok({a=>2},{'=defaults'=>{a=>1}} => {a=>2});
olok({a=>0},{'=defaults'=>{a=>1}} => {a=>0});
olok({a=>''},{'=defaults'=>{a=>1}} => {a=>''});
olok({a=>undef},{'=defaults'=>{a=>1}} => {a=>1});
olok({a=>{b=>2}},{'=defaults'=>{a=>1}} => {a=>{b=>2}});
olok({a=>{b=>2}},{'=defaults'=>{c=>1}} => {a=>{b=>2},c=>1});

# =push
olok({a=>[1]},{a=>{'=push'=>2}} => {a=>[1,2]});
olok({a=>[1,2]},{a=>{'=push'=>3}} => {a=>[1,2,3]});
olok({a=>[]},{a=>{'=push'=>1}} => {a=>[1]});
# scalar/non-ARRAY upgrade
olok({a=>1},{a=>{'=push'=>2}} => {a=>[1,2]});
olok({a=>{b=>2}},{a=>{'=push'=>1}} => {a=>[{b=>2},1]});
olok({a=>0},{a=>{'=push'=>1}} => {a=>[0,1]});
olok({a=>''},{a=>{'=push'=>1}} => {a=>['',1]});
olok({a=>undef}, {a=>{'=push'=>1}} => {a=>[undef,1]});
# scalar $old_ds
olok('x', {'=push'=>1} => ['x',1]);
olok('x', {'=push'=>[1,2]} => ['x',1,2]);
# multi-item pushes
olok({a=>[1]},{a=>{'=push'=>[2,3]}} => {a=>[1,2,3]});
olok({a=>[1]},{a=>{'=push'=>[[2,3]]}} => {a=>[1,[2,3]]});
olok({a=>[1]},{a=>{'=push'=>[[2],[3]]}} => {a=>[1,[2],[3]]});

# =push + =defor & =or
olok({a=>[]},{a=>{'=or'=>[],'=push'=>1}} => {a=>[1]});
olok({a=>0},{a=>{'=or'=>[],'=push'=>1}} => {a=>[1]});
olok({a=>''},{a=>{'=or'=>[],'=push'=>1}} => {a=>[1]});
olok({a=>undef},{a=>{'=defor'=>[],'=push'=>1}} => {a=>[1]});

# =pop (value doesn't matter)
olok({a=>[1,2]},{a=>{'=pop'=>''}} => {a=>[1]});
olok({a=>[1,2,3]},{a=>{'=pop'=>''}} => {a=>[1,2]});
olok({a=>[1]},{a=>{'=pop'=>'a'}} => {a=>[]});
olok({a=>[0,1]},{a=>{'=pop'=>1}} => {a=>[0]}); # no auto-downgrade
olok({a=>['',1]},{a=>{'=pop'=>1}} => {a=>['']});
olok({a=>[1,'']},{a=>{'=pop'=>1}} => {a=>[1]});
olok({a=>[undef,1]},{a=>{'=pop'=>1}} => {a=>[undef]});
olok({a=>[1,undef]},{a=>{'=pop'=>1}} => {a=>[1]});
# multi-item pops
olok({a=>[1,2,3]},{a=>{'=pop'=>[2,'*']}} => {a=>[1]});
olok({a=>[1,[2,3]]},{a=>{'=pop'=>['*']}} => {a=>[1]});



( run in 1.556 second using v1.01-cache-2.11-cpan-5837b0d9d2c )