Implemented Mouse::Role->does; modified Mouse::Meta::Class->initialise
[gitmo/Mouse.git] / t / 030_roles / 019_build.t
diff --git a/t/030_roles/019_build.t b/t/030_roles/019_build.t
new file mode 100644 (file)
index 0000000..f76ea5a
--- /dev/null
@@ -0,0 +1,74 @@
+#!/usr/bin/env perl
+use strict;
+use warnings;
+use Test::More tests => 6;
+
+# this test script ensures that my idiom of:
+# role: sub BUILD, after BUILD
+# continues to work to run code after object initialization, whether the class
+# has a BUILD method or not
+
+my @CALLS;
+
+do {
+    package TestRole;
+    use Mouse::Role;
+
+    sub BUILD           { push @CALLS, 'TestRole::BUILD' }
+    before BUILD => sub { push @CALLS, 'TestRole::BUILD:before' };
+    after  BUILD => sub { push @CALLS, 'TestRole::BUILD:after' };
+};
+
+do {
+    package ClassWithBUILD;
+    use Mouse;
+    with 'TestRole';
+
+    sub BUILD { push @CALLS, 'ClassWithBUILD::BUILD' }
+};
+
+do {
+    package ClassWithoutBUILD;
+    use Mouse;
+    with 'TestRole';
+};
+
+is_deeply([splice @CALLS], [], "no calls to BUILD yet");
+
+ClassWithBUILD->new;
+
+is_deeply([splice @CALLS], [
+    'TestRole::BUILD:before',
+    'ClassWithBUILD::BUILD',
+    'TestRole::BUILD:after',
+]);
+
+ClassWithoutBUILD->new;
+
+is_deeply([splice @CALLS], [
+    'TestRole::BUILD:before',
+    'TestRole::BUILD',
+    'TestRole::BUILD:after',
+]);
+
+ClassWithBUILD->meta->make_immutable;
+ClassWithoutBUILD->meta->make_immutable;
+
+is_deeply([splice @CALLS], [], "no calls to BUILD yet");
+
+ClassWithBUILD->new;
+
+is_deeply([splice @CALLS], [
+    'TestRole::BUILD:before',
+    'ClassWithBUILD::BUILD',
+    'TestRole::BUILD:after',
+]);
+
+ClassWithoutBUILD->new;
+
+is_deeply([splice @CALLS], [
+    'TestRole::BUILD:before',
+    'TestRole::BUILD',
+    'TestRole::BUILD:after',
+]);
+