Import tests for attribute from Mouse's tests
[gitmo/Mouse.git] / t / 020_attributes / failing / 013_attr_dereference_test.t
diff --git a/t/020_attributes/failing/013_attr_dereference_test.t b/t/020_attributes/failing/013_attr_dereference_test.t
new file mode 100644 (file)
index 0000000..7389df8
--- /dev/null
@@ -0,0 +1,81 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+
+use Test::More tests => 11;
+use Test::Exception;
+
+
+
+{
+    package Customer;
+    use Mouse;
+
+    package Firm;
+    use Mouse;
+    use Mouse::Util::TypeConstraints;
+
+    ::lives_ok {
+        has 'customers' => (
+            is         => 'ro',
+            isa        => subtype('ArrayRef' => where {
+                            (blessed($_) && $_->isa('Customer') || return) for @$_; 1 }),
+            auto_deref => 1,
+        );
+    } '... successfully created attr';
+}
+
+{
+    my $customer = Customer->new;
+    isa_ok($customer, 'Customer');
+
+    my $firm = Firm->new(customers => [ $customer ]);
+    isa_ok($firm, 'Firm');
+
+    can_ok($firm, 'customers');
+
+    is_deeply(
+        [ $firm->customers ],
+        [ $customer ],
+        '... got the right dereferenced value'
+    );
+}
+
+{
+    my $firm = Firm->new();
+    isa_ok($firm, 'Firm');
+
+    can_ok($firm, 'customers');
+
+    is_deeply(
+        [ $firm->customers ],
+        [],
+        '... got the right dereferenced value'
+    );
+}
+
+{
+    package AutoDeref;
+    use Mouse;
+
+    has 'bar' => (
+        is         => 'rw',
+        isa        => 'ArrayRef[Int]',
+        auto_deref => 1,
+    );
+}
+
+{
+    my $autoderef = AutoDeref->new;
+
+    dies_ok {
+        $autoderef->bar(1, 2, 3);
+    } '... its auto-de-ref-ing, not auto-en-ref-ing';
+
+    lives_ok  {
+        $autoderef->bar([ 1, 2, 3 ])
+    } '... set the results of bar correctly';
+
+    is_deeply [ $autoderef->bar ], [ 1, 2, 3 ], '... auto-dereffed correctly';
+}