File: 06_tie.t

package info (click to toggle)
libdata-clone-perl 0.006-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 208 kB
  • sloc: perl: 669; makefile: 8; ansic: 5
file content (100 lines) | stat: -rw-r--r-- 2,020 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#!perl -w

use strict;
use warnings FATAL => 'all';

use Test::More;

use Data::Clone;

use Tie::Hash;
use Tie::Array;

use Data::Dumper;
$Data::Dumper::Indent   = 0;
$Data::Dumper::Sortkeys = 1;
$Data::Dumper::Useqq    = 1;

{
    package MyNonclonableHash;
    our @ISA = qw(Tie::StdHash);

    package MyNonclonableArray;
    our @ISA = qw(Tie::StdArray);

    package MyClonableHash;
    use Data::Clone qw(TIECLONE);
    our @ISA = qw(Tie::StdHash);

    package MyClonableArray;
    use Data::Clone qw(TIECLONE);
    our @ISA = qw(Tie::StdArray);
}

# HASH

foreach (1 .. 2){
    note "for HASH ($_)";
    tie my %h, 'MyNonclonableHash';
    $h{foo} = 42;
    $h{bar} = "xyzzy";

    my $c;
    eval{
        local $Data::Clone::ObjectCallback = sub{ die 'Non-clonable object' };
        clone(\%h);
    };
    like $@, qr/Non-clonable object/, 'clone() croaks';

    eval{
        $c = clone(\%h);
    };

    is $@, '';
    is tied(%{$c}), tied(%h), 'sutface copy';
    $c->{foo}++;
    is Dumper($c),  Dumper({ foo => 43, bar => "xyzzy" });
    is Dumper(\%h), Dumper({ foo => 43, bar => "xyzzy" });

    tie %h, 'MyClonableHash';
    $h{foo} = 42;
    $h{bar} = "xyzzy";

    $c = clone(\%h);

    isnt $c, \%h;
    $c->{foo}++;
    is Dumper($c),  Dumper({ foo => 43, bar => "xyzzy" });
    is Dumper(\%h), Dumper({ foo => 42, bar => "xyzzy" });

    # ARRAY
    note("for ARRAY ($_)");
    tie my @a, 'MyNonclonableArray';
    @a = (42, "xyzzy");

    eval{
        local $Data::Clone::ObjectCallback = sub{ die 'Non-clonable object' };
        clone(\@a);
    };
    like $@, qr/Non-clonable object/, 'clone() croaks';

    eval{
        $c = clone(\@a);
    };

    is tied(@{$c}), tied(@a), 'sutface copy';
    $c->[0]++;
    is Dumper($c),  Dumper([43, "xyzzy"]);
    is Dumper(\@a), Dumper([43, "xyzzy"]);

    tie @a, 'MyClonableArray';
    @a = (42, "xyzzy");

    $c = clone(\@a);

    $c->[0]++;
    is Dumper($c),  Dumper([43, "xyzzy"]);
    is Dumper(\@a), Dumper([42, "xyzzy"]);
}

done_testing;