remove trailing whitespace
[gitmo/Moose.git] / t / 040_type_constraints / 005_util_type_coercion.t
CommitLineData
182134e8 1#!/usr/bin/perl
2
3use strict;
4use warnings;
5
88071df7 6use Test::More tests => 26;
182134e8 7use Test::Exception;
8
9BEGIN {
10 use_ok('Moose::Util::TypeConstraints');
11}
12
13{
14 package HTTPHeader;
182134e8 15 use Moose;
d03bd989 16
182134e8 17 has 'array' => (is => 'ro');
d03bd989 18 has 'hash' => (is => 'ro');
182134e8 19}
20
d03bd989 21subtype Header =>
22 => as Object
182134e8 23 => where { $_->isa('HTTPHeader') };
d03bd989 24
25coerce Header
26 => from ArrayRef
d6e2d9a1 27 => via { HTTPHeader->new(array => $_[0]) }
d03bd989 28 => from HashRef
d6e2d9a1 29 => via { HTTPHeader->new(hash => $_[0]) };
81dc201f 30
d03bd989 31
32Moose::Util::TypeConstraints->export_type_constraints_as_functions();
33
182134e8 34my $header = HTTPHeader->new();
35isa_ok($header, 'HTTPHeader');
36
37ok(Header($header), '... this passed the type test');
38ok(!Header([]), '... this did not pass the type test');
39ok(!Header({}), '... this did not pass the type test');
40
470b518a 41my $anon_type = subtype Object => where { $_->isa('HTTPHeader') };
182134e8 42
470b518a 43lives_ok {
44 coerce $anon_type
d03bd989 45 => from ArrayRef
470b518a 46 => via { HTTPHeader->new(array => $_[0]) }
d03bd989 47 => from HashRef
470b518a 48 => via { HTTPHeader->new(hash => $_[0]) };
49} 'coercion of anonymous subtype succeeds';
e90c03d0 50
470b518a 51foreach my $coercion (
52 find_type_constraint('Header')->coercion,
53 $anon_type->coercion
54 ) {
e90c03d0 55
470b518a 56 isa_ok($coercion, 'Moose::Meta::TypeCoercion');
d03bd989 57
470b518a 58 {
59 my $coerced = $coercion->coerce([ 1, 2, 3 ]);
60 isa_ok($coerced, 'HTTPHeader');
d03bd989 61
470b518a 62 is_deeply(
63 $coerced->array(),
64 [ 1, 2, 3 ],
65 '... got the right array');
d03bd989 66 is($coerced->hash(), undef, '... nothing assigned to the hash');
470b518a 67 }
d03bd989 68
470b518a 69 {
70 my $coerced = $coercion->coerce({ one => 1, two => 2, three => 3 });
71 isa_ok($coerced, 'HTTPHeader');
d03bd989 72
470b518a 73 is_deeply(
74 $coerced->hash(),
75 { one => 1, two => 2, three => 3 },
76 '... got the right hash');
d03bd989 77 is($coerced->array(), undef, '... nothing assigned to the array');
470b518a 78 }
d03bd989 79
470b518a 80 {
81 my $scalar_ref = \(my $var);
82 my $coerced = $coercion->coerce($scalar_ref);
83 is($coerced, $scalar_ref, '... got back what we put in');
84 }
d03bd989 85
470b518a 86 {
87 my $coerced = $coercion->coerce("Foo");
88 is($coerced, "Foo", '... got back what we put in');
89 }
e90c03d0 90}
88071df7 91
a232d913 92subtype 'StrWithTrailingX'
93 => as 'Str'
94 => where { /X$/ };
88071df7 95
a232d913 96coerce 'StrWithTrailingX'
97 => from 'Str'
98 => via { $_ . 'X' };
88071df7 99
a232d913 100my $tc = find_type_constraint('StrWithTrailingX');
101is($tc->coerce("foo"), "fooX", "coerce when needed");
102is($tc->coerce("fooX"), "fooX", "do not coerce when unneeded");