3 # Tests for @{^COMPILE_SCOPE_CONTAINER}
7 use Test::More tests => 12;
11 # this has to be a full glob alias, since the GvAV gets replaced
12 *COMPILE_SCOPE_CONTAINER = \*XS::APItest::COMPILE_SCOPE_CONTAINER;
14 our @COMPILE_SCOPE_CONTAINER;
19 package CounterObject;
22 my ($class, $name) = @_;
23 return bless { name => $name }, $class;
33 $destroyed{ $self->name }++;
37 package ReplaceCounter;
38 $INC{'ReplaceCounter.pm'} = __FILE__;
41 my ($self, $counter) = @_;
42 $COMPILE_SCOPE_CONTAINER[-1] = CounterObject->new($counter);
45 package InstallCounter;
46 $INC{'InstallCounter.pm'} = __FILE__;
49 my ($class, $counter) = @_;
50 push @COMPILE_SCOPE_CONTAINER, CounterObject->new($counter);
54 $INC{'TestCounter.pm'} = __FILE__;
57 my ($class, $counter, $number, $message) = @_;
60 unless defined $number;
61 $message = "counter $counter is found $number times"
62 unless defined $message;
64 ::is scalar(grep { $_->name eq $counter } @{COMPILE_SCOPE_CONTAINER}),
71 use InstallCounter 'root';
72 use InstallCounter '3rd-party';
75 BEGIN { ok(!keys %destroyed, 'nothing destroyed yet'); }
77 use ReplaceCounter 'replace';
79 BEGIN { ok(!keys %destroyed, 'nothing destroyed yet'); }
81 use TestCounter '3rd-party', 0, '3rd-party no longer visible';
82 use TestCounter 'replace', 1, 'replacement now visible';
83 use TestCounter 'root';
85 BEGIN { ok(!keys %destroyed, 'nothing destroyed yet'); }
89 ok $destroyed{replace}, 'replacement has been destroyed after end of outer scope';
92 use TestCounter 'root', 1, 'root visible again';
93 use TestCounter 'replace', 0, 'lower replacement no longer visible';
94 use TestCounter '3rd-party';
97 ok $destroyed{ $_ }, "$_ has been destroyed after end of outer scope"
98 for 'root', '3rd-party';