use strict;
use B::Deparse;
use Data::Dumper;
use Test;
use lib qw(./t);
use define WARNINGS => {};
BEGIN {
plan tests => 18;
warn <<___;
**********************************************
*** These tests generate a few warnings. ***
*** Do not be afraid. ***
**********************************************
___
$SIG{__WARN__} = sub {
my ($text) = @_;
if ($text =~ /(constant|constant subroutine) ([\w:]+) redefined/) {
# test BAZ warning
WARNINGS->{$1}{$2}++;
warn $text;
}
else {
warn $text;
}
}
}
use define FOO => 1;
use define BAR => 0;
no define BAZ =>;
use define QUX => 0..10;
use define {
MUX => 1,
MIX => 2,
PIX => 3,
};
# some tests are also in this module
use MyModule1;
use MyModule2;
# simple tests
ok( FOO, 1 );
ok( BAR, 0 );
ok( BAZ, undef );
ok( (QUX)[4], 4 );
ok( MUX + MIX + PIX, 6 );
# no AFTER use
no define GOO =>;
ok( ref GOO, 'MyModule2' );
# no AFTER use in same module
use define ZUM => 1;
no define ZUM =>;
ok( ZUM, 1 );
ok( WARNINGS->{constant}{'main::ZUM'}, 1 );
# use AFTER no.
no define ZOG =>;
# Implementation provides that "no define" does not produce constant
# subroutines, otherwise ZOG would be undef here
ok( ZOG, 1 );
use define ZOG => 1;
ok( ZOG, 1 );
ok( WARNINGS->{constant}{'main::ZOG'}, 1 );
# no "constant subroutine redefined" warnings should have been emitted by Perl
ok( WARNINGS->{'constant subroutine'}, undef );
# check for proper constant folding optimizations
my $deparse = B::Deparse->new();
my $body = $deparse->coderef2text(\&MyModule1::test);
ok( ($body =~ /return 1 \+ BAZ \+ 0;/), 1 );
# check hashref definition style