Commit | Line | Data |
---|---|---|
8d6d96c1 HS |
1 | #!./perl -w |
2 | ||
3 | BEGIN { | |
8d6d96c1 HS |
4 | chdir 't' if -d 't'; |
5 | @INC = '../lib'; | |
ead3e279 | 6 | require './test.pl'; |
8d6d96c1 HS |
7 | } |
8 | ||
ead3e279 | 9 | use strict; |
8d6d96c1 | 10 | |
8d6d96c1 HS |
11 | tie my $c => 'Tie::Monitor'; |
12 | ||
ead3e279 NC |
13 | sub expected_tie_calls { |
14 | my ($obj, $rexp, $wexp) = @_; | |
15 | local $::Level = $::Level + 1; | |
16 | my ($rgot, $wgot) = $obj->init(); | |
17 | is ($rgot, $rexp); | |
18 | is ($wgot, $wexp); | |
8d6d96c1 HS |
19 | } |
20 | ||
ead3e279 | 21 | # Use ok() instead of is(), cmp_ok() etc, to strictly control number of accesses |
8d6d96c1 | 22 | my($r, $s); |
ead3e279 NC |
23 | ok($r = $c + 0 == 0, 'the thing itself'); |
24 | expected_tie_calls(tied $c, 1, 0); | |
25 | ok($r = "$c" eq '0', 'the thing itself'); | |
26 | expected_tie_calls(tied $c, 1, 0); | |
27 | ||
28 | ok($c . 'x' eq '0x', 'concat'); | |
29 | expected_tie_calls(tied $c, 1, 0); | |
30 | ok('x' . $c eq 'x0', 'concat'); | |
31 | expected_tie_calls(tied $c, 1, 0); | |
8d6d96c1 | 32 | $s = $c . $c; |
ead3e279 NC |
33 | ok($s eq '00', 'concat'); |
34 | expected_tie_calls(tied $c, 2, 0); | |
8d6d96c1 HS |
35 | $r = 'x'; |
36 | $s = $c = $r . 'y'; | |
ead3e279 NC |
37 | ok($s eq 'xy', 'concat'); |
38 | expected_tie_calls(tied $c, 1, 1); | |
8d6d96c1 | 39 | $s = $c = $c . 'x'; |
ead3e279 NC |
40 | ok($s eq '0x', 'concat'); |
41 | expected_tie_calls(tied $c, 2, 1); | |
8d6d96c1 | 42 | $s = $c = 'x' . $c; |
ead3e279 NC |
43 | ok($s eq 'x0', 'concat'); |
44 | expected_tie_calls(tied $c, 2, 1); | |
8d6d96c1 | 45 | $s = $c = $c . $c; |
ead3e279 NC |
46 | ok($s eq '00', 'concat'); |
47 | expected_tie_calls(tied $c, 3, 1); | |
8d6d96c1 | 48 | |
1e968d83 | 49 | $s = chop($c); |
ead3e279 NC |
50 | ok($s eq '0', 'multiple magic in core functions'); |
51 | expected_tie_calls(tied $c, 1, 1); | |
1e968d83 | 52 | |
5cf4b255 | 53 | # was a glob |
ead3e279 | 54 | my $tied_to = tied $c; |
5cf4b255 FC |
55 | $c = *strat; |
56 | $s = $c; | |
ead3e279 NC |
57 | ok($s eq *strat, |
58 | 'Assignment should not ignore magic when the last thing assigned was a glob'); | |
59 | expected_tie_calls($tied_to, 1, 1); | |
5cf4b255 | 60 | |
f64c9ac5 FC |
61 | # A plain *foo should not call get-magic on *foo. |
62 | # This method of scalar-tying an immutable glob relies on details of the | |
63 | # current implementation that are subject to change. This test may need to | |
64 | # be rewritten if they do change. | |
65 | my $tyre = tie $::{gelp} => 'Tie::Monitor'; | |
66 | # Compilation of this eval autovivifies the *gelp glob. | |
67 | eval '$tyre->init(0); () = \*gelp'; | |
68 | my($rgot, $wgot) = $tyre->init(0); | |
ead3e279 NC |
69 | ok($rgot == 0, 'a plain *foo causes no get-magic'); |
70 | ok($wgot == 0, 'a plain *foo causes no set-magic'); | |
f64c9ac5 | 71 | |
ead3e279 | 72 | done_testing(); |
5cf4b255 | 73 | |
8d6d96c1 HS |
74 | # adapted from Tie::Counter by Abigail |
75 | package Tie::Monitor; | |
76 | ||
77 | sub TIESCALAR { | |
78 | my($class, $value) = @_; | |
79 | bless { | |
80 | read => 0, | |
81 | write => 0, | |
82 | values => [ 0 ], | |
83 | }; | |
84 | } | |
85 | ||
86 | sub FETCH { | |
87 | my $self = shift; | |
88 | ++$self->{read}; | |
89 | $self->{values}[$#{ $self->{values} }]; | |
90 | } | |
91 | ||
92 | sub STORE { | |
93 | my($self, $value) = @_; | |
94 | ++$self->{write}; | |
95 | push @{ $self->{values} }, $value; | |
96 | } | |
97 | ||
98 | sub init { | |
99 | my $self = shift; | |
100 | my @results = ($self->{read}, $self->{write}); | |
101 | $self->{read} = $self->{write} = 0; | |
102 | $self->{values} = [ 0 ]; | |
103 | @results; | |
104 | } |