Add tests for coercing native Hash trait
Dave Rolsky [Sun, 26 Sep 2010 01:59:27 +0000 (20:59 -0500)]
t/070_native_traits/053_hash_coerce.t [new file with mode: 0644]

diff --git a/t/070_native_traits/053_hash_coerce.t b/t/070_native_traits/053_hash_coerce.t
new file mode 100644 (file)
index 0000000..f05b144
--- /dev/null
@@ -0,0 +1,77 @@
+use strict;
+use warnings;
+
+use Test::More;
+use Test::Exception;
+
+{
+
+    package Foo;
+    use Moose;
+    use Moose::Util::TypeConstraints;
+
+    subtype 'UCHash', as 'HashRef[Str]', where {
+        !grep {/[a-z]/} values %{$_};
+    };
+
+    coerce 'UCHash', from 'HashRef[Str]', via {
+        $_ = uc $_ for values %{$_};
+        $_;
+    };
+
+    has hash => (
+        traits  => ['Hash'],
+        is      => 'rw',
+        isa     => 'UCHash',
+        coerce  => 1,
+        handles => {
+            set_key => 'set',
+        },
+    );
+
+    our @TriggerArgs;
+
+    has lazy => (
+        traits  => ['Hash'],
+        is      => 'rw',
+        isa     => 'UCHash',
+        coerce  => 1,
+        lazy    => 1,
+        default => sub { { x => 'a' } },
+        handles => {
+            set_lazy => 'set',
+        },
+        trigger => sub { @TriggerArgs = @_ },
+        clearer => 'clear_lazy',
+    );
+}
+
+my $foo = Foo->new;
+
+{
+    $foo->hash( { x => 'A', y => 'B' } );
+
+    $foo->set_key( z => 'c' );
+
+    is_deeply(
+        $foo->hash, { x => 'A', y => 'B', z => 'C' },
+        'set coerces the hash'
+    );
+}
+
+{
+    $foo->set_lazy( y => 'b' );
+
+    is_deeply(
+        $foo->lazy, { x => 'A', y => 'B' },
+        'set coerces the hash - lazy'
+    );
+
+    is_deeply(
+        \@Foo::TriggerArgs,
+        [ $foo, { x => 'A', y => 'B' }, { x => 'A' } ],
+        'trigger receives expected arguments'
+    );
+}
+
+done_testing;