The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;
use Test::More tests=>17;
eval {
	require Test::NoWarnings;
	Test::NoWarnings->import();
	1;
} or do {
	SKIP: {
		skip "Test::NoWarnings is not installed", 1;
	};
};
require_ok("Tie::Proxy::Changes");

require Tie::Proxy::Changes;

my $newvalue;

#We don't need a real tied thing to test this, just fake one.

sub STORE {
    my $self=shift;
    my $s=shift;
    $newvalue=undef;
    if ($s eq "secret") {
        $newvalue=shift;
        pass("STORE call recived") ;
    }
    else {
        fail("Something went wrong: recived $s instead of the secret phrase");
    }

}

my $x = bless {},"main";

my $t=Tie::Proxy::Changes->new($x,"secret");
$t->{FOO}="Bar";
is_deeply($newvalue,{FOO=>"Bar"},"Without data");
my $s=Tie::Proxy::Changes->new($x,"secret",{test=>1});
if ($s->{test}) {
    $s->{test}=2;
}
is_deeply($newvalue,{test=>2},"With hash data");

my $a=Tie::Proxy::Changes->new($x,"secret",[1,2]);
push @{$a},3;
is_deeply($newvalue,[1,2,3],"With array data");

my $autovivify=Tie::Proxy::Changes->new($x,"secret");
$autovivify->{XXX}->{YYY}->[1]="ZZZ";
is_deeply($newvalue,{XXX=>{YYY=>[undef,"ZZZ"]}},"autovivify");

my $multilevel=Tie::Proxy::Changes->new($x,"secret",{XXX=>{YYY=>[undef,"ZZZ"]}});
$multilevel->{XXX}->{YYY}->[0]="WWW";
is_deeply($newvalue,{XXX=>{YYY=>["WWW","ZZZ"]}},"multilevel");

my $var="";

my $scalar=Tie::Proxy::Changes->new($x,"secret",{foo=>\$var});
${$scalar->{foo}}="BAR";
is($var,"BAR","scalar");

my $hash={R=>"T"};
my $scalarmulti=Tie::Proxy::Changes->new($x,"secret",{foo=>\$hash});
${$scalarmulti->{foo}}->{R}="V";
is_deeply($newvalue,{foo=>\{R=>"V"}},"scalar multilevel");
is_deeply($hash,{R=>"V"},"scalar multilevel changed the reference");