summaryrefslogtreecommitdiff
path: root/t/mro/basic_05_c3.t
diff options
context:
space:
mode:
Diffstat (limited to 't/mro/basic_05_c3.t')
-rw-r--r--t/mro/basic_05_c3.t61
1 files changed, 61 insertions, 0 deletions
diff --git a/t/mro/basic_05_c3.t b/t/mro/basic_05_c3.t
new file mode 100644
index 0000000000..91f2e35eb2
--- /dev/null
+++ b/t/mro/basic_05_c3.t
@@ -0,0 +1,61 @@
+#!./perl
+
+use strict;
+use warnings;
+BEGIN {
+ unless (-d 'blib') {
+ chdir 't' if -d 't';
+ @INC = '../lib';
+ }
+}
+
+use Test::More tests => 2;
+
+=pod
+
+This tests a strange bug found by Matt S. Trout
+while building DBIx::Class. Thanks Matt!!!!
+
+ <A>
+ / \
+<C> <B>
+ \ /
+ <D>
+
+=cut
+
+{
+ package Diamond_A;
+ use mro 'c3';
+
+ sub foo { 'Diamond_A::foo' }
+}
+{
+ package Diamond_B;
+ use base 'Diamond_A';
+ use mro 'c3';
+
+ sub foo { 'Diamond_B::foo => ' . (shift)->SUPER::foo }
+}
+{
+ package Diamond_C;
+ use mro 'c3';
+ use base 'Diamond_A';
+
+}
+{
+ package Diamond_D;
+ use base ('Diamond_C', 'Diamond_B');
+ use mro 'c3';
+
+ sub foo { 'Diamond_D::foo => ' . (shift)->SUPER::foo }
+}
+
+is_deeply(
+ mro::get_linear_isa('Diamond_D'),
+ [ qw(Diamond_D Diamond_C Diamond_B Diamond_A) ],
+ '... got the right MRO for Diamond_D');
+
+is(Diamond_D->foo,
+ 'Diamond_D::foo => Diamond_B::foo => Diamond_A::foo',
+ '... got the right next::method dispatch path');