Move Attribute::Handlers from lib to ext. The layout in ext is the same as the
[p5sagit/p5-mst-13.2.git] / ext / Attribute-Handlers / t / multi.t
CommitLineData
cab6c672 1#!perl
2
3BEGIN {
4 if ($ENV{PERL_CORE}) {
5 chdir 't' if -d 't';
6 @INC = '../lib';
7 }
8}
9
0e9b9e0c 10END {print "not ok 1\n" unless $loaded;}
11use v5.6.0;
12use Attribute::Handlers;
13$loaded = 1;
14
15CHECK { $main::phase++ }
16
17######################### End of black magic.
18
19# Insert your test code below (better if it prints "ok 13"
20# (correspondingly "not ok 13") depending on the success of chunk 13
21# of the test code):
22
d473d728 23sub ok { $::count++; push @::results, [$_[1], $_[0]?"":"not ", defined($_[2])?$_[2]:""]; }
0e9b9e0c 24
25END { print "1..$::count\n";
d473d728 26 print map "$_->[1]ok $_->[0] $_->[2]\n",
0e9b9e0c 27 sort {$a->[0]<=>$b->[0]}
28 grep $_->[0], @::results }
29
30package Test;
31use warnings;
32no warnings 'redefine';
33
34sub UNIVERSAL::Lastly :ATTR(INIT) { ::ok $_[4][0] && $main::phase, $_[4][1] }
35
36sub UNIVERSAL::Okay :ATTR(BEGIN) {
37::ok $_[4][0] && (!$main::phase || !ref $_[1] && $_[1] eq 'LEXICAL'), $_[4][1];
38}
39
40sub Dokay :ATTR(SCALAR) { ::ok @{$_[4]} }
41sub Dokay :ATTR(HASH) { ::ok @{$_[4]} }
42sub Dokay :ATTR(ARRAY) { ::ok @{$_[4]} }
43sub Dokay :ATTR(CODE) { ::ok @{$_[4]} }
44
45sub Vokay :ATTR(VAR) { ::ok @{$_[4]} }
46
47sub Aokay :ATTR(ANY) { ::ok @{$_[4]} }
48
49package main;
50use warnings;
51
52my $x1 :Lastly(1,41);
53my @x1 :Lastly(1=>42);
54my %x1 :Lastly(1,43);
55sub x1 :Lastly(1,44) {}
56
57my Test $x2 :Dokay(1,5);
58
59package Test;
60my $x3 :Dokay(1,6);
61my Test $x4 :Dokay(1,7);
62sub x3 :Dokay(1,8) {}
63
64my $y1 :Okay(1,9);
65my @y1 :Okay(1,10);
66my %y1 :Okay(1,11);
67sub y1 :Okay(1,12) {}
68
69my $y2 :Vokay(1,13);
70my @y2 :Vokay(1,14);
71my %y2 :Vokay(1,15);
72# BEGIN {eval 'sub y2 :Vokay(0,16) {}; 1' or
73::ok(1,16);
74# }
75
76my $z :Aokay(1,17);
77my @z :Aokay(1,18);
78my %z :Aokay(1,19);
79sub z :Aokay(1,20) {};
80
81package DerTest;
82use base 'Test';
83use warnings;
84
85my $x5 :Dokay(1,21);
86my Test $x6 :Dokay(1,22);
87sub x5 :Dokay(1,23);
88
89my $y3 :Okay(1,24);
90my @y3 :Okay(1,25);
91my %y3 :Okay(1,26);
92sub y3 :Okay(1,27) {}
93
94package Unrelated;
95
96my $x11 :Okay(1,1);
97my @x11 :Okay(1=>2);
98my %x11 :Okay(1,3);
99sub x11 :Okay(1,4) {}
100
101BEGIN { eval 'my $x7 :Dokay(0,28)' or ::ok(1,28); }
102my Test $x8 :Dokay(1,29);
103eval 'sub x7 :Dokay(0,30) {}' or ::ok(1,30);
104
105
106package Tie::Loud;
107
108sub TIESCALAR { ::ok(1,31); bless {}, $_[0] }
109sub FETCH { ::ok(1,32); return 1 }
110sub STORE { ::ok(1,33); return 1 }
111
112package Tie::Noisy;
113
114sub TIEARRAY { ::ok(1,$_[1]); bless {}, $_[0] }
115sub FETCH { ::ok(1,35); return 1 }
116sub STORE { ::ok(1,36); return 1 }
117sub FETCHSIZE { 100 }
118
119package Tie::Row::dy;
120
121sub TIEHASH { ::ok(1,$_[1]); bless {}, $_[0] }
122sub FETCH { ::ok(1,38); return 1 }
123sub STORE { ::ok(1,39); return 1 }
124
125package main;
126
127eval 'sub x7 :ATTR(SCALAR) :ATTR(CODE) {}' and ::ok(0,40) or ::ok(1,40);
128
129use Attribute::Handlers autotie => { Other::Loud => Tie::Loud,
130 Noisy => Tie::Noisy,
131 UNIVERSAL::Rowdy => Tie::Row::dy,
132 };
133
134my Other $loud : Loud;
135$loud++;
136
137my @noisy : Noisy(34);
138$noisy[0]++;
139
140my %rowdy : Rowdy(37,'this arg should be ignored');
141$rowdy{key}++;
142
18880e27 143
144# check that applying attributes to lexicals doesn't unduly worry
145# their refcounts
146my $out = "begin\n";
147my $applied;
148sub UNIVERSAL::Dummy :ATTR { ++$applied };
149sub Dummy::DESTROY { $out .= "bye\n" }
150
151{ my $dummy; $dummy = bless {}, 'Dummy'; }
152ok( $out eq "begin\nbye\n", 45 );
153
154{ my $dummy : Dummy; $dummy = bless {}, 'Dummy'; }
d473d728 155if($] < 5.008) {
156ok( 1, 46, " # skip lexicals are not runtime prior to 5.8");
157} else {
158ok( $out eq "begin\nbye\nbye\n", 46);
159}
18880e27 160# are lexical attributes reapplied correctly?
161sub dummy { my $dummy : Dummy; }
162$applied = 0;
163dummy(); dummy();
448fed50 164if($] < 5.008) {
d473d728 165ok(1, 47, " # skip does not work with perl prior to 5.8");
448fed50 166} else {
18880e27 167ok( $applied == 2, 47 );
448fed50 168}
18880e27 169# 45-47 again, but for our variables
170$out = "begin\n";
171{ our $dummy; $dummy = bless {}, 'Dummy'; }
172ok( $out eq "begin\n", 48 );
448fed50 173{ no warnings; our $dummy : Dummy; $dummy = bless {}, 'Dummy'; }
18880e27 174ok( $out eq "begin\nbye\n", 49 );
175undef $::dummy;
176ok( $out eq "begin\nbye\nbye\n", 50 );
177
178# are lexical attributes reapplied correctly?
448fed50 179sub dummy_our { no warnings; our $banjo : Dummy; }
18880e27 180$applied = 0;
181dummy_our(); dummy_our();
182ok( $applied == 0, 51 );
24952a9c 183
184sub UNIVERSAL::Stooge :ATTR(END) {};
185eval {
186 local $SIG{__WARN__} = sub { die @_ };
187 my $groucho : Stooge;
188};
189my $match = $@ =~ /^Won't be able to apply END handler/;
448fed50 190if($] < 5.008) {
d473d728 191ok(1,52 ,"# Skip, no difference between lexical handlers and normal handlers prior to 5.8");
448fed50 192} else {
24952a9c 193ok( $match, 52 );
448fed50 194}
195
c760c918 196
197# The next two check for the phase invariance that Marcel spotted.
198# Subject: Attribute::Handlers phase variance
199# Message-Id: <54EDDB80-FD75-11D6-A18D-00039379E28A@noug.at>
200
201my ($code_applied, $scalar_applied);
202sub Scotty :ATTR(CODE,BEGIN) { $code_applied = $_[5] }
203{
204no warnings 'redefine';
205sub Scotty :ATTR(SCALAR,CHECK) { $scalar_applied = $_[5] }
206}
207
208sub warp_coil :Scotty {}
209my $photon_torpedo :Scotty;
210
211ok( $code_applied eq 'BEGIN', 53, "# phase variance" );
212ok( $scalar_applied eq 'CHECK', 54 );