Test (that fails) for an edge case in role composition
[gitmo/Moose.git] / t / roles / role_composition_conflict_detection.t
diff --git a/t/roles/role_composition_conflict_detection.t b/t/roles/role_composition_conflict_detection.t
new file mode 100644 (file)
index 0000000..a9d8f41
--- /dev/null
@@ -0,0 +1,46 @@
+use strict;
+use warnings;
+
+use Test::More;
+use Test::Fatal;
+
+use Moose::Util qw( find_meta );
+
+{
+    package RoleA;
+    use Moose::Role;
+
+    sub foo { 42 }
+}
+
+{
+    package RoleB;
+    use Moose::Role;
+
+    with 'RoleA';
+}
+
+{
+    package RoleC;
+    use Moose::Role;
+
+    sub foo { 84 }
+}
+
+{
+    my $composite
+        = Moose::Meta::Role->combine( map { [ find_meta($_) => {} ] }
+            qw( RoleA RoleB RoleC ) );
+    ok( $composite->requires_method('foo'), 'Composite of [ABC] requires a foo method' );
+    ok( ! $composite->has_method('foo'), 'Composite of [ABC] does not also have a foo method' );
+}
+
+{
+    my $composite
+        = Moose::Meta::Role->combine( map { [ find_meta($_) => {} ] }
+            qw( RoleA RoleC RoleB ) );
+    ok( $composite->requires_method('foo'), 'Composite of [ACB] requires a foo method' );
+    ok( ! $composite->has_method('foo'), 'Composite of [ACB] does not also have a foo method' );
+}
+
+done_testing;