xref: /openbsd-src/gnu/usr.bin/perl/t/mro/next_method_utf8.t (revision 898184e3e61f9129feb5978fad5a8c6865f00b92)
1*898184e3Ssthen#!/usr/bin/perl
2*898184e3Ssthen
3*898184e3Ssthenuse strict;
4*898184e3Ssthenuse warnings;
5*898184e3Ssthenuse utf8;
6*898184e3Ssthenuse open qw( :utf8 :std );
7*898184e3Ssthen
8*898184e3Ssthenrequire q(./test.pl); plan(tests => 5);
9*898184e3Ssthen
10*898184e3Ssthen=pod
11*898184e3Ssthen
12*898184e3SsthenThis tests the classic diamond inheritance pattern.
13*898184e3Ssthen
14*898184e3Ssthen   <A>
15*898184e3Ssthen  /   \
16*898184e3Ssthen<B>   <C>
17*898184e3Ssthen  \   /
18*898184e3Ssthen   <D>
19*898184e3Ssthen
20*898184e3Ssthen=cut
21*898184e3Ssthen
22*898184e3Ssthen{
23*898184e3Ssthen    package Diӑmond_A;
24*898184e3Ssthen    use mro 'c3';
25*898184e3Ssthen    sub 헬ฬ { 'Diӑmond_A::헬ฬ' }
26*898184e3Ssthen    sub fಓ { 'Diӑmond_A::fಓ' }
27*898184e3Ssthen}
28*898184e3Ssthen{
29*898184e3Ssthen    package Diӑmond_B;
30*898184e3Ssthen    use base 'Diӑmond_A';
31*898184e3Ssthen    use mro 'c3';
32*898184e3Ssthen    sub fಓ { 'Diӑmond_B::fಓ => ' . (shift)->next::method() }
33*898184e3Ssthen}
34*898184e3Ssthen{
35*898184e3Ssthen    package Diӑmond_C;
36*898184e3Ssthen    use mro 'c3';
37*898184e3Ssthen    use base 'Diӑmond_A';
38*898184e3Ssthen
39*898184e3Ssthen    sub 헬ฬ { 'Diӑmond_C::헬ฬ => ' . (shift)->next::method() }
40*898184e3Ssthen    sub fಓ { 'Diӑmond_C::fಓ => ' . (shift)->next::method() }
41*898184e3Ssthen}
42*898184e3Ssthen{
43*898184e3Ssthen    package Diӑmond_D;
44*898184e3Ssthen    use base ('Diӑmond_B', 'Diӑmond_C');
45*898184e3Ssthen    use mro 'c3';
46*898184e3Ssthen
47*898184e3Ssthen    sub fಓ { 'Diӑmond_D::fಓ => ' . (shift)->next::method() }
48*898184e3Ssthen}
49*898184e3Ssthen
50*898184e3Ssthenok(eq_array(
51*898184e3Ssthen    mro::get_linear_isa('Diӑmond_D'),
52*898184e3Ssthen    [ qw(Diӑmond_D Diӑmond_B Diӑmond_C Diӑmond_A) ]
53*898184e3Ssthen), '... got the right MRO for Diӑmond_D');
54*898184e3Ssthen
55*898184e3Ssthenis(Diӑmond_D->헬ฬ, 'Diӑmond_C::헬ฬ => Diӑmond_A::헬ฬ', '... method resolved itself as expected');
56*898184e3Ssthen
57*898184e3Ssthenis(Diӑmond_D->can('헬ฬ')->('Diӑmond_D'),
58*898184e3Ssthen   'Diӑmond_C::헬ฬ => Diӑmond_A::헬ฬ',
59*898184e3Ssthen   '... can(method) resolved itself as expected');
60*898184e3Ssthen
61*898184e3Ssthenis(UNIVERSAL::can("Diӑmond_D", '헬ฬ')->('Diӑmond_D'),
62*898184e3Ssthen   'Diӑmond_C::헬ฬ => Diӑmond_A::헬ฬ',
63*898184e3Ssthen   '... can(method) resolved itself as expected');
64*898184e3Ssthen
65*898184e3Ssthenis(Diӑmond_D->fಓ,
66*898184e3Ssthen    'Diӑmond_D::fಓ => Diӑmond_B::fಓ => Diӑmond_C::fಓ => Diӑmond_A::fಓ',
67*898184e3Ssthen    '... method fಓ resolved itself as expected');
68