summaryrefslogtreecommitdiff
path: root/t/uni/universal.t
diff options
context:
space:
mode:
Diffstat (limited to 't/uni/universal.t')
-rw-r--r--t/uni/universal.t177
1 files changed, 177 insertions, 0 deletions
diff --git a/t/uni/universal.t b/t/uni/universal.t
new file mode 100644
index 0000000000..c53f85382f
--- /dev/null
+++ b/t/uni/universal.t
@@ -0,0 +1,177 @@
+#!./perl
+#
+# check UNIVERSAL
+#
+
+BEGIN {
+ chdir 't' if -d 't';
+ @INC = '../lib';
+ $| = 1;
+ require "./test.pl";
+}
+
+use utf8;
+use open qw( :utf8 :std );
+
+plan tests => 93;
+
+$a = {};
+bless $a, "Bòb";
+ok $a->isa("Bòb");
+
+package Hùmàn;
+sub èàt {}
+
+package Fèmàlè;
+@ISA=qw(Hùmàn);
+
+package Àlìcè;
+@ISA=qw(Bòb Fèmàlè);
+sub sìng;
+sub drìnk { return "drinking " . $_[1] }
+sub nèw { bless {} }
+
+$Àlìcè::VERSION = 2.718;
+
+{
+ package Cèdrìc;
+ our @ISA;
+ use base qw(Hùmàn);
+}
+
+{
+ package Prògràmmèr;
+ our $VERSION = 1.667;
+
+ sub wrìtè_perl { 1 }
+}
+
+package main;
+
+$a = nèw Àlìcè;
+
+ok $a->isa("Àlìcè");
+TODO: {
+ local $TODO = "mro";
+ ok $a->isa("main::Àlìcè"); # check that alternate class names work
+}
+ok(("main::Àlìcè"->nèw)->isa("Àlìcè"));
+
+ok $a->isa("Bòb");
+TODO: {
+ local $TODO = "mro";
+ ok $a->isa("main::Bòb");
+}
+
+ok $a->isa("Fèmàlè");
+
+ok $a->isa("Hùmàn");
+
+ok ! $a->isa("Màlè");
+
+ok ! $a->isa('Prògràmmèr');
+
+ok $a->isa("HASH");
+
+ok $a->can("èàt");
+ok ! $a->can("sleep");
+ok my $ref = $a->can("drìnk"); # returns a coderef
+is $a->$ref("tèà"), "drinking tèà"; # ... which works
+ok $ref = $a->can("sìng");
+eval { $a->$ref() };
+ok $@; # ... but not if no actual subroutine
+
+ok $a->can("VERSION");
+cmp_ok eval { $a->VERSION }, '==', 2.718;
+ok ! (eval { $a->VERSION(2.719) });
+like $@, qr/^Àlìcè version 2.719 required--this is only version 2.718 at /u;
+
+ok (!Cèdrìc->isa('Prògràmmèr'));
+
+ok (Cèdrìc->isa('Hùmàn'));
+
+push(@Cèdrìc::ISA,'Prògràmmèr');
+
+ok (Cèdrìc->isa('Prògràmmèr'));
+
+{
+ package Àlìcè;
+ base::->import('Prògràmmèr');
+}
+
+ok $a->isa('Prògràmmèr');
+ok $a->isa("Fèmàlè");
+
+@Cèdrìc::ISA = qw(Bòb);
+
+ok (!Cèdrìc->isa('Prògràmmèr'));
+
+my $b = 'abc';
+my @refs = qw(SCALAR SCALAR LVALUE GLOB ARRAY HASH CODE);
+my @vals = ( \$b, \3.14, \substr($b,1,1), \*b, [], {}, sub {} );
+for ($p=0; $p < @refs; $p++) {
+ for ($q=0; $q < @vals; $q++) {
+ is UNIVERSAL::isa($vals[$p], $refs[$q]), ($p==$q or $p+$q==1);
+ };
+};
+
+
+ok UNIVERSAL::isa(Àlìcè => "UNIVERSAL");
+
+cmp_ok UNIVERSAL::can(Àlìcè => "can"), '==', \&UNIVERSAL::can;
+
+eval 'sub UNIVERSAL::slèèp {}';
+ok $a->can("slèèp");
+
+{
+ package Pìckùp;
+ use UNIVERSAL qw( isa can VERSION );
+
+ ::ok isa "Pìckùp", UNIVERSAL;
+ ::cmp_ok can( "Pìckùp", "can" ), '==', \&UNIVERSAL::can;
+ ::ok VERSION "UNIVERSAL" ;
+}
+
+package Fòò;
+
+sub DOES { 1 }
+
+package Bàr;
+
+@Bàr::ISA = 'Fòò';
+
+package Bàz;
+
+package main;
+ok( Fòò->DOES( 'bàr' ), 'DOES() should call DOES() on class' );
+ok( Bàr->DOES( 'Bàr' ), '... and should fall back to isa()' );
+ok( Bàr->DOES( 'Fòò' ), '... even when inherited' );
+ok( Bàz->DOES( 'Bàz' ), '... even without inheriting any other DOES()' );
+ok( ! Bàz->DOES( 'Fòò' ), '... returning true or false appropriately' );
+
+package Pìg;
+package Bòdìnè;
+Bòdìnè->isa('Pìg');
+
+package main;
+eval { UNIVERSAL::DOES([], "fòò") };
+like( $@, qr/Can't call method "DOES" on unblessed reference/,
+ 'DOES call error message says DOES, not isa' );
+
+# Tests for can seem to be split between here and method.t
+# Add the verbatim perl code mentioned in the comments of
+# http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/2001-05/msg01710.html
+# but never actually tested.
+is(UNIVERSAL->can("NòSùchPàckàgè::fòò"), undef);
+
+@splàtt::ISA = 'zlòpp';
+ok (splàtt->isa('zlòpp'));
+ok (!splàtt->isa('plòp'));
+
+# This should reset the ->isa lookup cache
+@splàtt::ISA = 'plòp';
+# And here is the new truth.
+ok (!splàtt->isa('zlòpp'));
+ok (splàtt->isa('plòp'));
+
+