1#!perl 2 3use strict ("subs", "vars", "refs"); 4use warnings ("all"); 5BEGIN { $ENV{CLONE_CHOOSE_PREFERRED_BACKEND} = "Storable"; } 6END { delete $ENV{CLONE_CHOOSE_PREFERRED_BACKEND} } # for VMS 7 8use Scalar::Util qw(refaddr); 9use Test::More; 10 11BEGIN 12{ 13 $ENV{CLONE_CHOOSE_PREFERRED_BACKEND} and eval "use $ENV{CLONE_CHOOSE_PREFERRED_BACKEND}; 1;"; 14 $@ and plan skip_all => "No $ENV{CLONE_CHOOSE_PREFERRED_BACKEND} found."; 15} 16 17use Clone::Choose; 18 19my $hash = { 20 level => 0, 21 href => { 22 level => 1, 23 href => { 24 level => 2, 25 href => {level => 3}, 26 }, 27 }, 28}; 29my $cloned_hash = clone $hash; 30 31ok(refaddr $hash != refaddr $cloned_hash, "Clone depth 0"); 32ok(refaddr($hash->{href}) != refaddr($cloned_hash->{href}), "Clone depth 1"); 33ok(refaddr($hash->{href}->{href}) != refaddr($cloned_hash->{href}->{href}), "Clone depth 2"); 34ok(refaddr($hash->{href}->{href}->{href}) != refaddr($cloned_hash->{href}->{href}->{href}), "Clone depth 3"); 35 36ok($hash->{level} == $cloned_hash->{level}, "Hash value depth 0"); 37ok($hash->{href}->{level} == $cloned_hash->{href}->{level}, "Hash value depth 1"); 38ok($hash->{href}->{href}->{level} == $cloned_hash->{href}->{href}->{level}, "Hash value depth 2"); 39ok($hash->{href}->{href}->{href}->{level} == $cloned_hash->{href}->{href}->{href}->{level}, "Hash value depth 3"); 40 41ok($hash->{level} == 0, "Hash value sanity depth 0"); 42ok($hash->{href}->{level} == 1, "Hash value sanity depth 1"); 43ok($hash->{href}->{href}->{level} == 2, "Hash value sanity depth 2"); 44ok($hash->{href}->{href}->{href}->{level} == 3, "Hash value sanity depth 3"); 45 46my $empty_hash = {}; 47my $cloned_empty_hash = clone $empty_hash; 48 49ok(refaddr $empty_hash != refaddr $cloned_empty_hash, "Empty hash clone"); 50 51done_testing; 52 53 54