third_base 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/LICENSE +19 -0
- data/README +261 -0
- data/benchmark/date.rb +18 -0
- data/benchmark/datetime.rb +18 -0
- data/bin/third_base +4 -0
- data/lib/third_base/compat/date/format.rb +3 -0
- data/lib/third_base/compat/date.rb +3 -0
- data/lib/third_base/compat.rb +405 -0
- data/lib/third_base/date.rb +674 -0
- data/lib/third_base/datetime.rb +385 -0
- data/lib/third_base.rb +2 -0
- data/spec/compat/compat_class_methods_spec.rb +208 -0
- data/spec/compat/compat_instance_methods_spec.rb +54 -0
- data/spec/compat/date_spec.rb +56 -0
- data/spec/compat/datetime_spec.rb +77 -0
- data/spec/compat_spec_helper.rb +2 -0
- data/spec/date/accessor_spec.rb +134 -0
- data/spec/date/add_month_spec.rb +28 -0
- data/spec/date/add_spec.rb +24 -0
- data/spec/date/boat_spec.rb +31 -0
- data/spec/date/civil_spec.rb +47 -0
- data/spec/date/commercial_spec.rb +34 -0
- data/spec/date/constants_spec.rb +18 -0
- data/spec/date/downto_spec.rb +17 -0
- data/spec/date/eql_spec.rb +9 -0
- data/spec/date/hash_spec.rb +13 -0
- data/spec/date/julian_spec.rb +13 -0
- data/spec/date/leap_spec.rb +19 -0
- data/spec/date/minus_month_spec.rb +26 -0
- data/spec/date/minus_spec.rb +47 -0
- data/spec/date/ordinal_spec.rb +13 -0
- data/spec/date/parse_spec.rb +227 -0
- data/spec/date/step_spec.rb +55 -0
- data/spec/date/strftime_spec.rb +132 -0
- data/spec/date/strptime_spec.rb +118 -0
- data/spec/date/succ_spec.rb +16 -0
- data/spec/date/today_spec.rb +11 -0
- data/spec/date/upto_spec.rb +17 -0
- data/spec/date_spec_helper.rb +3 -0
- data/spec/datetime/accessor_spec.rb +53 -0
- data/spec/datetime/add_spec.rb +36 -0
- data/spec/datetime/boat_spec.rb +43 -0
- data/spec/datetime/constructor_spec.rb +58 -0
- data/spec/datetime/eql_spec.rb +11 -0
- data/spec/datetime/minus_spec.rb +65 -0
- data/spec/datetime/now_spec.rb +14 -0
- data/spec/datetime/parse_spec.rb +338 -0
- data/spec/datetime/strftime_spec.rb +102 -0
- data/spec/datetime/strptime_spec.rb +84 -0
- data/spec/datetime_spec_helper.rb +3 -0
- data/spec/spec_helper.rb +54 -0
- metadata +107 -0
@@ -0,0 +1,227 @@
|
|
1
|
+
require(File.join(File.dirname(__FILE__), '..', 'date_spec_helper'))
|
2
|
+
|
3
|
+
describe "Date#parse" do
|
4
|
+
it "can't handle a empty string" do
|
5
|
+
lambda{ Date.parse("") }.should raise_error(ArgumentError)
|
6
|
+
end
|
7
|
+
|
8
|
+
# Specs using numbers
|
9
|
+
it "can't handle a single digit" do
|
10
|
+
lambda{ Date.parse("1") }.should raise_error(ArgumentError)
|
11
|
+
end
|
12
|
+
|
13
|
+
it "can handle DD as month day number" do
|
14
|
+
Date.parse("10").should == Date.civil(Date.today.year, Date.today.month, 10)
|
15
|
+
end
|
16
|
+
|
17
|
+
it "can handle DDD as year day number" do
|
18
|
+
Date.parse("050").should == Date.civil(Date.today.year, 2, 19)
|
19
|
+
end
|
20
|
+
|
21
|
+
it "can handle MMDD as month and day" do
|
22
|
+
Date.parse("1108").should == Date.civil(Date.today.year, 11, 8)
|
23
|
+
end
|
24
|
+
|
25
|
+
it "can handle YYDDD as year and day number" do
|
26
|
+
Date.parse("10100").should == Date.civil(2010, 4, 10)
|
27
|
+
end
|
28
|
+
|
29
|
+
it "can handle YYMMDD as year month and day" do
|
30
|
+
Date.parse("201023").should == Date.civil(2020, 10, 23)
|
31
|
+
end
|
32
|
+
|
33
|
+
it "can handle YYYYDDD as year and day number" do
|
34
|
+
Date.parse("1910100").should == Date.civil(1910, 4, 10)
|
35
|
+
end
|
36
|
+
|
37
|
+
it "can handle YYYYMMDD as year and day number" do
|
38
|
+
Date.parse("19101101").should == Date.civil(1910, 11, 1)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe :date_parse, :shared => true do
|
43
|
+
it "can parse a mmm-YYYY string into a Date object" do
|
44
|
+
d = Date.parse("feb#{@sep}2008")
|
45
|
+
d.year.should == 2008
|
46
|
+
d.month.should == 2
|
47
|
+
d.day.should == 1
|
48
|
+
end
|
49
|
+
|
50
|
+
it "can parse a 'DD mmm YYYY' string into a Date object" do
|
51
|
+
d = Date.parse("23#{@sep}feb#{@sep}2008")
|
52
|
+
d.year.should == 2008
|
53
|
+
d.month.should == 2
|
54
|
+
d.day.should == 23
|
55
|
+
end
|
56
|
+
|
57
|
+
it "can parse a 'mmm DD YYYY' string into a Date object" do
|
58
|
+
d = Date.parse("feb#{@sep}23#{@sep}2008")
|
59
|
+
d.year.should == 2008
|
60
|
+
d.month.should == 2
|
61
|
+
d.day.should == 23
|
62
|
+
|
63
|
+
d = Date.parse("feb#{@sep}23,#{@sep}2008")
|
64
|
+
d.year.should == 2008
|
65
|
+
d.month.should == 2
|
66
|
+
d.day.should == 23
|
67
|
+
|
68
|
+
d = Date.parse("feb#{@sep}23,#{@sep}08")
|
69
|
+
d.year.should == 2008
|
70
|
+
d.month.should == 2
|
71
|
+
d.day.should == 23
|
72
|
+
end
|
73
|
+
|
74
|
+
it "can parse a 'YYYY mmm DD' string into a Date object" do
|
75
|
+
d = Date.parse("2008#{@sep}feb#{@sep}23")
|
76
|
+
d.year.should == 2008
|
77
|
+
d.month.should == 2
|
78
|
+
d.day.should == 23
|
79
|
+
end
|
80
|
+
|
81
|
+
it "can parse a month name and day into a Date object" do
|
82
|
+
Date.parse("november#{@sep}5th").should == Date.civil(Date.today.year, 11, 5)
|
83
|
+
end
|
84
|
+
|
85
|
+
it "can parse a month name, day and year into a Date object" do
|
86
|
+
Date.parse("november#{@sep}5th#{@sep}2005").should == Date.civil(2005, 11, 5)
|
87
|
+
end
|
88
|
+
|
89
|
+
it "can parse a year, month name and day into a Date object" do
|
90
|
+
Date.parse("2005#{@sep}november#{@sep}5th").should == Date.civil(2005, 11, 5)
|
91
|
+
end
|
92
|
+
|
93
|
+
it "can parse a year, day and month name into a Date object" do
|
94
|
+
Date.parse("5th#{@sep}november#{@sep}2005").should == Date.civil(2005, 11, 5)
|
95
|
+
end
|
96
|
+
|
97
|
+
it "can handle negative year numbers" do
|
98
|
+
Date.parse("5th#{@sep}november#{@sep}-2005").should == Date.civil(-2005, 11, 5)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
describe :date_parse_us, :shared => true do
|
103
|
+
it "parses a YYYY#{@sep}MM#{@sep}DD string into a Date object" do
|
104
|
+
d = Date.parse("2007#{@sep}10#{@sep}01")
|
105
|
+
d.year.should == 2007
|
106
|
+
d.month.should == 10
|
107
|
+
d.day.should == 1
|
108
|
+
end
|
109
|
+
|
110
|
+
it "parses a MM#{@sep}DD#{@sep}YYYY string into a Date object" do
|
111
|
+
d = Date.parse("10#{@sep}01#{@sep}2007")
|
112
|
+
d.year.should == 2007
|
113
|
+
d.month.should == 10
|
114
|
+
d.day.should == 1
|
115
|
+
end
|
116
|
+
|
117
|
+
it "parses a MM#{@sep}DD#{@sep}YY string into a Date object using the year digits as 20XX" do
|
118
|
+
d = Date.parse("10#{@sep}01#{@sep}07")
|
119
|
+
d.year.should == 2007
|
120
|
+
d.month.should == 10
|
121
|
+
d.day.should == 1
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
describe :date_parse_eu, :shared => true do
|
126
|
+
before do
|
127
|
+
Date.use_parsers(:iso, :eu)
|
128
|
+
end
|
129
|
+
after do
|
130
|
+
Date.reset_parsers!
|
131
|
+
end
|
132
|
+
|
133
|
+
# The - separator let's it work like European format, so it as a different spec
|
134
|
+
it "can parse a YYYY-MM-DD string into a Date object" do
|
135
|
+
d = Date.parse("2007#{@sep}10#{@sep}01")
|
136
|
+
d.year.should == 2007
|
137
|
+
d.month.should == 10
|
138
|
+
d.day.should == 1
|
139
|
+
end
|
140
|
+
|
141
|
+
it "can parse a DD-MM-YYYY string into a Date object" do
|
142
|
+
d = Date.parse("10#{@sep}01#{@sep}2007")
|
143
|
+
d.year.should == 2007
|
144
|
+
d.month.should == 1
|
145
|
+
d.day.should == 10
|
146
|
+
end
|
147
|
+
|
148
|
+
it "can parse a YY-MM-DD string into a Date object" do
|
149
|
+
d = Date.parse("10#{@sep}01#{@sep}07")
|
150
|
+
d.year.should == 2010
|
151
|
+
d.month.should == 1
|
152
|
+
d.day.should == 7
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
|
157
|
+
describe "Date#parse with '.' separator" do
|
158
|
+
before :all do
|
159
|
+
@sep = '.'
|
160
|
+
end
|
161
|
+
|
162
|
+
it_should_behave_like "date_parse"
|
163
|
+
end
|
164
|
+
|
165
|
+
describe "Date#parse with '/' separator" do
|
166
|
+
before :all do
|
167
|
+
@sep = '/'
|
168
|
+
end
|
169
|
+
|
170
|
+
it_should_behave_like "date_parse"
|
171
|
+
end
|
172
|
+
|
173
|
+
describe "Date#parse with ' ' separator" do
|
174
|
+
before :all do
|
175
|
+
@sep = ' '
|
176
|
+
end
|
177
|
+
|
178
|
+
it_should_behave_like "date_parse"
|
179
|
+
end
|
180
|
+
|
181
|
+
describe "Date#parse with '/' separator US-style" do
|
182
|
+
before :all do
|
183
|
+
@sep = '/'
|
184
|
+
end
|
185
|
+
|
186
|
+
it_should_behave_like "date_parse_us"
|
187
|
+
end
|
188
|
+
|
189
|
+
ruby_version_is "" ... "1.8.7" do
|
190
|
+
describe "Date#parse with '.' separator US-style" do
|
191
|
+
before :all do
|
192
|
+
@sep = '.'
|
193
|
+
end
|
194
|
+
|
195
|
+
it_should_behave_like "date_parse_us"
|
196
|
+
end
|
197
|
+
end
|
198
|
+
|
199
|
+
describe "Date#parse with '-' separator EU-style" do
|
200
|
+
before :all do
|
201
|
+
@sep = '-'
|
202
|
+
end
|
203
|
+
|
204
|
+
it_should_behave_like "date_parse_eu"
|
205
|
+
end
|
206
|
+
|
207
|
+
describe "Date parser modifications" do
|
208
|
+
after do
|
209
|
+
Date.reset_parsers!
|
210
|
+
end
|
211
|
+
|
212
|
+
it "should be able to add a parser to an existing parser type that takes precedence" do
|
213
|
+
proc{Date.parse("today")}.should raise_error(ArgumentError)
|
214
|
+
Date.add_parser(:iso, /today/){t = Time.now; {:civil=>[t.year, t.mon, t.day]}}
|
215
|
+
Date.parse("today").should == Date.today
|
216
|
+
end
|
217
|
+
|
218
|
+
it "should be able to add new parser types" do
|
219
|
+
proc{Date.parse("today")}.should raise_error(ArgumentError)
|
220
|
+
Date.add_parser_type(:mine)
|
221
|
+
Date.add_parser(:mine, /today/){t = Time.now; {:civil=>[t.year, t.mon, t.day]}}
|
222
|
+
proc{Date.parse("today")}.should raise_error(ArgumentError)
|
223
|
+
Date.parse("today", :parser_types=>[:mine]).should == Date.today
|
224
|
+
Date.use_parsers(:mine)
|
225
|
+
Date.parse("today").should == Date.today
|
226
|
+
end
|
227
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require(File.join(File.dirname(__FILE__), '..', 'date_spec_helper'))
|
2
|
+
|
3
|
+
describe "Date#step" 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.step(ds) do |d|
|
10
|
+
d.should <= ds
|
11
|
+
d.should >= de
|
12
|
+
count += 1
|
13
|
+
end
|
14
|
+
count.should == 13
|
15
|
+
|
16
|
+
count = 0
|
17
|
+
de.step(ds, 5) do |d|
|
18
|
+
d.should <= ds
|
19
|
+
d.should >= de
|
20
|
+
count += 1
|
21
|
+
end
|
22
|
+
count.should == 3
|
23
|
+
|
24
|
+
count = 0
|
25
|
+
ds.step(de) do |d|; count += 1; end
|
26
|
+
count.should == 0
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should be able to step backward in time" do
|
31
|
+
ds = Date.civil(2000, 4, 14)
|
32
|
+
de = Date.civil(2000, 3, 29)
|
33
|
+
count = 0
|
34
|
+
ds.step(de, -1) do |d|
|
35
|
+
d.should <= ds
|
36
|
+
d.should >= de
|
37
|
+
count += 1
|
38
|
+
end
|
39
|
+
count.should == 17
|
40
|
+
|
41
|
+
count = 0
|
42
|
+
ds.step(de, -5) do |d|
|
43
|
+
d.should <= ds
|
44
|
+
d.should >= de
|
45
|
+
count += 1
|
46
|
+
end
|
47
|
+
count.should == 4
|
48
|
+
|
49
|
+
count = 0
|
50
|
+
de.step(ds, -1) do |d|; count += 1; end
|
51
|
+
count.should == 0
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
@@ -0,0 +1,132 @@
|
|
1
|
+
require(File.join(File.dirname(__FILE__), '..', 'date_spec_helper'))
|
2
|
+
|
3
|
+
describe "Date#strftime" do
|
4
|
+
|
5
|
+
it "should be able to print the date" do
|
6
|
+
Date.civil(2000, 4, 6).strftime.should == "2000-04-06"
|
7
|
+
Date.civil(2000, 4, 6).strftime.should == Date.civil(2000, 4, 6).to_s
|
8
|
+
end
|
9
|
+
|
10
|
+
it "should be able to print the full day name" do
|
11
|
+
Date.civil(2000, 4, 6).strftime("%A").should == "Thursday"
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should be able to print the short day name" do
|
15
|
+
Date.civil(2000, 4, 6).strftime("%a").should == "Thu"
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should be able to print the full month name" do
|
19
|
+
Date.civil(2000, 4, 6).strftime("%B").should == "April"
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should be able to print the short month name" do
|
23
|
+
Date.civil(2000, 4, 6).strftime("%b").should == "Apr"
|
24
|
+
Date.civil(2000, 4, 6).strftime("%h").should == "Apr"
|
25
|
+
Date.civil(2000, 4, 6).strftime("%b").should == Date.civil(2000, 4, 6).strftime("%h")
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should be able to print the century" do
|
29
|
+
Date.civil(2000, 4, 6).strftime("%C").should == "20"
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should be able to print the month day with leading zeroes" do
|
33
|
+
Date.civil(2000, 4, 6).strftime("%d").should == "06"
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should be able to print the month day with leading spaces" do
|
37
|
+
Date.civil(2000, 4, 6).strftime("%e").should == " 6"
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should be able to print the commercial year with leading zeroes" do
|
41
|
+
Date.civil(2000, 4, 6).strftime("%G").should == "2000"
|
42
|
+
Date.civil( 200, 4, 6).strftime("%G").should == "0200"
|
43
|
+
end
|
44
|
+
|
45
|
+
it "should be able to print the commercial year with only two digits" do
|
46
|
+
Date.civil(2000, 4, 6).strftime("%g").should == "00"
|
47
|
+
Date.civil( 200, 4, 6).strftime("%g").should == "00"
|
48
|
+
end
|
49
|
+
|
50
|
+
it "should be able to print the year day with leading zeroes" do
|
51
|
+
Date.civil(2000, 4, 6).strftime("%j").should == "097"
|
52
|
+
end
|
53
|
+
|
54
|
+
it "should be able to print the month with leading zeroes" do
|
55
|
+
Date.civil(2000, 4, 6).strftime("%m").should == "04"
|
56
|
+
end
|
57
|
+
|
58
|
+
it "should be able to add a newline" do
|
59
|
+
Date.civil(2000, 4, 6).strftime("%n").should == "\n"
|
60
|
+
end
|
61
|
+
|
62
|
+
it "should be able to add a tab" do
|
63
|
+
Date.civil(2000, 4, 6).strftime("%t").should == "\t"
|
64
|
+
end
|
65
|
+
|
66
|
+
it "should be able to show the week number with the week starting on sunday and monday" do
|
67
|
+
Date.civil(2000, 4, 6).strftime("%U").should == "14"
|
68
|
+
Date.civil(2000, 4, 6).strftime("%W").should == "14"
|
69
|
+
Date.civil(2000, 4, 6).strftime("%U").should == Date.civil(2000, 4, 6).strftime("%W")
|
70
|
+
Date.civil(2000, 4, 9).strftime("%U").should == "15"
|
71
|
+
Date.civil(2000, 4, 9).strftime("%W").should == "14"
|
72
|
+
Date.civil(2000, 4, 9).strftime("%U").should_not == Date.civil(2000, 4, 9).strftime("%W")
|
73
|
+
end
|
74
|
+
|
75
|
+
it "should be able to show the commercial week day" do
|
76
|
+
Date.civil(2000, 4, 9).strftime("%u").should == "7"
|
77
|
+
Date.civil(2000, 4, 10).strftime("%u").should == "1"
|
78
|
+
end
|
79
|
+
|
80
|
+
it "should be able to show the commercial week" do
|
81
|
+
Date.civil(2000, 4, 9).strftime("%V").should == "14"
|
82
|
+
Date.civil(2000, 4, 10).strftime("%V").should == "15"
|
83
|
+
end
|
84
|
+
|
85
|
+
it "should be able to show the week day" do
|
86
|
+
Date.civil(2000, 4, 9).strftime("%w").should == "0"
|
87
|
+
Date.civil(2000, 4, 10).strftime("%w").should == "1"
|
88
|
+
end
|
89
|
+
|
90
|
+
it "should be able to show the year in YYYY format" do
|
91
|
+
Date.civil(2000, 4, 9).strftime("%Y").should == "2000"
|
92
|
+
end
|
93
|
+
|
94
|
+
it "should be able to show the year in YY format" do
|
95
|
+
Date.civil(2000, 4, 9).strftime("%y").should == "00"
|
96
|
+
end
|
97
|
+
|
98
|
+
it "should be able to escape the % character" do
|
99
|
+
Date.civil(2000, 4, 9).strftime("%%").should == "%"
|
100
|
+
end
|
101
|
+
|
102
|
+
it "should leave %X sequences alone if it doesn't have a conversion" do
|
103
|
+
Date.civil(2000, 4, 9).strftime("%1").should == "%1"
|
104
|
+
Date.civil(2000, 4, 9).strftime("%P").should == "%P"
|
105
|
+
end
|
106
|
+
|
107
|
+
############################
|
108
|
+
# Specs that combine stuff #
|
109
|
+
############################
|
110
|
+
|
111
|
+
it "should be able to print the date with slashes" do
|
112
|
+
Date.civil(2000, 4, 6).strftime("%D").should == "04/06/00"
|
113
|
+
Date.civil(2000, 4, 6).strftime("%D").should == Date.civil(2000, 4, 6).strftime('%m/%d/%y')
|
114
|
+
end
|
115
|
+
|
116
|
+
it "should be able to print the date as YYYY-MM-DD" do
|
117
|
+
Date.civil(2000, 4, 6).strftime("%F").should == "2000-04-06"
|
118
|
+
Date.civil(2000, 4, 6).strftime("%F").should == Date.civil(2000, 4, 6).strftime('%Y-%m-%d')
|
119
|
+
end
|
120
|
+
|
121
|
+
it "should be able to show the commercial week" do
|
122
|
+
Date.civil(2000, 4, 9).strftime("%v").should == " 9-Apr-2000"
|
123
|
+
Date.civil(2000, 4, 9).strftime("%v").should == Date.civil(2000, 4, 9).strftime('%e-%b-%Y')
|
124
|
+
end
|
125
|
+
|
126
|
+
it "should be able to show MM/DD/YY" do
|
127
|
+
Date.civil(2000, 4, 6).strftime("%x").should == "04/06/00"
|
128
|
+
Date.civil(2000, 4, 6).strftime("%x").should == Date.civil(2000, 4, 6).strftime('%m/%d/%y')
|
129
|
+
end
|
130
|
+
|
131
|
+
|
132
|
+
end
|
@@ -0,0 +1,118 @@
|
|
1
|
+
require(File.join(File.dirname(__FILE__), '..', 'date_spec_helper'))
|
2
|
+
|
3
|
+
describe "Date#stpftime" do
|
4
|
+
it "should be able to parse the default date format" do
|
5
|
+
Date.strptime("2000-04-06").should == Date.civil(2000, 4, 6)
|
6
|
+
Date.civil(2000, 4, 6).strftime.should == Date.civil(2000, 4, 6).to_s
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should be able to parse the full day name" do
|
10
|
+
d = Date.today
|
11
|
+
# strptime assumed week that start on sunday, not monday
|
12
|
+
week = d.cweek
|
13
|
+
week += 1 if d.cwday == 7
|
14
|
+
Date.strptime("Thursday", "%A").should == Date.commercial(d.cwyear, week, 4)
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should be able to parse the short day name" do
|
18
|
+
d = Date.today
|
19
|
+
# strptime assumed week that start on sunday, not monday
|
20
|
+
week = d.cweek
|
21
|
+
week += 1 if d.cwday == 7
|
22
|
+
Date.strptime("Thu", "%a").should == Date.commercial(d.cwyear, week, 4)
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should be able to parse the full month name" do
|
26
|
+
d = Date.today
|
27
|
+
Date.strptime("April", "%B").should == Date.civil(d.year, 4, 1)
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should be able to parse the short month name" do
|
31
|
+
d = Date.today
|
32
|
+
Date.strptime("Apr", "%b").should == Date.civil(d.year, 4, 1)
|
33
|
+
Date.strptime("Apr", "%h").should == Date.civil(d.year, 4, 1)
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should be able to parse the century" do
|
37
|
+
Date.strptime("06 20", "%y %C").should == Date.civil(2006, 1, 1)
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should be able to parse the month day with leading zeroes" do
|
41
|
+
d = Date.today
|
42
|
+
Date.strptime("06", "%d").should == Date.civil(d.year, d.month, 6)
|
43
|
+
end
|
44
|
+
|
45
|
+
it "should be able to parse the month day with leading spaces" do
|
46
|
+
d = Date.today
|
47
|
+
Date.strptime(" 6", "%e").should == Date.civil(d.year, d.month, 6)
|
48
|
+
end
|
49
|
+
|
50
|
+
it "should be able to parse the commercial year with leading zeroes" do
|
51
|
+
Date.strptime("2000", "%G").should == Date.civil(2000, 1, 3)
|
52
|
+
Date.strptime("2002", "%G").should == Date.civil(2001, 12, 31)
|
53
|
+
end
|
54
|
+
|
55
|
+
it "should be able to parse the commercial year with only two digits" do
|
56
|
+
Date.strptime("68", "%g").should == Date.civil(2068, 1, 2)
|
57
|
+
Date.strptime("69", "%g").should == Date.civil(1968, 12, 30)
|
58
|
+
end
|
59
|
+
|
60
|
+
it "should be able to parse the year day with leading zeroes" do
|
61
|
+
d = Date.today
|
62
|
+
Date.strptime("050", "%j").should == Date.civil(2008, 2, 19)
|
63
|
+
end
|
64
|
+
|
65
|
+
it "should be able to parse the month with leading zeroes" do
|
66
|
+
d = Date.today
|
67
|
+
Date.strptime("04", "%m").should == Date.civil(d.year, 4, 1)
|
68
|
+
end
|
69
|
+
|
70
|
+
it "should be able to show the commercial day" do
|
71
|
+
Date.strptime("1", "%u").should == Date.commercial(Date.today.year, Date.today.cweek, 1)
|
72
|
+
Date.strptime("15 3", "%V %u").should == Date.commercial(Date.today.year, 15, 3)
|
73
|
+
end
|
74
|
+
|
75
|
+
it "should be able to show the commercial week" do
|
76
|
+
d = Date.commercial(Date.today.year,1,1)
|
77
|
+
Date.strptime("1", "%V").should == d
|
78
|
+
Date.strptime("15", "%V").should == Date.commercial(d.cwyear, 15, 1)
|
79
|
+
end
|
80
|
+
|
81
|
+
it "should be able to show the year in YYYY format" do
|
82
|
+
Date.strptime("2007", "%Y").should == Date.civil(2007, 1, 1)
|
83
|
+
end
|
84
|
+
|
85
|
+
it "should be able to show the year in YY format" do
|
86
|
+
Date.strptime("00", "%y").should == Date.civil(2000, 1, 1)
|
87
|
+
end
|
88
|
+
|
89
|
+
it "should be able to parse escapes" do
|
90
|
+
Date.strptime("00 % \n \t %1", "%y %% %n %t %1").should == Date.civil(2000, 1, 1)
|
91
|
+
end
|
92
|
+
|
93
|
+
############################
|
94
|
+
# Specs that combine stuff #
|
95
|
+
############################
|
96
|
+
|
97
|
+
|
98
|
+
it "should be able to parse the date with slashes" do
|
99
|
+
Date.strptime("04/06/00", "%D").should == Date.civil(2000, 4, 6)
|
100
|
+
Date.strptime("04/06/00", "%m/%d/%y").should == Date.civil(2000, 4, 6)
|
101
|
+
end
|
102
|
+
|
103
|
+
it "should be able to parse the date as YYYY-MM-DD" do
|
104
|
+
Date.strptime("2000-04-06", "%F").should == Date.civil(2000, 4, 6)
|
105
|
+
Date.strptime("2000-04-06", "%Y-%m-%d").should == Date.civil(2000, 4, 6)
|
106
|
+
end
|
107
|
+
|
108
|
+
it "should be able to show the commercial week" do
|
109
|
+
Date.strptime(" 9-Apr-2000", "%v").should == Date.civil(2000, 4, 9)
|
110
|
+
Date.strptime(" 9-Apr-2000", "%e-%b-%Y").should == Date.civil(2000, 4, 9)
|
111
|
+
end
|
112
|
+
|
113
|
+
it "should be able to show MM/DD/YY" do
|
114
|
+
Date.strptime("04/06/00", "%x").should == Date.civil(2000, 4, 6)
|
115
|
+
Date.strptime("04/06/00", "%m/%d/%y").should == Date.civil(2000, 4, 6)
|
116
|
+
end
|
117
|
+
|
118
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require(File.join(File.dirname(__FILE__), '..', 'date_spec_helper'))
|
2
|
+
|
3
|
+
describe "Date#succ" do
|
4
|
+
it "should be the next day" do
|
5
|
+
ds = Date.civil(2008, 10, 11)
|
6
|
+
ds.succ.should == Date.civil(2008, 10, 12)
|
7
|
+
ds = Date.civil(2008, 10, 31)
|
8
|
+
ds.succ.should == Date.civil(2008, 11, 1)
|
9
|
+
ds = Date.commercial(2008, 2, 7)
|
10
|
+
ds.succ.should == Date.commercial(2008, 3, 1)
|
11
|
+
ds = Date.jd(2008)
|
12
|
+
ds.succ.should == Date.jd(2009)
|
13
|
+
ds = Date.ordinal(2008, 366)
|
14
|
+
ds.succ.should == Date.ordinal(2009, 1)
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require(File.join(File.dirname(__FILE__), '..', 'date_spec_helper'))
|
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,53 @@
|
|
1
|
+
require(File.join(File.dirname(__FILE__), '..', 'datetime_spec_helper'))
|
2
|
+
|
3
|
+
describe "DateTime#fract" do
|
4
|
+
it "should be able to determine the fraction of a day" do
|
5
|
+
DateTime.jd_fract(2007).fract.should be_close(0.0, 0.000000001)
|
6
|
+
DateTime.jd_fract(2007, 0.5).fract.should be_close(0.5, 0.000000001)
|
7
|
+
DateTime.jd(2007, 12).fract.should be_close(0.5, 0.000000001)
|
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
|
+
DateTime.jd_fract(2007, 0.5).hour.should == 12
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe "DateTime#min" do
|
19
|
+
it "should be able to determine the minute of the day" do
|
20
|
+
DateTime.jd(2007, 1, 2).min.should == 2
|
21
|
+
DateTime.jd_fract(2007, 0.021).min.should == 30
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe "DateTime#offset and #utc_offset" do
|
26
|
+
it "should be able to determine the offset of the day from UTC" do
|
27
|
+
DateTime.jd(2007, 1, 2, 3, 4, 6).offset.should == 6
|
28
|
+
DateTime.jd_fract(2007, 1.15740740740741e-006, 10).offset.should == 10
|
29
|
+
DateTime.jd(2007, 1, 2, 3, 4, 6).utc_offset.should == 6
|
30
|
+
DateTime.jd_fract(2007, 1.15740740740741e-006, 10).utc_offset.should == 10
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe "DateTime#sec" do
|
35
|
+
it "should be able to determine the second of the day" do
|
36
|
+
DateTime.jd(2007, 1, 2, 3).sec.should == 3
|
37
|
+
DateTime.jd_fract(2007, 0.00035).sec.should == 30
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
describe "DateTime#usec" do
|
42
|
+
it "should be able to determine the millisecond of the day" do
|
43
|
+
DateTime.jd(2007, 1, 2, 3, 4).usec.should == 4
|
44
|
+
DateTime.jd_fract(2007, 0.000001158).usec.should == 100051
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
describe "DateTime#zone" do
|
49
|
+
it "should give the offset as a string" do
|
50
|
+
DateTime.jd(0).zone.should == '+00:00'
|
51
|
+
DateTime.jd(2007, 0, 0, 0, 0, -3600).zone.should == '-01:00'
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require(File.join(File.dirname(__FILE__), '..', 'datetime_spec_helper'))
|
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
|