Dynamically bump up Test::Builder::Level in coerce_ok so it gets the correct line...
[gitmo/MooseX-Types-DateTime.git] / t / 02_datetimex.t
CommitLineData
a3f4ab71 1use strict;
2use warnings;
3
8c08046b 4use Test::More;
a3f4ab71 5
8c08046b 6BEGIN {
7 plan skip_all => "DateTime::Format::DateManip required" unless eval { require DateTime::Format::DateManip };
8 plan tests => 30;
a3f4ab71 9}
10
8c08046b 11use Test::Exception;
12use DateTime;
13
14use ok 'MooseX::Types::DateTimeX';
15
a3f4ab71 16=head1 NAME
17
6903978c 18t/02_datetimex.t - Check that we can properly coerce a string.
a3f4ab71 19
20=head1 DESCRIPTION
21
6903978c 22Run some tests to make sure the the Duration and DateTime types continue to
23work exactly as from the L<MooseX::Types::DateTime> class, as well as perform
24the correct string to object coercions.
a3f4ab71 25
26=head1 TESTS
27
28This module defines the following tests.
29
30=head2 Test Class
31
32Create a L<Moose> class that is using the L<MooseX::Types::DateTimeX> types.
33
34=cut
35
36{
37 package MooseX::Types::DateTimeX::CoercionTest;
38
39 use Moose;
6903978c 40 use MooseX::Types::DateTimeX qw(DateTime Duration);
a3f4ab71 41
42 has 'date' => (is=>'rw', isa=>DateTime, coerce=>1);
6903978c 43 has 'duration' => (is=>'rw', isa=>Duration, coerce=>1);
a3f4ab71 44}
45
46ok my $class = MooseX::Types::DateTimeX::CoercionTest->new
47=> 'Created a good class';
48
49
50=head2 ParseDateTime Capabilities
51
52parse some dates and make sure the system can actually find something.
53
54=cut
55
8c08046b 56sub coerce_ok ($;$) {
57 my ( $date, $canon ) = @_;
7613eb10 58 local $Test::Builder::Level = $Test::Builder::Level + 1;
a3f4ab71 59
8c08046b 60 SKIP: {
61 skip "DateTimeX::Easy couldn't parse '$date'", $canon ? 2 : 1 unless DateTimeX::Easy->new($date);
62 ok( $class->date($date), "coerced a DateTime from '$date'" );
63 is( $class->date, $canon, 'got correct date' ) if $canon;
64 }
65}
a3f4ab71 66
8c08046b 67coerce_ok ('2/13/1969 noon', '1969-02-13T12:00:00' );
a3f4ab71 68
a3f4ab71 69
8c08046b 70coerce_ok( '2/13/1969', '1969-02-13T00:00:00' );
a3f4ab71 71
8c08046b 72coerce_ok( '2/13/1969 America/New_York', '1969-02-13T00:00:00' );
a3f4ab71 73
8c08046b 74SKIP: {
75 skip "couldn't parse", 1 unless $class->date;
76 isa_ok $class->date->time_zone => 'DateTime::TimeZone::America::New_York'
77 => 'Got Correct America/New_York TimeZone';
78}
a3f4ab71 79
8c08046b 80coerce_ok( 'jan 1 2006', '2006-01-01T00:00:00' );
a3f4ab71 81
82=head2 relative dates
83
84Stuff like "yesterday". We can make sure they returned something but we have
85no way to make sure the values are really correct. Manual testing suggests
86they work well enough, given the inherent ambiguity we are dealing with.
87
88=cut
89
8c08046b 90coerce_ok("now");
a3f4ab71 91
8c08046b 92coerce_ok("yesterday");
a3f4ab71 93
8c08046b 94coerce_ok("tomorrow");
a3f4ab71 95
8c08046b 96coerce_ok("last week");
a3f4ab71 97
98=head2 check inherited constraints
99
100Just a few tests to make sure the object, hash, etc coercions and type checks
101still work.
102
103=cut
104
105ok my $datetime = DateTime->now()
106=> 'Create a datetime object for testing';
107
108ok my $anyobject = bless({}, 'Bogus::Does::Not::Exist')
109=> 'Created a random object for proving the object constraint';
110
111ok $class->date($datetime)
112=> 'Passed Object type constraint test.';
113
114 isa_ok $class->date => 'DateTime'
115 => 'Got a good DateTime Object';
116
117dies_ok { $class->date($anyobject) } 'Does not allow the bad object';
118
119ok $class->date(1000)
120=> 'Passed Num coercion test.';
121
122 isa_ok $class->date => 'DateTime'
123 => 'Got a good DateTime Object';
124
125 is $class->date => '1970-01-01T00:16:40'
126 => 'Got correct DateTime';
127
128ok $class->date({year=>2000,month=>1,day=>10})
129=> 'Passed HashRef coercion test.';
130
131 isa_ok $class->date => 'DateTime'
132 => 'Got a good DateTime Object';
133
134 is $class->date => '2000-01-10T00:00:00'
135 => 'Got correct DateTime';
136
6903978c 137=head2 check duration
138
139make sure the Duration type constraint works as expected
140
141=cut
142
143ok $class->duration(100)
144=> 'got duration from integer';
145
146 is $class->duration->seconds, 100
147 => 'got correct duration from integer';
148
149
150ok $class->duration('1 minute')
151=> 'got duration from string';
152
153 is $class->duration->seconds, 60
154 => 'got correct duration string';
155
a3f4ab71 156
157=head1 AUTHOR
158
159John Napiorkowski E<lt>jjn1056 at yahoo.comE<gt>
160
161=head1 COPYRIGHT
162
163 Copyright (c) 2008 John Napiorkowski. All rights reserved
164 This program is free software; you can redistribute
165 it and/or modify it under the same terms as Perl itself.
166
167=cut
168
1691;
170