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