Redid conversion to Test::Fatal
[gitmo/Moose.git] / t / 070_native_traits / 013_array_coerce.t
index 0b54582..ef2f85f 100644 (file)
@@ -2,7 +2,7 @@ use strict;
 use warnings;
 
 use Test::More;
-use Test::Exception;
+use Test::Fatal;
 
 {
 
@@ -101,7 +101,7 @@ my $foo = Foo->new;
 
     has thing => (
         is  => 'ro',
-        isa => 'Str',
+        isa => 'Int',
     );
 }
 
@@ -113,18 +113,18 @@ my $foo = Foo->new;
     class_type 'Thing';
 
     coerce 'Thing'
-        => from 'Str'
+        => from 'Int'
         => via { Thing->new( thing => $_ ) };
 
     subtype 'ArrayRefOfThings'
         => as 'ArrayRef[Thing]';
 
     coerce 'ArrayRefOfThings'
-        => from 'ArrayRef[Str]'
+        => from 'ArrayRef[Int]'
         => via { [ map { Thing->new( thing => $_ ) } @{$_} ] };
 
     coerce 'ArrayRefOfThings'
-        => from 'Str'
+        => from 'Int'
         => via { [ Thing->new( thing => $_ ) ] };
 
     has array => (
@@ -133,21 +133,104 @@ my $foo = Foo->new;
         isa     => 'ArrayRefOfThings',
         coerce  => 1,
         handles => {
-            push_array => 'push',
-            set_array  => 'set',
-            get_array  => 'get',
+            push_array   => 'push',
+            unshift_array   => 'unshift',
+            set_array    => 'set',
+            insert_array => 'insert',
         },
     );
 }
 
-TODO: {
-    my $bar = Bar->new( array => [qw( a b c )] );
+{
+    my $bar = Bar->new( array => [ 1, 2, 3 ] );
+
+    $bar->push_array( 4, 5 );
+
+    is_deeply(
+        [ map { $_->thing } @{ $bar->array } ],
+        [ 1, 2, 3, 4, 5 ],
+        'push coerces new members'
+    );
 
-    todo_skip 'coercion in push dies here!', 1;
+    $bar->unshift_array( -1, 0 );
 
-    $bar->push_array('d');
+    is_deeply(
+        [ map { $_->thing } @{ $bar->array } ],
+        [ -1, 0, 1, 2, 3, 4, 5 ],
+        'unshift coerces new members'
+    );
+
+    $bar->set_array( 3 => 9 );
+
+    is_deeply(
+        [ map { $_->thing } @{ $bar->array } ],
+        [ -1, 0, 1, 9, 3, 4, 5 ],
+        'set coerces new members'
+    );
 
-    is( $bar->get_array(3)->thing, 'd', 'push coerces the array' );
+    $bar->insert_array( 3 => 42 );
+
+    is_deeply(
+        [ map { $_->thing } @{ $bar->array } ],
+        [ -1, 0, 1, 42, 9, 3, 4, 5 ],
+        'insert coerces new members'
+    );
+}
+
+{
+    package Baz;
+    use Moose;
+    use Moose::Util::TypeConstraints;
+
+    subtype 'SmallArrayRef'
+        => as 'ArrayRef'
+        => where { @{$_} <= 2 };
+
+    coerce 'SmallArrayRef'
+        => from 'ArrayRef'
+        => via { [ @{$_}[ -2, -1 ] ] };
+
+    has array => (
+        traits  => ['Array'],
+        is      => 'rw',
+        isa     => 'SmallArrayRef',
+        coerce  => 1,
+        handles => {
+            push_array   => 'push',
+            set_array    => 'set',
+            insert_array => 'insert',
+        },
+    );
+}
+
+{
+    my $baz = Baz->new( array => [ 1, 2, 3 ] );
+
+    is_deeply(
+        $baz->array, [ 2, 3 ],
+        'coercion truncates array ref in constructor'
+    );
+
+    $baz->push_array(4);
+
+    is_deeply(
+        $baz->array, [ 3, 4 ],
+        'coercion truncates array ref on push'
+    );
+
+    $baz->insert_array( 1 => 5 );
+
+    is_deeply(
+        $baz->array, [ 5, 4 ],
+        'coercion truncates array ref on insert'
+    );
+
+    $baz->push_array( 7, 8, 9 );
+
+    is_deeply(
+        $baz->array, [ 8, 9 ],
+        'coercion truncates array ref on push'
+    );
 }
 
 done_testing;