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