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