home_run 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (73) hide show
  1. data/CHANGELOG +3 -0
  2. data/LICENSE +19 -0
  3. data/README.rdoc +314 -0
  4. data/Rakefile +140 -0
  5. data/bench/cpu_bench.rb +279 -0
  6. data/bench/dt_garbage_bench.rb +11 -0
  7. data/bench/dt_mem_bench.rb +14 -0
  8. data/bench/garbage_bench.rb +11 -0
  9. data/bench/mem_bench.rb +14 -0
  10. data/bin/home_run +87 -0
  11. data/default.mspec +12 -0
  12. data/ext/date/format.rb +842 -0
  13. data/ext/date.rb +7 -0
  14. data/ext/date_ext.c +4548 -0
  15. data/ext/date_parser.c +367 -0
  16. data/ext/date_parser.rl +134 -0
  17. data/ext/datetime.c +2804 -0
  18. data/ext/extconf.rb +6 -0
  19. data/spec/date/accessor_spec.rb +176 -0
  20. data/spec/date/add_month_spec.rb +26 -0
  21. data/spec/date/add_spec.rb +23 -0
  22. data/spec/date/boat_spec.rb +38 -0
  23. data/spec/date/civil_spec.rb +147 -0
  24. data/spec/date/commercial_spec.rb +153 -0
  25. data/spec/date/constants_spec.rb +44 -0
  26. data/spec/date/conversions_spec.rb +246 -0
  27. data/spec/date/day_spec.rb +73 -0
  28. data/spec/date/downto_spec.rb +17 -0
  29. data/spec/date/eql_spec.rb +16 -0
  30. data/spec/date/format_spec.rb +52 -0
  31. data/spec/date/gregorian_spec.rb +52 -0
  32. data/spec/date/hash_spec.rb +11 -0
  33. data/spec/date/julian_spec.rb +129 -0
  34. data/spec/date/leap_spec.rb +19 -0
  35. data/spec/date/minus_month_spec.rb +25 -0
  36. data/spec/date/minus_spec.rb +51 -0
  37. data/spec/date/next_prev_spec.rb +108 -0
  38. data/spec/date/ordinal_spec.rb +83 -0
  39. data/spec/date/parse_spec.rb +442 -0
  40. data/spec/date/parsing_spec.rb +77 -0
  41. data/spec/date/relationship_spec.rb +28 -0
  42. data/spec/date/step_spec.rb +109 -0
  43. data/spec/date/strftime_spec.rb +223 -0
  44. data/spec/date/strptime_spec.rb +201 -0
  45. data/spec/date/succ_spec.rb +20 -0
  46. data/spec/date/today_spec.rb +15 -0
  47. data/spec/date/upto_spec.rb +17 -0
  48. data/spec/datetime/accessor_spec.rb +218 -0
  49. data/spec/datetime/add_month_spec.rb +26 -0
  50. data/spec/datetime/add_spec.rb +36 -0
  51. data/spec/datetime/boat_spec.rb +43 -0
  52. data/spec/datetime/constructor_spec.rb +142 -0
  53. data/spec/datetime/conversions_spec.rb +54 -0
  54. data/spec/datetime/day_spec.rb +73 -0
  55. data/spec/datetime/downto_spec.rb +39 -0
  56. data/spec/datetime/eql_spec.rb +17 -0
  57. data/spec/datetime/format_spec.rb +59 -0
  58. data/spec/datetime/hash_spec.rb +11 -0
  59. data/spec/datetime/leap_spec.rb +19 -0
  60. data/spec/datetime/minus_month_spec.rb +25 -0
  61. data/spec/datetime/minus_spec.rb +77 -0
  62. data/spec/datetime/next_prev_spec.rb +138 -0
  63. data/spec/datetime/now_spec.rb +18 -0
  64. data/spec/datetime/parse_spec.rb +390 -0
  65. data/spec/datetime/parsing_spec.rb +77 -0
  66. data/spec/datetime/relationship_spec.rb +28 -0
  67. data/spec/datetime/step_spec.rb +155 -0
  68. data/spec/datetime/strftime_spec.rb +118 -0
  69. data/spec/datetime/strptime_spec.rb +117 -0
  70. data/spec/datetime/succ_spec.rb +24 -0
  71. data/spec/datetime/upto_spec.rb +39 -0
  72. data/spec/spec_helper.rb +59 -0
  73. metadata +138 -0
@@ -0,0 +1,17 @@
1
+ require File.expand_path('../../spec_helper', __FILE__)
2
+
3
+ describe "Date#upto" do
4
+
5
+ it "should be able to step forward in time" do
6
+ ds = Date.civil(2008, 10, 11)
7
+ de = Date.civil(2008, 9, 29)
8
+ count = 0
9
+ de.upto(ds) do |d|
10
+ d.should <= ds
11
+ d.should >= de
12
+ count += 1
13
+ end
14
+ count.should == 13
15
+ end
16
+
17
+ end
@@ -0,0 +1,218 @@
1
+ require File.expand_path('../../spec_helper', __FILE__)
2
+
3
+ describe "DateTime#day_fraction" do
4
+ it "should be able to determine the fraction of the day" do
5
+ DateTime.new(2008, 1, 1).day_fraction.should == 0.0
6
+ DateTime.new(2008, 1, 1, 12).day_fraction.should == 0.5
7
+ DateTime.new(2008, 1, 1, 6).day_fraction.should == 0.25
8
+ end
9
+ end
10
+
11
+ describe "DateTime#hour" do
12
+ it "should be able to determine the hour of the day" do
13
+ DateTime.jd(2007, 1).hour.should == 1
14
+ end
15
+ end
16
+
17
+ describe "DateTime#min" do
18
+ it "should be able to determine the minute of the day" do
19
+ DateTime.jd(2007, 1, 2).min.should == 2
20
+ end
21
+ end
22
+
23
+ describe "DateTime#offset" do
24
+ it "should be able to determine the offset of the day from UTC" do
25
+ DateTime.jd(2007, 1, 2, 3, 6/24.0).offset.should == 6/24.0
26
+ DateTime.parse('2008-01-01 00:00:00+12:00').offset.should == 0.5
27
+ end
28
+
29
+ ruby_version_is "" ... "1.9" do
30
+ it "#of should be the offset as a float fraction of the day" do
31
+ DateTime.parse('2008-01-01 00:00:00+12:00').of.should == 0.5
32
+ end
33
+ end
34
+ end
35
+
36
+ describe "DateTime#sec" do
37
+ it "should be able to determine the second of the day" do
38
+ DateTime.jd(2007, 1, 2, 3).sec.should == 3
39
+ end
40
+ end
41
+
42
+ describe "DateTime#sec_fraction" do
43
+ it "should be the fraction of a second as a fraction of the day" do
44
+ DateTime.new(2008, 1, 1).sec_fraction.should == 0.0
45
+ DateTime.parse('12:13:15.678900').sec_fraction.should be_close(7.85763888888889e-06, 0.0000000000001)
46
+ end
47
+ end
48
+
49
+ describe "DateTime#zone" do
50
+ it "should give the offset as a string" do
51
+ DateTime.jd(0).zone.should == '+00:00'
52
+ DateTime.jd(2007, 0, 0, 0, -1/24.0).zone.should == '-01:00'
53
+ end
54
+ end
55
+
56
+ describe "DateTime#cwyear" do
57
+ it "should be able to determine the commercial year for a date" do
58
+ DateTime.civil(2007, 1, 17).cwyear.should == 2007
59
+ DateTime.civil(2008, 10, 28).cwyear.should == 2008
60
+ DateTime.civil(2007, 12, 31).cwyear.should == 2008
61
+ DateTime.civil(2010, 1, 1).cwyear.should == 2009
62
+ DateTime.commercial(2008, 1, 1).cwyear.should == 2008
63
+ DateTime.commercial(2008, 52, 1).cwyear.should == 2008
64
+ DateTime.jd(2454782).cwyear.should == 2008
65
+ DateTime.jd(2454832).cwyear.should == 2009
66
+ DateTime.ordinal(2008, 1).cwyear.should == 2008
67
+ DateTime.ordinal(2008, 359).cwyear.should == 2008
68
+ DateTime.ordinal(2008, 366).cwyear.should == 2009
69
+ end
70
+ end
71
+
72
+ describe "DateTime#cweek" do
73
+ it "should be able to determine the commercial week for a date" do
74
+ DateTime.civil(2007, 1, 17).cweek.should == 3
75
+ DateTime.civil(2008, 10, 28).cweek.should == 44
76
+ DateTime.civil(2007, 12, 31).cweek.should == 1
77
+ DateTime.civil(2010, 1, 1).cweek.should == 53
78
+ DateTime.commercial(2008, 1, 1).cweek.should == 1
79
+ DateTime.commercial(2008, 10, 5).cweek.should == 10
80
+ DateTime.jd(2454782).cweek.should == 46
81
+ DateTime.jd(2454789).cweek.should == 47
82
+ DateTime.ordinal(2008, 1).cweek.should == 1
83
+ DateTime.ordinal(2008, 359).cweek.should == 52
84
+ DateTime.ordinal(2008, 366).cweek.should == 1
85
+ end
86
+ end
87
+
88
+ describe "DateTime#cwday" do
89
+ it "should be able to determine the commercial week day for a date" do
90
+ DateTime.civil(2007, 1, 17).cwday.should == 3
91
+ DateTime.civil(2008, 10, 26).cwday.should == 7
92
+ DateTime.commercial(2008, 1, 1).cwday.should == 1
93
+ DateTime.commercial(2008, 10, 5).cwday.should == 5
94
+ DateTime.jd(2454782).cwday.should == 2
95
+ DateTime.jd(2454786).cwday.should == 6
96
+ DateTime.ordinal(2008, 1).cwday.should == 2
97
+ DateTime.ordinal(2008, 317).cwday.should == 3
98
+ end
99
+ end
100
+
101
+ describe "DateTime#mday and #day" do
102
+ it "should be able to determine the day of the month for a date" do
103
+ DateTime.civil(2007, 1, 17).mday.should == 17
104
+ DateTime.civil(2008, 10, 28).mday.should == 28
105
+ DateTime.civil(2007, 1, 17).day.should == 17
106
+ DateTime.civil(2008, 10, 28).day.should == 28
107
+ DateTime.commercial(2008, 1, 1).day.should == 31
108
+ DateTime.commercial(2008, 52, 1).day.should == 22
109
+ DateTime.jd(2454782).day.should == 11
110
+ DateTime.jd(2454832).day.should == 31
111
+ DateTime.ordinal(2008, 1).day.should == 1
112
+ DateTime.ordinal(2008, 359).day.should == 24
113
+ DateTime.ordinal(2008, 366).day.should == 31
114
+ end
115
+ end
116
+
117
+ describe "DateTime#jd" do
118
+ it "should be able to determine the julian date for a date" do
119
+ DateTime.civil(2007, 1, 17).jd.should == 2454118
120
+ DateTime.civil(2008, 10, 28).jd.should == 2454768
121
+ DateTime.commercial(2008, 1, 1).jd.should == 2454466
122
+ DateTime.commercial(2008, 52, 1).jd.should == 2454823
123
+ DateTime.jd(2454782).jd.should == 2454782
124
+ DateTime.jd(2454832).jd.should == 2454832
125
+ DateTime.ordinal(2008, 1).jd.should == 2454467
126
+ DateTime.ordinal(2008, 359).jd.should == 2454825
127
+ DateTime.ordinal(2008, 366).jd.should == 2454832
128
+ end
129
+ end
130
+
131
+ describe "DateTime#ajd" do
132
+ it "should be a float of the astronomical julian day" do
133
+ DateTime.jd(2008).ajd.should == 2007.5
134
+ DateTime.jd(2008, 12).ajd.should == 2008
135
+ DateTime.jd(2008, 0, 0, 0, -0.5).ajd.should == 2008
136
+ DateTime.jd(2008, 12, 0, 0, -0.5).ajd.should == 2008.5
137
+ end
138
+ end
139
+
140
+ describe "DateTime#amjd" do
141
+ it "#amjd should be a float of the astronomical julian day" do
142
+ DateTime.jd(2008).amjd.should == -2397993.0
143
+ DateTime.jd(2008, 12).amjd.should == -2397992.5
144
+ DateTime.jd(2008, 0, 0, 0, -0.5).amjd.should == -2397992.5
145
+ DateTime.jd(2008, 12, 0, 0, -0.5).amjd.should == -2397992.0
146
+ end
147
+ end
148
+
149
+ describe "DateTime#mjd" do
150
+ it "should be able to determine the Modified Julian day for a date" do
151
+ DateTime.civil(2007, 1, 17).mjd.should == 54117
152
+ end
153
+ end
154
+
155
+ describe "DateTime#ld" do
156
+ it "should be able to determine the Modified Julian day for a date" do
157
+ DateTime.civil(2007, 1, 17).ld.should == 154958
158
+ end
159
+ end
160
+
161
+ describe "DateTime#wday" do
162
+ it "should be able to determine the week day for a date" do
163
+ DateTime.civil(2007, 1, 17).wday.should == 3
164
+ DateTime.civil(2008, 10, 26).wday.should == 0
165
+ DateTime.commercial(2008, 1, 1).wday.should == 1
166
+ DateTime.commercial(2008, 52, 1).wday.should == 1
167
+ DateTime.jd(2454782).wday.should == 2
168
+ DateTime.jd(2454832).wday.should == 3
169
+ DateTime.ordinal(2008, 1).wday.should == 2
170
+ DateTime.ordinal(2008, 170).wday.should == 3
171
+ DateTime.ordinal(2008, 366).wday.should == 3
172
+ end
173
+ end
174
+
175
+ describe "DateTime#year" do
176
+ it "should be able to determine the year for a date" do
177
+ DateTime.civil(2007, 1, 17).year.should == 2007
178
+ DateTime.civil(2008, 1, 17).year.should == 2008
179
+ DateTime.commercial(2008, 1, 1).year.should == 2007
180
+ DateTime.commercial(2008, 52, 1).year.should == 2008
181
+ DateTime.jd(2454782).year.should == 2008
182
+ DateTime.jd(2454833).year.should == 2009
183
+ DateTime.ordinal(2008, 1).year.should == 2008
184
+ DateTime.ordinal(2008, 170).year.should == 2008
185
+ DateTime.ordinal(2008, 366).year.should == 2008
186
+ end
187
+ end
188
+
189
+ describe "DateTime#yday" do
190
+ it "should be able to determine the year for a date" do
191
+ DateTime.civil(2007, 1, 17).yday.should == 17
192
+ DateTime.civil(2008, 10, 28).yday.should == 302
193
+ DateTime.commercial(2008, 1, 1).yday.should == 365
194
+ DateTime.commercial(2008, 52, 1).yday.should == 357
195
+ DateTime.jd(2454782).yday.should == 316
196
+ DateTime.jd(2454832).yday.should == 366
197
+ DateTime.ordinal(2008, 1).yday.should == 1
198
+ DateTime.ordinal(2008, 170).yday.should == 170
199
+ DateTime.ordinal(2008, 366).yday.should == 366
200
+ end
201
+ end
202
+
203
+ describe "DateTime#mon and #month" do
204
+ it "should be able to determine the month for a date" do
205
+ DateTime.civil(2007, 1, 17).mon.should == 1
206
+ DateTime.civil(2008, 10, 28).mon.should == 10
207
+ DateTime.civil(2007, 1, 17).month.should == 1
208
+ DateTime.civil(2008, 10, 28).month.should == 10
209
+ DateTime.commercial(2008, 1, 1).mon.should == 12
210
+ DateTime.commercial(2008, 52, 1).mon.should == 12
211
+ DateTime.jd(2454782).mon.should == 11
212
+ DateTime.jd(2454832).mon.should == 12
213
+ DateTime.ordinal(2008, 1).mon.should == 1
214
+ DateTime.ordinal(2008, 170).mon.should == 6
215
+ DateTime.ordinal(2008, 366).mon.should == 12
216
+ end
217
+ end
218
+
@@ -0,0 +1,26 @@
1
+ require File.expand_path('../../spec_helper', __FILE__)
2
+
3
+ describe "DateTime#>>" do
4
+
5
+ it "should add a number of months to a DateTime" do
6
+ (DateTime.civil(2007,2,27) >> 10).should == DateTime.civil(2007, 12, 27)
7
+ (DateTime.civil(2007,2,27) >> 10).should == DateTime.civil(2007, 12, 27)
8
+ (DateTime.commercial(2007,2,2) >> 10).should == DateTime.commercial(2007, 45, 5)
9
+ (DateTime.jd(2454782) >> 10).should == DateTime.jd(2455086)
10
+ (DateTime.ordinal(2008, 10) >> 10).should == DateTime.ordinal(2008, 315)
11
+ (DateTime.civil(2007,2,27) >> 22).should == DateTime.civil(2008, 12, 27)
12
+ (DateTime.civil(2007,2,27) >> -2).should == DateTime.civil(2006, 12, 27)
13
+ end
14
+
15
+ it "should result in the last day of a month if the day doesn't exist" do
16
+ d = DateTime.civil(2008,3,31) >> 1
17
+ d.should == DateTime.civil(2008, 4, 30)
18
+ end
19
+
20
+ it "should raise an error on non numeric parameters" do
21
+ lambda { DateTime.civil(2007,2,27) >> "hello" }.should raise_error(TypeError)
22
+ lambda { DateTime.civil(2007,2,27) >> DateTime.new }.should raise_error(TypeError)
23
+ lambda { DateTime.civil(2007,2,27) >> Object.new }.should raise_error(TypeError)
24
+ end
25
+
26
+ end
@@ -0,0 +1,36 @@
1
+ require File.expand_path('../../spec_helper', __FILE__)
2
+
3
+ describe "DateTime#+" do
4
+
5
+ it "should add a number of days to a Date" do
6
+ (DateTime.civil(2007,2,27) + 315).should == DateTime.civil(2008, 1, 8)
7
+ (DateTime.commercial(2007,2,2) + 315).should == DateTime.commercial(2007, 47, 2)
8
+ (DateTime.jd(2454782) + 315).should == DateTime.jd(2455097)
9
+ (DateTime.ordinal(2008, 10) + 315).should == DateTime.ordinal(2008, 325)
10
+ end
11
+
12
+ it "should add a fractional number of days to a Date" do
13
+ (DateTime.civil(2007,2,27) + 315.5).should == DateTime.civil(2008, 1, 8, 12)
14
+ (DateTime.commercial(2007,2,2) + 315.75).should == DateTime.commercial(2007, 47, 2, 18)
15
+ (DateTime.jd(2454782) + 315.25).should == DateTime.jd(2455097, 6)
16
+ (DateTime.ordinal(2008, 10) + 315.25).should == DateTime.ordinal(2008, 325, 6)
17
+ end
18
+
19
+ it "should add a negative number of days to a Date" do
20
+ d = DateTime.civil(2007,2,27).+(-10)
21
+ d.should == DateTime.civil(2007, 2, 17)
22
+ end
23
+
24
+ it "should add a fractional negative number of days to a Date" do
25
+ d = DateTime.civil(2007,2,27).+(-10.5)
26
+ d.should == DateTime.civil(2007, 2, 16, 12)
27
+ end
28
+
29
+ it "should raise an error on non numeric parameters" do
30
+ lambda { DateTime.civil(2007,2,27) + :hello }.should raise_error(TypeError)
31
+ lambda { DateTime.civil(2007,2,27) + "hello" }.should raise_error(TypeError)
32
+ lambda { DateTime.civil(2007,2,27) + DateTime.new(2007,2,27) }.should raise_error(TypeError)
33
+ lambda { DateTime.civil(2007,2,27) + Object.new }.should raise_error(TypeError)
34
+ end
35
+
36
+ end
@@ -0,0 +1,43 @@
1
+ require File.expand_path('../../spec_helper', __FILE__)
2
+
3
+ describe "DateTime#<=>" do
4
+
5
+ it "should be able to compare two same DateTimes" do
6
+ (DateTime.civil(2000, 04, 06) <=> DateTime.civil(2000, 04, 06)).should == 0
7
+ (DateTime.civil(2000, 04, 06, 10, 12, 11) <=> DateTime.civil(2000, 04, 06, 10, 12, 11)).should == 0
8
+ end
9
+
10
+ it "should be able to compute the difference between two DateTimes" do
11
+ (DateTime.civil(2000, 04, 05) <=> DateTime.civil(2000, 04, 06)).should == -1
12
+ (DateTime.civil(2001, 04, 05) <=> DateTime.civil(2000, 04, 06)).should == 1
13
+ (DateTime.civil(2000, 04, 05, 10, 12, 13, 1/24.0) <=> DateTime.civil(2000, 04, 05, 10, 12, 13, 2/24.0)).should == 1
14
+ (DateTime.civil(2001, 04, 05, 10, 12, 13, 1/24.0) <=> DateTime.civil(2001, 04, 05, 10, 12, 13, 0)).should == -1
15
+ end
16
+
17
+ it "should be able to compare to another numeric" do
18
+ (DateTime.civil(2000, 04, 05) <=> DateTime.civil(2000, 04, 06).jd).should == -1
19
+ (DateTime.civil(2001, 04, 05) <=> DateTime.civil(2000, 04, 06).jd).should == 1
20
+
21
+ (DateTime.civil(2000, 04, 05).jd <=> 2451640).should == 0
22
+ (DateTime.civil(2000, 04, 05) <=> 2451640.00000001).should == -1
23
+ (DateTime.civil(2000, 04, 05) <=> 2451639.99999999).should == 1
24
+ end
25
+
26
+ end
27
+
28
+ describe "DateTime#between?" do
29
+ it "should be true if the DateTime falls in between the two given DateTimes" do
30
+ (DateTime.civil(2000, 04, 06).between?(DateTime.civil(2000, 04, 05), DateTime.civil(2000, 04, 07))).should == true
31
+ (DateTime.civil(2000, 04, 06).between?(DateTime.civil(2000, 04, 06), DateTime.civil(2000, 04, 07))).should == true
32
+ (DateTime.civil(2000, 04, 06).between?(DateTime.civil(2000, 04, 05), DateTime.civil(2000, 04, 06))).should == true
33
+
34
+ (DateTime.civil(2000, 04, 06, 10, 12, 11, 3/24.0).between?(DateTime.civil(2000, 04, 06, 10, 12, 11, 4/24.0), DateTime.civil(2000, 04, 06, 10, 12, 11, 2/24.0))).should == true
35
+ (DateTime.civil(2000, 04, 06, 10, 12, 11, 2/24.0).between?(DateTime.civil(2000, 04, 06, 10, 12, 11, 4/24.0), DateTime.civil(2000, 04, 06, 10, 12, 11, 2/24.0))).should == true
36
+ (DateTime.civil(2000, 04, 06, 10, 12, 11, 4/24.0).between?(DateTime.civil(2000, 04, 06, 10, 12, 11, 4/24.0), DateTime.civil(2000, 04, 06, 10, 12, 11, 2/24.0))).should == true
37
+ end
38
+
39
+ it "should be false if the DateTime does not fall in between the two given DateTimes" do
40
+ (DateTime.civil(2000, 04, 05).between?(DateTime.civil(2000, 04, 06), DateTime.civil(2000, 04, 07))).should == false
41
+ (DateTime.civil(2000, 04, 06, 10, 12, 11, 5/24.0).between?(DateTime.civil(2000, 04, 06, 10, 12, 11, 4/24.0), DateTime.civil(2000, 04, 06, 10, 12, 11, 2/24.0))).should == false
42
+ end
43
+ end
@@ -0,0 +1,142 @@
1
+ require File.expand_path('../../spec_helper', __FILE__)
2
+
3
+ describe "DateTime constructors" do
4
+ it ".civil creates a datetime with arguments" do
5
+ d = DateTime.civil(2000, 3, 5, 6, 7, 8, 1/24.0)
6
+ d.year.should == 2000
7
+ d.month.should == 3
8
+ d.day.should == 5
9
+ d.hour.should == 6
10
+ d.min.should == 7
11
+ d.sec.should == 8
12
+ d.offset.should == 1/24.0
13
+ end
14
+
15
+ it ".civil should have defaults and an optional sg value" do
16
+ DateTime.civil.should == DateTime.jd
17
+ DateTime.civil(2008).should == DateTime.civil(2008, 1, 1, 0, 0, 0, 0.0)
18
+ DateTime.civil(2008, 1).should == DateTime.civil(2008, 1, 1, 0, 0, 0, 0.0)
19
+ DateTime.civil(2008, 1, 1).should == DateTime.civil(2008, 1, 1, 0, 0, 0, 0.0)
20
+ DateTime.civil(2008, 1, 1, 0).should == DateTime.civil(2008, 1, 1, 0, 0, 0, 0.0)
21
+ DateTime.civil(2008, 1, 1, 0, 0).should == DateTime.civil(2008, 1, 1, 0, 0, 0, 0.0)
22
+ DateTime.civil(2008, 1, 1, 0, 0, 0).should == DateTime.civil(2008, 1, 1, 0, 0, 0, 0.0)
23
+ DateTime.civil(2008, 1, 1, 0, 0, 0, 0.0).should == DateTime.civil(2008, 1, 1, 0, 0, 0, 0.0)
24
+ DateTime.civil(2008, 1, 1, 1, 1, 1, 0.5, 1).should == DateTime.civil(2008, 1, 1, 1, 1, 1, 0.5)
25
+ end
26
+
27
+ it ".commercial creates a datetime with arguments" do
28
+ d = DateTime.commercial(2000, 3, 5, 6, 7, 8, 1/24.0)
29
+ d.cwyear.should == 2000
30
+ d.cweek.should == 3
31
+ d.cwday.should == 5
32
+ d.hour.should == 6
33
+ d.min.should == 7
34
+ d.sec.should == 8
35
+ d.offset.should == 1/24.0
36
+ end
37
+
38
+ ruby_version_is "1.9" do
39
+ it ".commercial should have defaults and an optional sg value" do
40
+ DateTime.commercial.should == DateTime.jd
41
+ DateTime.commercial(2008).should == DateTime.commercial(2008, 1, 1, 0, 0, 0, 0.0)
42
+ DateTime.commercial(2008, 1).should == DateTime.commercial(2008, 1, 1, 0, 0, 0, 0.0)
43
+ DateTime.commercial(2008, 1, 1).should == DateTime.commercial(2008, 1, 1, 0, 0, 0, 0.0)
44
+ DateTime.commercial(2008, 1, 1, 0).should == DateTime.commercial(2008, 1, 1, 0, 0, 0, 0.0)
45
+ DateTime.commercial(2008, 1, 1, 0, 0).should == DateTime.commercial(2008, 1, 1, 0, 0, 0, 0.0)
46
+ DateTime.commercial(2008, 1, 1, 0, 0, 0).should == DateTime.commercial(2008, 1, 1, 0, 0, 0, 0.0)
47
+ DateTime.commercial(2008, 1, 1, 0, 0, 0, 0.0).should == DateTime.commercial(2008, 1, 1, 0, 0, 0, 0.0)
48
+ DateTime.commercial(2008, 1, 1, 1, 1, 1, 0.5, 1).should == DateTime.commercial(2008, 1, 1, 1, 1, 1, 0.5)
49
+ end
50
+ end
51
+
52
+ ruby_version_is "" ... "1.9" do
53
+ it ".commercial should have defaults and an optional sg value" do
54
+ DateTime.commercial.should == DateTime.commercial(1582, 41, 5)
55
+ DateTime.commercial(2008).should == DateTime.commercial(2008, 41, 5, 0, 0, 0, 0.0)
56
+ DateTime.commercial(2008, 1).should == DateTime.commercial(2008, 1, 5, 0, 0, 0, 0.0)
57
+ DateTime.commercial(2008, 1, 1).should == DateTime.commercial(2008, 1, 1, 0, 0, 0, 0.0)
58
+ DateTime.commercial(2008, 1, 1, 0).should == DateTime.commercial(2008, 1, 1, 0, 0, 0, 0.0)
59
+ DateTime.commercial(2008, 1, 1, 0, 0).should == DateTime.commercial(2008, 1, 1, 0, 0, 0, 0.0)
60
+ DateTime.commercial(2008, 1, 1, 0, 0, 0).should == DateTime.commercial(2008, 1, 1, 0, 0, 0, 0.0)
61
+ DateTime.commercial(2008, 1, 1, 0, 0, 0, 0.0).should == DateTime.commercial(2008, 1, 1, 0, 0, 0, 0.0)
62
+ DateTime.commercial(2008, 1, 1, 1, 1, 1, 0.5, 1).should == DateTime.commercial(2008, 1, 1, 1, 1, 1, 0.5)
63
+ end
64
+ end
65
+
66
+ it ".jd creates a datetime with arguments" do
67
+ d = DateTime.jd(2000, 6, 7, 8, 1/24.0)
68
+ d.jd.should == 2000
69
+ d.hour.should == 6
70
+ d.min.should == 7
71
+ d.sec.should == 8
72
+ d.offset.should == 1/24.0
73
+ end
74
+
75
+ it ".jd should have defaults and an optional sg value" do
76
+ DateTime.jd.should == DateTime.jd(0, 0, 0, 0, 0)
77
+ DateTime.jd(0).should == DateTime.jd(0, 0, 0, 0, 0)
78
+ DateTime.jd(0, 0).should == DateTime.jd(0, 0, 0, 0, 0)
79
+ DateTime.jd(0, 0, 0).should == DateTime.jd(0, 0, 0, 0, 0)
80
+ DateTime.jd(0, 0, 0, 0).should == DateTime.jd(0, 0, 0, 0, 0)
81
+ DateTime.jd(0, 0, 0, 0, 0).should == DateTime.jd(0, 0, 0, 0, 0)
82
+ DateTime.jd(2008, 1, 1, 1, 0.5, 1).should == DateTime.jd(2008, 1, 1, 1, 0.5)
83
+ end
84
+
85
+ it ".new! creates a datetime with arguments" do
86
+ d = DateTime.new!(2422222)
87
+ d.jd.should == 2422222
88
+ d.hour.should == 12
89
+ d.min.should == 0
90
+ d.sec.should == 0
91
+ d.offset.should == 0
92
+
93
+ d = DateTime.new!(2422222.5)
94
+ d.jd.should == 2422223
95
+ d.hour.should == 0
96
+ d.min.should == 0
97
+ d.sec.should == 0
98
+ d.offset.should == 0
99
+
100
+ d = DateTime.new!(2422222, 0.5)
101
+ d.jd.should == 2422223
102
+ d.hour.should == 0
103
+ d.min.should == 0
104
+ d.sec.should == 0
105
+ d.offset.should == 0.5
106
+
107
+ d = DateTime.new!(2422222.5, 0.5)
108
+ d.jd.should == 2422223
109
+ d.hour.should == 12
110
+ d.min.should == 0
111
+ d.sec.should == 0
112
+ d.offset.should == 0.5
113
+ end
114
+
115
+ it ".new! should have defaults and an optional sg value" do
116
+ DateTime.new!.should == DateTime.jd
117
+ DateTime.new!(0).should == DateTime.new!(0, 0)
118
+ DateTime.new!(0, 0).should == DateTime.new!(0, 0)
119
+ DateTime.new!(2008, 0.5, 1).should == DateTime.new!(2008, 0.5)
120
+ end
121
+
122
+ it ".ordinal creates a datetime with arguments" do
123
+ d = DateTime.ordinal(2000, 100, 6, 7, 8, 1/24.0)
124
+ d.year.should == 2000
125
+ d.yday.should == 100
126
+ d.hour.should == 6
127
+ d.min.should == 7
128
+ d.sec.should == 8
129
+ d.offset.should == 1/24.0
130
+ end
131
+
132
+ it ".ordinal should have defaults and an optional sg value" do
133
+ DateTime.ordinal.should == DateTime.jd
134
+ DateTime.ordinal(2008).should == DateTime.ordinal(2008, 1, 0, 0, 0, 0)
135
+ DateTime.ordinal(2008, 1).should == DateTime.ordinal(2008, 1, 0, 0, 0, 0)
136
+ DateTime.ordinal(2008, 1, 0).should == DateTime.ordinal(2008, 1, 0, 0, 0, 0)
137
+ DateTime.ordinal(2008, 1, 0, 0).should == DateTime.ordinal(2008, 1, 0, 0, 0, 0)
138
+ DateTime.ordinal(2008, 1, 0, 0, 0).should == DateTime.ordinal(2008, 1, 0, 0, 0, 0)
139
+ DateTime.ordinal(2008, 1, 0, 0, 0, 0).should == DateTime.ordinal(2008, 1, 0, 0, 0, 0)
140
+ DateTime.ordinal(2008, 1, 1, 1, 1, 0.5, 1).should == DateTime.ordinal(2008, 1, 1, 1, 1, 0.5)
141
+ end
142
+ end
@@ -0,0 +1,54 @@
1
+ require File.expand_path('../../spec_helper', __FILE__)
2
+
3
+ describe "DateTime conversions" do
4
+ it "#new_offset should be a separate datetime with a modified offset" do
5
+ DateTime.new(2008, 1, 1).new_offset(0.5).to_s.should == DateTime.new(2008, 1, 1, 12, 0, 0, 0.5).to_s
6
+ end
7
+
8
+ it "#new_offset result should be equal to the receiver" do
9
+ DateTime.new(2008, 1, 1).new_offset(0.5).should == DateTime.new(2008, 1, 1)
10
+ end
11
+
12
+ ruby_version_is "" ... "1.9" do
13
+ it "#newof should be a separate datetime with a modified offset" do
14
+ DateTime.new(2008, 1, 1).newof(0.5).to_s.should == DateTime.new(2008, 1, 1, 12, 0, 0, 0.5).to_s
15
+ end
16
+ end
17
+ end
18
+
19
+ describe "DateTime marshalling" do
20
+ it "should marshal and unmarshal correctly" do
21
+ Marshal.load(Marshal.dump(DateTime.jd)).should == DateTime.civil
22
+ d = DateTime.now
23
+ Marshal.load(Marshal.dump(d)).should == d
24
+ Marshal.load(Marshal.dump(DateTime.civil(2010, 2, 4, 1, 2, 4, 4/24.0))).should == DateTime.civil(2010, 2, 4, 1, 2, 4, 4/24.0)
25
+ end
26
+ end
27
+
28
+ ruby_version_is "1.9" do
29
+ describe "DateTime#to_datetime" do
30
+ it " should return the receiver" do
31
+ DateTime.new(2009, 1, 2, 3, 4, 5, 0.5).to_datetime.should == DateTime.new(2009, 1, 2, 3, 4, 5, 0.5)
32
+ end
33
+ end
34
+
35
+ describe "DateTime#to_date" do
36
+ it " should return a Date with the same date as receiver" do
37
+ DateTime.new(2009, 1, 2, 12).to_date.should == Date.new(2009, 1, 2)
38
+ end
39
+ end
40
+
41
+ describe "DateTime#to_time" do
42
+ it " should return a Time in local time with the same year, month, day as the receiver" do
43
+ DateTime.new(2009, 1, 2, 3, 4, 5).to_time.should == Time.utc(2009, 1, 2, 3, 4, 5).getlocal
44
+ end
45
+ end
46
+
47
+ describe "Time#to_datetime" do
48
+ it " should return a Date with the same year, month, and day as the receiver" do
49
+ Time.utc(2009, 1, 2, 3, 4, 5).to_datetime.should == DateTime.new(2009, 1, 2, 3, 4, 5)
50
+ Time.utc(2009, 1, 2, 3, 4, 5).getlocal.to_datetime.should == DateTime.new(2009, 1, 2, 3, 4, 5)
51
+ end
52
+ end
53
+ end
54
+
@@ -0,0 +1,73 @@
1
+ require File.expand_path('../../spec_helper', __FILE__)
2
+
3
+ ruby_version_is "1.9" do
4
+ describe "DateTime#sunday?" do
5
+ it "should return true if the day is a Sunday" do
6
+ DateTime.civil(2009,1,4).sunday?.should == true
7
+ end
8
+
9
+ it "should return false if the day is not a Sunday" do
10
+ DateTime.civil(2009,1,2).sunday?.should == false
11
+ end
12
+ end
13
+
14
+ describe "DateTime#monday?" do
15
+ it "should return true if the day is a Monday" do
16
+ DateTime.civil(2009,1,5).monday?.should == true
17
+ end
18
+
19
+ it "should return false if the day is not a Monday" do
20
+ DateTime.civil(2009,1,2).monday?.should == false
21
+ end
22
+ end
23
+
24
+ describe "DateTime#tuesday?" do
25
+ it "should return true if the day is a Tuesday" do
26
+ DateTime.civil(2009,1,6).tuesday?.should == true
27
+ end
28
+
29
+ it "should return false if the day is not a Tuesday" do
30
+ DateTime.civil(2009,1,2).tuesday?.should == false
31
+ end
32
+ end
33
+
34
+ describe "DateTime#wednesday?" do
35
+ it "should return true if the day is a Wednesday" do
36
+ DateTime.civil(2009,1,7).wednesday?.should == true
37
+ end
38
+
39
+ it "should return false if the day is not a Tuesday" do
40
+ DateTime.civil(2009,1,2).wednesday?.should == false
41
+ end
42
+ end
43
+
44
+ describe "DateTime#thursday?" do
45
+ it "should return true if the day is a Thursday" do
46
+ DateTime.civil(2009,1,1).thursday?.should == true
47
+ end
48
+
49
+ it "should return false if the day is not a Thursday" do
50
+ DateTime.civil(2009,1,2).thursday?.should == false
51
+ end
52
+ end
53
+
54
+ describe "DateTime#friday?" do
55
+ it "should return true if the day is a Friday" do
56
+ DateTime.civil(2009,1,2).friday?.should == true
57
+ end
58
+
59
+ it "should return false if the day is not a Friday" do
60
+ DateTime.civil(2009,1,1).friday?.should == false
61
+ end
62
+ end
63
+
64
+ describe "DateTime#saturday?" do
65
+ it "should return true if the day is a Saturday" do
66
+ DateTime.civil(2009,1,3).saturday?.should == true
67
+ end
68
+
69
+ it "should return false if the day is not a Saturday" do
70
+ DateTime.civil(2009,1,2).saturday?.should == false
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,39 @@
1
+ require File.expand_path('../../spec_helper', __FILE__)
2
+
3
+ describe "DateTime#downto" do
4
+
5
+ it "should be able to step backward in time" do
6
+ ds = DateTime.civil(2000, 4, 14)
7
+ de = DateTime.civil(2000, 3, 29)
8
+ count = 0
9
+ ds.downto(de) do |d|
10
+ d.should <= ds
11
+ d.should >= de
12
+ count += 1
13
+ end
14
+ count.should == 17
15
+ end
16
+
17
+ it "should respect fractional days" do
18
+ ds = DateTime.civil(2000, 4, 14, 0)
19
+ de = DateTime.civil(2000, 3, 29, 12)
20
+ count = 0
21
+ ds.downto(de) do |d|
22
+ d.should <= ds
23
+ d.should >= de
24
+ count += 1
25
+ end
26
+ count.should == 16
27
+
28
+ ds = DateTime.civil(2000, 4, 14, 12)
29
+ de = DateTime.civil(2000, 3, 29, 0)
30
+ count = 0
31
+ ds.downto(de) do |d|
32
+ d.should <= ds
33
+ d.should >= de
34
+ count += 1
35
+ end
36
+ count.should == 17
37
+ end
38
+
39
+ end
@@ -0,0 +1,17 @@
1
+ require File.expand_path('../../spec_helper', __FILE__)
2
+
3
+ describe "DateTime#eql?" do
4
+ it "should be able determine equality between date objects" do
5
+ DateTime.civil(2007, 10, 11).should eql(DateTime.civil(2007, 10, 11))
6
+ DateTime.civil(2007, 10, 11, 10, 11, 12, 0.5).should eql(DateTime.civil(2007, 10, 11, 10, 11, 12, 0.5))
7
+ DateTime.civil(2007, 10, 11, 10, 11, 12, 0.5).should eql(DateTime.civil(2007, 10, 12, 10, 11, 12, 0.5) - 1)
8
+ DateTime.civil(2007, 10, 11, 10, 11, 12, 0.5).should_not eql(DateTime.civil(2007, 10, 11, 10, 11, 12, 0.4))
9
+ end
10
+
11
+ it "should be able determine equality between a date and a datetime objects" do
12
+ DateTime.civil(2007, 10, 11).should eql(Date.civil(2007, 10, 11))
13
+ DateTime.civil(2007, 10, 11).should eql(Date.civil(2007, 10, 12) - 1)
14
+ DateTime.civil(2007, 10, 11).should_not eql(Date.civil(2007, 10, 12))
15
+ DateTime.civil(2007, 10, 11, 1).should_not eql(Date.civil(2007, 10, 11))
16
+ end
17
+ end