xref: /openbsd/gnu/usr.bin/perl/dist/base/t/base.t (revision 5759b3d2)
1b39c5158Smillert#!/usr/bin/perl -w
2b39c5158Smillert
3b39c5158Smillertuse strict;
46fb12b70Safresh1use Test::More tests => 15;
5b39c5158Smillert
6b39c5158Smillertuse_ok('base');
7b39c5158Smillert
8b39c5158Smillert
9b39c5158Smillertpackage No::Version;
10b39c5158Smillert
11*5759b3d2Safresh1our $Foo;
12b39c5158Smillertsub VERSION { 42 }
13b39c5158Smillert
14b39c5158Smillertpackage Test::Version;
15b39c5158Smillert
16b39c5158Smillertuse base qw(No::Version);
17898184e3Ssthen::ok( ! defined $No::Version::VERSION, '$VERSION bug' );
18b39c5158Smillert
19b39c5158Smillert# Test Inverse of $VERSION bug base.pm should not clobber existing $VERSION
20b39c5158Smillertpackage Has::Version;
21b39c5158Smillert
22b39c5158SmillertBEGIN { $Has::Version::VERSION = '42' };
23b39c5158Smillert
24b39c5158Smillertpackage Test::Version2;
25b39c5158Smillert
26b39c5158Smillertuse base qw(Has::Version);
27b39c5158Smillert::is( $Has::Version::VERSION, 42 );
28b39c5158Smillert
29b39c5158Smillertpackage main;
30b39c5158Smillert
31b39c5158Smillertmy $eval1 = q{
32b39c5158Smillert  {
33b39c5158Smillert    package Eval1;
34b39c5158Smillert    {
35b39c5158Smillert      package Eval2;
36b39c5158Smillert      use base 'Eval1';
37b39c5158Smillert      $Eval2::VERSION = "1.02";
38b39c5158Smillert    }
39b39c5158Smillert    $Eval1::VERSION = "1.01";
40b39c5158Smillert  }
41b39c5158Smillert};
42b39c5158Smillert
43b39c5158Smillerteval $eval1;
44b39c5158Smillertis( $@, '' );
45b39c5158Smillert
46b39c5158Smillertis( $Eval1::VERSION, 1.01 );
47b39c5158Smillert
48b39c5158Smillertis( $Eval2::VERSION, 1.02 );
49b39c5158Smillert
50b39c5158Smillert
51b39c5158Smillerteval q{use base 'reallyReAlLyNotexists'};
52b39c5158Smillertlike( $@, qr/^Base class package "reallyReAlLyNotexists" is empty\./,
53b39c5158Smillert                                          'base with empty package');
54b39c5158Smillert
55b39c5158Smillerteval q{use base 'reallyReAlLyNotexists'};
56b39c5158Smillertlike( $@, qr/^Base class package "reallyReAlLyNotexists" is empty\./,
57b39c5158Smillert                                          '  still empty on 2nd load');
58b39c5158Smillert{
59b39c5158Smillert    my $warning;
60b39c5158Smillert    local $SIG{__WARN__} = sub { $warning = shift };
61b39c5158Smillert    eval q{package HomoGenous; use base 'HomoGenous';};
62b39c5158Smillert    like($warning, qr/^Class 'HomoGenous' tried to inherit from itself/,
63b39c5158Smillert                                          '  self-inheriting');
64b39c5158Smillert}
65b39c5158Smillert
66b39c5158Smillert{
67b39c5158Smillert    BEGIN { $Has::Version_0::VERSION = 0 }
68b39c5158Smillert
69b39c5158Smillert    package Test::Version3;
70b39c5158Smillert
71b39c5158Smillert    use base qw(Has::Version_0);
72b39c5158Smillert    ::is( $Has::Version_0::VERSION, 0, '$VERSION==0 preserved' );
73b39c5158Smillert}
74b39c5158Smillert
75b39c5158Smillert
76b39c5158Smillert{
77b39c5158Smillert    package Schlozhauer;
78b39c5158Smillert    use constant FIELDS => 6;
79b39c5158Smillert
80b39c5158Smillert    package Basilisco;
81b39c5158Smillert    eval q{ use base 'Schlozhauer' };
82b39c5158Smillert    ::is( $@, '', 'Can coexist with a FIELDS constant' );
83b39c5158Smillert}
846fb12b70Safresh1
856fb12b70Safresh1{
866fb12b70Safresh1    use lib 't/lib';
876fb12b70Safresh1    package UsingBroken;
886fb12b70Safresh1    eval q{use base 'Broken';};
896fb12b70Safresh1    ::like( $@, qr/^Can't locate ThisModuleDoesNotExist\.pm/,
906fb12b70Safresh1        'base fails to compile by loading nonexistent module');
916fb12b70Safresh1}
926fb12b70Safresh1
936fb12b70Safresh1SKIP: {
946fb12b70Safresh1    skip "unicode not supported on perl $]", 2 if $] < 5.008;
956fb12b70Safresh1    eval q{
966fb12b70Safresh1        package UsingUnicode;
976fb12b70Safresh1        my $base = "M\N{U+00D8}dule";
986fb12b70Safresh1        no strict 'refs';
996fb12b70Safresh1        *{"${base}::foo"} = sub {};
1006fb12b70Safresh1        eval q{use base $base;};
1016fb12b70Safresh1        ::is( $@, '', 'nonexistent unicode module allowed');
1026fb12b70Safresh1    };
1036fb12b70Safresh1
1046fb12b70Safresh1    eval q{
1056fb12b70Safresh1        package UsingUtf8;
1066fb12b70Safresh1        my $base = "M\N{U+00D8}dule";
1076fb12b70Safresh1        utf8::encode($base);
1086fb12b70Safresh1        no strict 'refs';
1096fb12b70Safresh1        *{"${base}::foo"} = sub {};
1106fb12b70Safresh1        eval q{use base $base;};
1116fb12b70Safresh1        ::is( $@, '', 'nonexistent utf8 module allowed');
1126fb12b70Safresh1    };
1136fb12b70Safresh1}
1146fb12b70Safresh1
1156fb12b70Safresh1{
1166fb12b70Safresh1    package WithHostileINC;
1176fb12b70Safresh1    local @INC = (@INC, "a\nb");
1186fb12b70Safresh1    my $base = "NonExistentModule";
1196fb12b70Safresh1    no strict 'refs';
1206fb12b70Safresh1    *{"${base}::foo"} = sub {};
1216fb12b70Safresh1    eval q{use base $base;};
1226fb12b70Safresh1    ::is( $@, '', 'nonexistent module allowed when @INC has hostile entries');
1236fb12b70Safresh1}
124