summaryrefslogtreecommitdiff
path: root/t/cmop/C3MethodDispatchOrder_test.t
diff options
context:
space:
mode:
Diffstat (limited to 't/cmop/C3MethodDispatchOrder_test.t')
-rw-r--r--t/cmop/C3MethodDispatchOrder_test.t41
1 files changed, 41 insertions, 0 deletions
diff --git a/t/cmop/C3MethodDispatchOrder_test.t b/t/cmop/C3MethodDispatchOrder_test.t
new file mode 100644
index 0000000..65e0e83
--- /dev/null
+++ b/t/cmop/C3MethodDispatchOrder_test.t
@@ -0,0 +1,41 @@
+use strict;
+use warnings;
+
+use Test::More;
+use Test::Requires 'Algorithm::C3'; # skip all if not installed
+
+use Class::MOP;
+
+use lib 't/cmop/lib';
+use C3MethodDispatchOrder;
+
+{
+ package Diamond_A;
+ use metaclass 'C3MethodDispatchOrder';
+
+ sub hello { 'Diamond_A::hello' }
+
+ package Diamond_B;
+ use metaclass 'C3MethodDispatchOrder';
+ __PACKAGE__->meta->superclasses('Diamond_A');
+
+ package Diamond_C;
+ use metaclass 'C3MethodDispatchOrder';
+ __PACKAGE__->meta->superclasses('Diamond_A');
+
+ sub hello { 'Diamond_C::hello' }
+
+ package Diamond_D;
+ use metaclass 'C3MethodDispatchOrder';
+ __PACKAGE__->meta->superclasses('Diamond_B', 'Diamond_C');
+}
+
+is_deeply(
+ [ Diamond_D->meta->class_precedence_list ],
+ [ qw(Diamond_D Diamond_B Diamond_C Diamond_A) ],
+ '... got the right MRO for Diamond_D');
+
+is(Diamond_D->hello, 'Diamond_C::hello', '... got the right dispatch order');
+is(Diamond_D->can('hello')->(), 'Diamond_C::hello', '... can(method) resolved itself as expected');
+
+done_testing;