remove trailing whitespace
[gitmo/Moose.git] / t / 040_type_constraints / 005_util_type_coercion.t
index 4fb8c55..86a158c 100644 (file)
@@ -3,7 +3,7 @@
 use strict;
 use warnings;
 
-use Test::More tests => 14;
+use Test::More tests => 26;
 use Test::Exception;
 
 BEGIN {
@@ -13,38 +13,24 @@ BEGIN {
 {
     package HTTPHeader;
     use Moose;
-    
+
     has 'array' => (is => 'ro');
-    has 'hash'  => (is => 'ro');    
+    has 'hash'  => (is => 'ro');
 }
 
-subtype Header => 
-    => as Object 
+subtype Header =>
+    => as Object
     => where { $_->isa('HTTPHeader') };
-    
-coerce Header 
-    => from ArrayRef 
+
+coerce Header
+    => from ArrayRef
         => via { HTTPHeader->new(array => $_[0]) }
-    => from HashRef 
+    => from HashRef
         => via { HTTPHeader->new(hash => $_[0]) };
 
 
-{
-       package Math::BigFloat;
-       sub new { bless { }, shift }; # not a moose class ;-)
-}
-
-subtype "Math::BigFloat"
-       => as "Math::BigFloat"
-       => where { 1 };
-
-coerce "Math::BigFloat"
-       => from Num
-               => via { Math::BigFloat->new( $_ ) };
+Moose::Util::TypeConstraints->export_type_constraints_as_functions();
 
-        
-Moose::Util::TypeConstraints->export_type_constraints_as_functions();        
-        
 my $header = HTTPHeader->new();
 isa_ok($header, 'HTTPHeader');
 
@@ -52,39 +38,65 @@ ok(Header($header), '... this passed the type test');
 ok(!Header([]), '... this did not pass the type test');
 ok(!Header({}), '... this did not pass the type test');
 
-my $coercion = find_type_constraint('Header')->coercion;
-isa_ok($coercion, 'Moose::Meta::TypeCoercion');
-
-{
-    my $coerced = $coercion->coerce([ 1, 2, 3 ]);
-    isa_ok($coerced, 'HTTPHeader');
-
-    is_deeply(
-        $coerced->array(),
-        [ 1, 2, 3 ],
-        '... got the right array');
-    is($coerced->hash(), undef, '... nothing assigned to the hash');        
+my $anon_type = subtype Object => where { $_->isa('HTTPHeader') };
+
+lives_ok {
+    coerce $anon_type
+        => from ArrayRef
+            => via { HTTPHeader->new(array => $_[0]) }
+        => from HashRef
+            => via { HTTPHeader->new(hash => $_[0]) };
+} 'coercion of anonymous subtype succeeds';
+
+foreach my $coercion (
+    find_type_constraint('Header')->coercion,
+    $anon_type->coercion
+    ) {
+
+    isa_ok($coercion, 'Moose::Meta::TypeCoercion');
+
+    {
+        my $coerced = $coercion->coerce([ 1, 2, 3 ]);
+        isa_ok($coerced, 'HTTPHeader');
+
+        is_deeply(
+            $coerced->array(),
+            [ 1, 2, 3 ],
+            '... got the right array');
+        is($coerced->hash(), undef, '... nothing assigned to the hash');
+    }
+
+    {
+        my $coerced = $coercion->coerce({ one => 1, two => 2, three => 3 });
+        isa_ok($coerced, 'HTTPHeader');
+
+        is_deeply(
+            $coerced->hash(),
+            { one => 1, two => 2, three => 3 },
+            '... got the right hash');
+        is($coerced->array(), undef, '... nothing assigned to the array');
+    }
+
+    {
+        my $scalar_ref = \(my $var);
+        my $coerced = $coercion->coerce($scalar_ref);
+        is($coerced, $scalar_ref, '... got back what we put in');
+    }
+
+    {
+        my $coerced = $coercion->coerce("Foo");
+        is($coerced, "Foo", '... got back what we put in');
+    }
 }
 
-{
-    my $coerced = $coercion->coerce({ one => 1, two => 2, three => 3 });
-    isa_ok($coerced, 'HTTPHeader');
-    
-    is_deeply(
-        $coerced->hash(),
-        { one => 1, two => 2, three => 3 },
-        '... got the right hash');
-    is($coerced->array(), undef, '... nothing assigned to the array');        
-}
+subtype 'StrWithTrailingX'
+    => as 'Str'
+    => where { /X$/ };
 
-{
-    my $scalar_ref = \(my $var);
-    my $coerced = $coercion->coerce($scalar_ref);
-    is($coerced, $scalar_ref, '... got back what we put in');
-}
-
-{
-    my $coerced = $coercion->coerce("Foo");
-    is($coerced, "Foo", '... got back what we put in');
-}
+coerce 'StrWithTrailingX'
+    => from 'Str'
+    => via { $_ . 'X' };
 
+my $tc = find_type_constraint('StrWithTrailingX');
+is($tc->coerce("foo"), "fooX", "coerce when needed");
+is($tc->coerce("fooX"), "fooX", "do not coerce when unneeded");