1require 'test/unit'
2require 'date'
3
4class TestDateParse < Test::Unit::TestCase
5
6  def test__parse
7    [
8     # ctime(3), asctime(3)
9     [['Sat Aug 28 02:55:50 1999',false],[1999,8,28,2,55,50,nil,nil,6], __LINE__],
10     [['Sat Aug 28 02:55:50 02',false],[2,8,28,2,55,50,nil,nil,6], __LINE__],
11     [['Sat Aug 28 02:55:50 02',true],[2002,8,28,2,55,50,nil,nil,6], __LINE__],
12     [['Sat Aug 28 02:55:50 0002',false],[2,8,28,2,55,50,nil,nil,6], __LINE__],
13     [['Sat Aug 28 02:55:50 0002',true],[2,8,28,2,55,50,nil,nil,6], __LINE__],
14
15     # date(1)
16     [['Sat Aug 28 02:29:34 JST 1999',false],[1999,8,28,2,29,34,'JST',9*3600,6], __LINE__],
17     [['Sat Aug 28 02:29:34 MET DST 1999',false],[1999,8,28,2,29,34,'MET DST',2*3600,6], __LINE__],
18     [['Sat Aug 28 02:29:34 AMT 1999',false],[1999,8,28,2,29,34,'AMT',nil,6], __LINE__],
19     [['Sat Aug 28 02:29:34 PMT 1999',false],[1999,8,28,2,29,34,'PMT',nil,6], __LINE__],
20     [['Sat Aug 28 02:29:34 PMT -1999',false],[-1999,8,28,2,29,34,'PMT',nil,6], __LINE__],
21
22     [['Sat Aug 28 02:29:34 JST 02',false],[2,8,28,2,29,34,'JST',9*3600,6], __LINE__],
23     [['Sat Aug 28 02:29:34 JST 02',true],[2002,8,28,2,29,34,'JST',9*3600,6], __LINE__],
24     [['Sat Aug 28 02:29:34 JST 0002',false],[2,8,28,2,29,34,'JST',9*3600,6], __LINE__],
25     [['Sat Aug 28 02:29:34 JST 0002',true],[2,8,28,2,29,34,'JST',9*3600,6], __LINE__],
26
27     [['Sat Aug 28 02:29:34 GMT+09 0002',false],[2,8,28,2,29,34,'GMT+09',9*3600,6], __LINE__],
28     [['Sat Aug 28 02:29:34 GMT+0900 0002',false],[2,8,28,2,29,34,'GMT+0900',9*3600,6], __LINE__],
29     [['Sat Aug 28 02:29:34 GMT+09:00 0002',false],[2,8,28,2,29,34,'GMT+09:00',9*3600,6], __LINE__],
30     [['Sat Aug 28 02:29:34 GMT-09 0002',false],[2,8,28,2,29,34,'GMT-09',-9*3600,6], __LINE__],
31     [['Sat Aug 28 02:29:34 GMT-0900 0002',false],[2,8,28,2,29,34,'GMT-0900',-9*3600,6], __LINE__],
32     [['Sat Aug 28 02:29:34 GMT-09:00 0002',false],[2,8,28,2,29,34,'GMT-09:00',-9*3600,6], __LINE__],
33     [['Sat Aug 28 02:29:34 GMT-090102 0002',false],[2,8,28,2,29,34,'GMT-090102',-9*3600-60-2,6], __LINE__],
34     [['Sat Aug 28 02:29:34 GMT-09:01:02 0002',false],[2,8,28,2,29,34,'GMT-09:01:02',-9*3600-60-2,6], __LINE__],
35
36     [['Sat Aug 28 02:29:34 GMT Standard Time 2000',false],[2000,8,28,2,29,34,'GMT Standard Time',0*3600,6], __LINE__],
37     [['Sat Aug 28 02:29:34 Mountain Standard Time 2000',false],[2000,8,28,2,29,34,'Mountain Standard Time',-7*3600,6], __LINE__],
38     [['Sat Aug 28 02:29:34 Mountain Daylight Time 2000',false],[2000,8,28,2,29,34,'Mountain Daylight Time',-6*3600,6], __LINE__],
39     [['Sat Aug 28 02:29:34 Mexico Standard Time 2000',false],[2000,8,28,2,29,34,'Mexico Standard Time',-6*3600,6], __LINE__],
40#     [['Sat Aug 28 02:29:34 Mexico Standard Time 2 2000',false],[2000,8,28,2,29,34,'Mexico Standard Time 2',-7*3600,6], __LINE__], # cp
41     [['Sat Aug 28 02:29:34 E. Australia Standard Time 2000',false],[2000,8,28,2,29,34,'E. Australia Standard Time',10*3600,6], __LINE__],
42
43     # part of iso 8601
44     [['1999-05-23 23:55:21',false],[1999,5,23,23,55,21,nil,nil,nil], __LINE__],
45     [['1999-05-23 23:55:21+0900',false],[1999,5,23,23,55,21,'+0900',9*3600,nil], __LINE__],
46     [['1999-05-23 23:55:21-0900',false],[1999,5,23,23,55,21,'-0900',-9*3600,nil], __LINE__],
47     [['1999-05-23 23:55:21+09:00',false],[1999,5,23,23,55,21,'+09:00',9*3600,nil], __LINE__],
48     [['1999-05-23T23:55:21-09:00',false],[1999,5,23,23,55,21,'-09:00',-9*3600,nil], __LINE__],
49     [['1999-05-23 23:55:21Z',false],[1999,5,23,23,55,21,'Z',0,nil], __LINE__],
50     [['1999-05-23T23:55:21Z',false],[1999,5,23,23,55,21,'Z',0,nil], __LINE__],
51     [['-1999-05-23T23:55:21Z',false],[-1999,5,23,23,55,21,'Z',0,nil], __LINE__],
52     [['-1999-05-23T23:55:21Z',true],[-1999,5,23,23,55,21,'Z',0,nil], __LINE__],
53     [['19990523T23:55:21Z',false],[1999,5,23,23,55,21,'Z',0,nil], __LINE__],
54
55     [['+011985-04-12',false],[11985,4,12,nil,nil,nil,nil,nil,nil], __LINE__],
56     [['+011985-04-12T10:15:30',false],[11985,4,12,10,15,30,nil,nil,nil], __LINE__],
57     [['-011985-04-12',false],[-11985,4,12,nil,nil,nil,nil,nil,nil], __LINE__],
58     [['-011985-04-12T10:15:30',false],[-11985,4,12,10,15,30,nil,nil,nil], __LINE__],
59
60     [['02-04-12',false],[2,4,12,nil,nil,nil,nil,nil,nil], __LINE__],
61     [['02-04-12',true],[2002,4,12,nil,nil,nil,nil,nil,nil], __LINE__],
62     [['0002-04-12',false],[2,4,12,nil,nil,nil,nil,nil,nil], __LINE__],
63     [['0002-04-12',true],[2,4,12,nil,nil,nil,nil,nil,nil], __LINE__],
64
65     [['19990523',true],[1999,5,23,nil,nil,nil,nil,nil,nil], __LINE__],
66     [['-19990523',true],[-1999,5,23,nil,nil,nil,nil,nil,nil], __LINE__],
67     [['990523',true],[1999,5,23,nil,nil,nil,nil,nil,nil], __LINE__],
68     [['0523',false],[nil,5,23,nil,nil,nil,nil,nil,nil], __LINE__],
69     [['23',false],[nil,nil,23,nil,nil,nil,nil,nil,nil], __LINE__],
70
71     [['19990523 235521',true],[1999,5,23,23,55,21,nil,nil,nil], __LINE__],
72     [['990523 235521',true],[1999,5,23,23,55,21,nil,nil,nil], __LINE__],
73     [['0523 2355',false],[nil,5,23,23,55,nil,nil,nil,nil], __LINE__],
74     [['23 2355',false],[nil,nil,23,23,55,nil,nil,nil,nil], __LINE__],
75
76     [['19990523T235521',true],[1999,5,23,23,55,21,nil,nil,nil], __LINE__],
77     [['990523T235521',true],[1999,5,23,23,55,21,nil,nil,nil], __LINE__],
78     [['19990523T235521.99',true],[1999,5,23,23,55,21,nil,nil,nil], __LINE__],
79     [['990523T235521.99',true],[1999,5,23,23,55,21,nil,nil,nil], __LINE__],
80     [['0523T2355',false],[nil,5,23,23,55,nil,nil,nil,nil], __LINE__],
81
82     [['19990523T235521+0900',true],[1999,5,23,23,55,21,'+0900',9*3600,nil], __LINE__],
83     [['990523T235521-0900',true],[1999,5,23,23,55,21,'-0900',-9*3600,nil], __LINE__],
84     [['19990523T235521.99+0900',true],[1999,5,23,23,55,21,'+0900',9*3600,nil], __LINE__],
85     [['990523T235521.99-0900',true],[1999,5,23,23,55,21,'-0900',-9*3600,nil], __LINE__],
86     [['0523T2355Z',false],[nil,5,23,23,55,nil,'Z',0,nil], __LINE__],
87
88     [['19990523235521.123456+0900',true],[1999,5,23,23,55,21,'+0900',9*3600,nil], __LINE__],
89     [['19990523235521.123456-0900',true],[1999,5,23,23,55,21,'-0900',-9*3600,nil], __LINE__],
90     [['19990523235521,123456+0900',true],[1999,5,23,23,55,21,'+0900',9*3600,nil], __LINE__],
91     [['19990523235521,123456-0900',true],[1999,5,23,23,55,21,'-0900',-9*3600,nil], __LINE__],
92
93     [['990523235521,123456-0900',false],[99,5,23,23,55,21,'-0900',-9*3600,nil], __LINE__],
94     [['0523235521,123456-0900',false],[nil,5,23,23,55,21,'-0900',-9*3600,nil], __LINE__],
95     [['23235521,123456-0900',false],[nil,nil,23,23,55,21,'-0900',-9*3600,nil], __LINE__],
96     [['235521,123456-0900',false],[nil,nil,nil,23,55,21,'-0900',-9*3600,nil], __LINE__],
97     [['5521,123456-0900',false],[nil,nil,nil,nil,55,21,'-0900',-9*3600,nil], __LINE__],
98     [['21,123456-0900',false],[nil,nil,nil,nil,nil,21,'-0900',-9*3600,nil], __LINE__],
99
100     [['3235521,123456-0900',false],[nil,nil,3,23,55,21,'-0900',-9*3600,nil], __LINE__],
101     [['35521,123456-0900',false],[nil,nil,nil,3,55,21,'-0900',-9*3600,nil], __LINE__],
102     [['521,123456-0900',false],[nil,nil,nil,nil,5,21,'-0900',-9*3600,nil], __LINE__],
103
104     # reversed iso 8601 (?)
105     [['23-05-1999',false],[1999,5,23,nil,nil,nil,nil,nil,nil], __LINE__],
106     [['23-05-1999 23:55:21',false],[1999,5,23,23,55,21,nil,nil,nil], __LINE__],
107     [['23-05--1999 23:55:21',false],[-1999,5,23,23,55,21,nil,nil,nil], __LINE__],
108     [["23-05-'99",false],[99,5,23,nil,nil,nil,nil,nil,nil], __LINE__],
109     [["23-05-'99",true],[1999,5,23,nil,nil,nil,nil,nil,nil], __LINE__],
110
111     # broken iso 8601 (?)
112#     [['1999-05-23T235521Z',false],[1999,5,23,23,55,21,'Z',0,nil], __LINE__], # cp
113     [['19990523T23:55:21Z',false],[1999,5,23,23,55,21,'Z',0,nil], __LINE__],
114     [['19990523235521.1234-100',true],[1999,5,23,23,55,21,'-100',-1*3600,nil], __LINE__],
115     [['19990523235521.1234-10',true],[1999,5,23,23,55,21,'-10',-10*3600,nil], __LINE__],
116
117     # part of jis x0301
118     [['M11.05.23',false],[1878,5,23,nil,nil,nil,nil,nil,nil], __LINE__],
119     [['T11.05.23 23:55:21+0900',false],[1922,5,23,23,55,21,'+0900',9*3600,nil], __LINE__],
120     [['S11.05.23 23:55:21-0900',false],[1936,5,23,23,55,21,'-0900',-9*3600,nil], __LINE__],
121     [['S40.05.23 23:55:21+09:00',false],[1965,5,23,23,55,21,'+09:00',9*3600,nil], __LINE__],
122     [['S40.05.23T23:55:21-09:00',false],[1965,5,23,23,55,21,'-09:00',-9*3600,nil], __LINE__],
123     [['H11.05.23 23:55:21Z',false],[1999,5,23,23,55,21,'Z',0,nil], __LINE__],
124     [['H11.05.23T23:55:21Z',false],[1999,5,23,23,55,21,'Z',0,nil], __LINE__],
125
126     # ofx date
127     [['19990523235521',false],[1999,5,23,23,55,21,nil,nil,nil], __LINE__],
128     [['19990523235521.123',false],[1999,5,23,23,55,21,nil,nil,nil], __LINE__],
129     [['19990523235521.123[-9]',false],[1999,5,23,23,55,21,'-9',-(9*3600),nil], __LINE__],
130     [['19990523235521.123[+9]',false],[1999,5,23,23,55,21,'+9',+(9*3600),nil], __LINE__],
131     [['19990523235521.123[9]',false],[1999,5,23,23,55,21,'9',+(9*3600),nil], __LINE__],
132     [['19990523235521.123[-9.50]',false],[1999,5,23,23,55,21,'-9.50',-(9*3600+30*60),nil], __LINE__],
133     [['19990523235521.123[+9.50]',false],[1999,5,23,23,55,21,'+9.50',+(9*3600+30*60),nil], __LINE__],
134     [['19990523235521.123[-5:EST]',false],[1999,5,23,23,55,21,'EST',-5*3600,nil], __LINE__],
135     [['19990523235521.123[+9:JST]',false],[1999,5,23,23,55,21,'JST',9*3600,nil], __LINE__],
136     [['19990523235521.123[+12:XXX YYY ZZZ]',false],[1999,5,23,23,55,21,'XXX YYY ZZZ',12*3600,nil], __LINE__],
137#     [['235521',false],[nil,nil,nil,23,55,21,nil,nil,nil], __LINE__], # cp
138     [['235521.123',false],[nil,nil,nil,23,55,21,nil,nil,nil], __LINE__],
139     [['235521.123[-9]',false],[nil,nil,nil,23,55,21,'-9',-9*3600,nil], __LINE__],
140     [['235521.123[+9]',false],[nil,nil,nil,23,55,21,'+9',+9*3600,nil], __LINE__],
141     [['235521.123[-5:EST]',false],[nil,nil,nil,23,55,21,'EST',-5*3600,nil], __LINE__],
142     [['235521.123[+9:JST]',false],[nil,nil,nil,23,55,21,'JST',+9*3600,nil], __LINE__],
143
144     # rfc 2822
145     [['Sun, 22 Aug 1999 00:45:29 -0400',false],[1999,8,22,0,45,29,'-0400',-4*3600,0], __LINE__],
146     [['Sun, 22 Aug 1999 00:45:29 -9959',false],[1999,8,22,0,45,29,'-9959',-(99*3600+59*60),0], __LINE__],
147     [['Sun, 22 Aug 1999 00:45:29 +9959',false],[1999,8,22,0,45,29,'+9959',+(99*3600+59*60),0], __LINE__],
148     [['Sun, 22 Aug 05 00:45:29 -0400',true],[2005,8,22,0,45,29,'-0400',-4*3600,0], __LINE__],
149     [['Sun, 22 Aug 49 00:45:29 -0400',true],[2049,8,22,0,45,29,'-0400',-4*3600,0], __LINE__],
150#     [['Sun, 22 Aug 50 00:45:29 -0400',true],[1950,8,22,0,45,29,'-0400',-4*3600,0], __LINE__],
151#     [['Sun, 22 Aug 111 00:45:29 -0400',true],[2011,8,22,0,45,29,'-0400',-4*3600,0], __LINE__],
152     [['Sun, 22 Aug 1999 00:45:29 GMT',false],[1999,8,22,0,45,29,'GMT',0,0], __LINE__],
153     [["Sun,\00022\r\nAug\r\n1999\r\n00:45:29\r\nGMT",false],[1999,8,22,0,45,29,'GMT',0,0], __LINE__],
154     [['Sun, 22 Aug 1999 00:45 GMT',false],[1999,8,22,0,45,nil,'GMT',0,0], __LINE__],
155     [['Sun, 22 Aug -1999 00:45 GMT',false],[-1999,8,22,0,45,nil,'GMT',0,0], __LINE__],
156     [['Sun, 22 Aug 99 00:45:29 UT',true],[1999,8,22,0,45,29,'UT',0,0], __LINE__],
157     [['Sun, 22 Aug 0099 00:45:29 UT',true],[99,8,22,0,45,29,'UT',0,0], __LINE__],
158
159     # rfc 850, obsoleted by rfc 1036
160     [['Tuesday, 02-Mar-99 11:20:32 GMT',true],[1999,3,2,11,20,32,'GMT',0,2], __LINE__],
161
162     # W3C Working Draft - XForms - 4.8 Time
163     [['2000-01-31 13:20:00-5',false],[2000,1,31,13,20,0,'-5',-5*3600,nil], __LINE__],
164
165     # [-+]\d+.\d+
166     [['2000-01-31 13:20:00-5.5',false],[2000,1,31,13,20,0,'-5.5',-5*3600-30*60,nil], __LINE__],
167     [['2000-01-31 13:20:00-5,5',false],[2000,1,31,13,20,0,'-5,5',-5*3600-30*60,nil], __LINE__],
168     [['2000-01-31 13:20:00+3.5',false],[2000,1,31,13,20,0,'+3.5',3*3600+30*60,nil], __LINE__],
169     [['2000-01-31 13:20:00+3,5',false],[2000,1,31,13,20,0,'+3,5',3*3600+30*60,nil], __LINE__],
170
171     # mil
172     [['2000-01-31 13:20:00 Z',false],[2000,1,31,13,20,0,'Z',0*3600,nil], __LINE__],
173     [['2000-01-31 13:20:00 H',false],[2000,1,31,13,20,0,'H',8*3600,nil], __LINE__],
174     [['2000-01-31 13:20:00 M',false],[2000,1,31,13,20,0,'M',12*3600,nil], __LINE__],
175     [['2000-01-31 13:20 M',false],[2000,1,31,13,20,nil,'M',12*3600,nil], __LINE__],
176     [['2000-01-31 13:20:00 S',false],[2000,1,31,13,20,0,'S',-6*3600,nil], __LINE__],
177     [['2000-01-31 13:20:00 A',false],[2000,1,31,13,20,0,'A',1*3600,nil], __LINE__],
178     [['2000-01-31 13:20:00 P',false],[2000,1,31,13,20,0,'P',-3*3600,nil], __LINE__],
179
180     # dot
181     [['1999.5.2',false],[1999,5,2,nil,nil,nil,nil,nil,nil], __LINE__],
182     [['1999.05.02',false],[1999,5,2,nil,nil,nil,nil,nil,nil], __LINE__],
183     [['-1999.05.02',false],[-1999,5,2,nil,nil,nil,nil,nil,nil], __LINE__],
184#     [['05.02',false],[nil,5,2,nil,nil,nil,nil,nil,nil], __LINE__], # not support
185#     [[' 5. 2',false],[nil,5,2,nil,nil,nil,nil,nil,nil], __LINE__], # not support
186
187     [['0099.5.2',false],[99,5,2,nil,nil,nil,nil,nil,nil], __LINE__],
188     [['0099.5.2',true],[99,5,2,nil,nil,nil,nil,nil,nil], __LINE__],
189
190     [["'99.5.2",false],[99,5,2,nil,nil,nil,nil,nil,nil], __LINE__],
191     [["'99.5.2",true],[1999,5,2,nil,nil,nil,nil,nil,nil], __LINE__],
192
193     # reversed dot
194     [['2.5.1999',false],[1999,5,2,nil,nil,nil,nil,nil,nil], __LINE__],
195     [['02.05.1999',false],[1999,5,2,nil,nil,nil,nil,nil,nil], __LINE__],
196     [['02.05.-1999',false],[-1999,5,2,nil,nil,nil,nil,nil,nil], __LINE__],
197
198     [['2.5.0099',false],[99,5,2,nil,nil,nil,nil,nil,nil], __LINE__],
199     [['2.5.0099',true],[99,5,2,nil,nil,nil,nil,nil,nil], __LINE__],
200
201     [["2.5.'99",false],[99,5,2,nil,nil,nil,nil,nil,nil], __LINE__],
202     [["2.5.'99",true],[1999,5,2,nil,nil,nil,nil,nil,nil], __LINE__],
203
204     # vms
205     [['08-DEC-1988',false],[1988,12,8,nil,nil,nil,nil,nil,nil], __LINE__],
206     [['31-JAN-1999',false],[1999,1,31,nil,nil,nil,nil,nil,nil], __LINE__],
207     [['31-JAN--1999',false],[-1999,1,31,nil,nil,nil,nil,nil,nil], __LINE__],
208
209     [['08-DEC-88',false],[88,12,8,nil,nil,nil,nil,nil,nil], __LINE__],
210     [['08-DEC-88',true],[1988,12,8,nil,nil,nil,nil,nil,nil], __LINE__],
211     [['08-DEC-0088',false],[88,12,8,nil,nil,nil,nil,nil,nil], __LINE__],
212     [['08-DEC-0088',true],[88,12,8,nil,nil,nil,nil,nil,nil], __LINE__],
213
214     # swaped vms
215     [['DEC-08-1988',false],[1988,12,8,nil,nil,nil,nil,nil,nil], __LINE__],
216     [['JAN-31-1999',false],[1999,1,31,nil,nil,nil,nil,nil,nil], __LINE__],
217     [['JAN-31--1999',false],[-1999,1,31,nil,nil,nil,nil,nil,nil], __LINE__],
218     [['JAN-1999',false],[1999,1,nil,nil,nil,nil,nil,nil,nil], __LINE__],
219     [['JAN--1999',false],[-1999,1,nil,nil,nil,nil,nil,nil,nil], __LINE__],
220
221     # reversed vms
222     [['1988-DEC-08',false],[1988,12,8,nil,nil,nil,nil,nil,nil], __LINE__],
223     [['1999-JAN-31',false],[1999,1,31,nil,nil,nil,nil,nil,nil], __LINE__],
224     [['-1999-JAN-31',false],[-1999,1,31,nil,nil,nil,nil,nil,nil], __LINE__],
225
226     [['0088-DEC-08',false],[88,12,8,nil,nil,nil,nil,nil,nil], __LINE__],
227     [['0088-DEC-08',true],[88,12,8,nil,nil,nil,nil,nil,nil], __LINE__],
228
229     [["'88/12/8",false],[88,12,8,nil,nil,nil,nil,nil,nil], __LINE__],
230     [["'88/12/8",true],[1988,12,8,nil,nil,nil,nil,nil,nil], __LINE__],
231
232     # non-spaced eu
233     [['08/dec/1988',false],[1988,12,8,nil,nil,nil,nil,nil,nil], __LINE__],
234     [['31/jan/1999',false],[1999,1,31,nil,nil,nil,nil,nil,nil], __LINE__],
235     [['31/jan/-1999',false],[-1999,1,31,nil,nil,nil,nil,nil,nil], __LINE__],
236     [['08.dec.1988',false],[1988,12,8,nil,nil,nil,nil,nil,nil], __LINE__],
237     [['31.jan.1999',false],[1999,1,31,nil,nil,nil,nil,nil,nil], __LINE__],
238     [['31.jan.-1999',false],[-1999,1,31,nil,nil,nil,nil,nil,nil], __LINE__],
239
240     # non-spaced us
241     [['dec/08/1988',false],[1988,12,8,nil,nil,nil,nil,nil,nil], __LINE__],
242     [['jan/31/1999',false],[1999,1,31,nil,nil,nil,nil,nil,nil], __LINE__],
243     [['jan/31/-1999',false],[-1999,1,31,nil,nil,nil,nil,nil,nil], __LINE__],
244     [['jan/31',false],[nil,1,31,nil,nil,nil,nil,nil,nil], __LINE__],
245     [['jan/1988',false],[1988,1,nil,nil,nil,nil,nil,nil,nil], __LINE__],
246     [['dec.08.1988',false],[1988,12,8,nil,nil,nil,nil,nil,nil], __LINE__],
247     [['jan.31.1999',false],[1999,1,31,nil,nil,nil,nil,nil,nil], __LINE__],
248     [['jan.31.-1999',false],[-1999,1,31,nil,nil,nil,nil,nil,nil], __LINE__],
249     [['jan.31',false],[nil,1,31,nil,nil,nil,nil,nil,nil], __LINE__],
250     [['jan.1988',false],[1988,1,nil,nil,nil,nil,nil,nil,nil], __LINE__],
251
252     # month and day of month
253     [['Jan 1',false],[nil,1,1,nil,nil,nil,nil,nil,nil], __LINE__],
254     [['Jul 11',false],[nil,7,11,nil,nil,nil,nil,nil,nil], __LINE__],
255     [['July 11',false],[nil,7,11,nil,nil,nil,nil,nil,nil], __LINE__],
256     [['Sept 23',false],[nil,9,23,nil,nil,nil,nil,nil,nil], __LINE__],
257     [['Sep. 23',false],[nil,9,23,nil,nil,nil,nil,nil,nil], __LINE__],
258     [['Sept. 23',false],[nil,9,23,nil,nil,nil,nil,nil,nil], __LINE__],
259     [['September 23',false],[nil,9,23,nil,nil,nil,nil,nil,nil], __LINE__],
260     [['October 1st',false],[nil,10,1,nil,nil,nil,nil,nil,nil], __LINE__],
261     [['October 23rd',false],[nil,10,23,nil,nil,nil,nil,nil,nil], __LINE__],
262     [['October 25th 1999',false],[1999,10,25,nil,nil,nil,nil,nil,nil], __LINE__],
263     [['October 25th -1999',false],[-1999,10,25,nil,nil,nil,nil,nil,nil], __LINE__],
264     [['october 25th 1999',false],[1999,10,25,nil,nil,nil,nil,nil,nil], __LINE__],
265     [['OCTOBER 25th 1999',false],[1999,10,25,nil,nil,nil,nil,nil,nil], __LINE__],
266     [['oCtoBer 25th 1999',false],[1999,10,25,nil,nil,nil,nil,nil,nil], __LINE__],
267     [['aSep 23',false],[nil,nil,23,nil,nil,nil,nil,nil,nil], __LINE__],
268
269     # month and year
270     [['Sept 1990',false],[1990,9,nil,nil,nil,nil,nil,nil,nil], __LINE__],
271     [["Sept '90",false],[90,9,nil,nil,nil,nil,nil,nil,nil], __LINE__],
272     [["Sept '90",true],[1990,9,nil,nil,nil,nil,nil,nil,nil], __LINE__],
273     [['1990/09',false],[1990,9,nil,nil,nil,nil,nil,nil,nil], __LINE__],
274     [['09/1990',false],[1990,9,nil,nil,nil,nil,nil,nil,nil], __LINE__],
275     [["aSep '90",false],[90,nil,nil,nil,nil,nil,nil,nil,nil], __LINE__],
276
277     # year
278     [["'90",false],[90,nil,nil,nil,nil,nil,nil,nil,nil], __LINE__],
279     [["'90",true],[1990,nil,nil,nil,nil,nil,nil,nil,nil], __LINE__],
280
281     # month
282     [['Jun',false],[nil,6,nil,nil,nil,nil,nil,nil,nil], __LINE__],
283     [['June',false],[nil,6,nil,nil,nil,nil,nil,nil,nil], __LINE__],
284     [['Sep',false],[nil,9,nil,nil,nil,nil,nil,nil,nil], __LINE__],
285     [['Sept',false],[nil,9,nil,nil,nil,nil,nil,nil,nil], __LINE__],
286     [['September',false],[nil,9,nil,nil,nil,nil,nil,nil,nil], __LINE__],
287     [['aSep',false],[nil,nil,nil,nil,nil,nil,nil,nil,nil], __LINE__],
288
289     # day of month
290     [['1st',false],[nil,nil,1,nil,nil,nil,nil,nil,nil], __LINE__],
291     [['2nd',false],[nil,nil,2,nil,nil,nil,nil,nil,nil], __LINE__],
292     [['3rd',false],[nil,nil,3,nil,nil,nil,nil,nil,nil], __LINE__],
293     [['4th',false],[nil,nil,4,nil,nil,nil,nil,nil,nil], __LINE__],
294     [['29th',false],[nil,nil,29,nil,nil,nil,nil,nil,nil], __LINE__],
295     [['31st',false],[nil,nil,31,nil,nil,nil,nil,nil,nil], __LINE__],
296     [['1sta',false],[nil,nil,nil,nil,nil,nil,nil,nil,nil], __LINE__],
297
298     # era
299     [['Sat Aug 28 02:29:34 GMT CE 2000',false],[2000,8,28,2,29,34,'GMT',0,6], __LINE__],
300     [['Sat Aug 28 02:29:34 GMT C.E. 2000',false],[2000,8,28,2,29,34,'GMT',0,6], __LINE__],
301     [['Sat Aug 28 02:29:34 GMT BCE 2000',false],[-1999,8,28,2,29,34,'GMT',0,6], __LINE__],
302     [['Sat Aug 28 02:29:34 GMT B.C.E. 2000',false],[-1999,8,28,2,29,34,'GMT',0,6], __LINE__],
303     [['Sat Aug 28 02:29:34 GMT AD 2000',false],[2000,8,28,2,29,34,'GMT',0,6], __LINE__],
304     [['Sat Aug 28 02:29:34 GMT A.D. 2000',false],[2000,8,28,2,29,34,'GMT',0,6], __LINE__],
305     [['Sat Aug 28 02:29:34 GMT BC 2000',false],[-1999,8,28,2,29,34,'GMT',0,6], __LINE__],
306     [['Sat Aug 28 02:29:34 GMT B.C. 2000',false],[-1999,8,28,2,29,34,'GMT',0,6], __LINE__],
307     [['Sat Aug 28 02:29:34 GMT 2000 BC',false],[-1999,8,28,2,29,34,'GMT',0,6], __LINE__],
308     [['Sat Aug 28 02:29:34 GMT 2000 BCE',false],[-1999,8,28,2,29,34,'GMT',0,6], __LINE__],
309     [['Sat Aug 28 02:29:34 GMT 2000 B.C.',false],[-1999,8,28,2,29,34,'GMT',0,6], __LINE__],
310     [['Sat Aug 28 02:29:34 GMT 2000 B.C.E.',false],[-1999,8,28,2,29,34,'GMT',0,6], __LINE__],
311
312     # collection
313#     [['le ler juillet 1982',false],[1982,7,1,nil,nil,nil,nil,nil,nil], __LINE__], # bih 1982
314#     [['30 June 1982 , 23h 59m 59s',false],[1982,6,30,23,59,59,nil,nil,nil], __LINE__], # bih 1982
315     [['Tuesday, May 18, 1999 Published at 13:36 GMT 14:36 UK',false],[1999,5,18,13,36,nil,'GMT',0,2], __LINE__], # bbc.co.uk
316     [['July 20, 2000 Web posted at: 3:37 p.m. EDT (1937 GMT)',false],[2000,7,20,15,37,nil,'EDT',-4*3600,nil], __LINE__], # cnn.com
317     [['12:54 p.m. EDT, September 11, 2006',false],[2006,9,11,12,54,nil,'EDT',-4*3600,nil], __LINE__], # cnn.com
318     [['February 04, 2001 at 10:59 AM PST',false],[2001,2,4,10,59,nil,'PST',-8*3600,nil], __LINE__], # old amazon.com
319     [['Monday May 08, @01:55PM',false],[nil,5,8,13,55,nil,nil,nil,1], __LINE__], # slashdot.org
320     [['06.June 2005',false],[2005,6,6,nil,nil,nil,nil,nil,nil], __LINE__], # dhl.com
321
322     # etc.
323     [['8:00 pm lt',false],[nil,nil,nil,20,0,nil,'lt',nil,nil], __LINE__],
324     [['4:00 AM, Jan. 12, 1990',false],[1990,1,12,4,0,nil,nil,nil,nil], __LINE__],
325     [['Jan. 12 4:00 AM 1990',false],[1990,1,12,4,0,nil,nil,nil,nil], __LINE__],
326#     [['Jan. 12 4:00 -1990',false],[-1990,1,12,4,0,nil,nil,nil,nil], __LINE__], # cp
327     [['1990-01-12 04:00:00+00',false],[1990,1,12,4,0,0,'+00',0,nil], __LINE__],
328     [['1990-01-11 20:00:00-08',false],[1990,1,11,20,0,0,'-08',-8*3600,nil], __LINE__],
329     [['1990/01/12 04:00:00',false],[1990,1,12,4,0,0,nil,nil,nil], __LINE__],
330#     [['Thu Jan 11 20:00:00 1990 LT',false], [1990,1,11,20,0,0,'LT',nil,4], __LINE__], # cp
331     [['Thu Jan 11 20:00:00 PST 1990',false],[1990,1,11,20,0,0,'PST',-8*3600,4], __LINE__],
332     [['Fri Jan 12 04:00:00 GMT 1990',false],[1990,1,12,4,0,0,'GMT',0,5], __LINE__],
333     [['Thu, 11 Jan 1990 20:00:00 -0800',false],[1990,1,11,20,0,0,'-0800',-8*3600,4], __LINE__],
334     [['12-January-1990, 04:00 WET',false],[1990,1,12,4,0,nil,'WET',0*3600,nil], __LINE__],
335     [['jan 2 3 am +4 5',false],[5,1,2,3,nil,nil,'+4',4*3600,nil], __LINE__],
336     [['jan 2 3 am +4 5',true],[2005,1,2,3,nil,nil,'+4',4*3600,nil], __LINE__],
337     [['fri1feb3bc4pm+5',false],[-2,2,1,16,nil,nil,'+5',5*3600,5], __LINE__],
338     [['fri1feb3bc4pm+5',true],[-2,2,1,16,nil,nil,'+5',5*3600,5], __LINE__],
339     [['03 feb 1st',false],[03,2,1,nil,nil,nil,nil,nil,nil], __LINE__],
340
341     # apostrophe
342     [["July 4, '79",true],[1979,7,4,nil,nil,nil,nil,nil,nil], __LINE__],
343     [["4th July '79",true],[1979,7,4,nil,nil,nil,nil,nil,nil], __LINE__],
344
345     # day of week
346     [['Sunday',false],[nil,nil,nil,nil,nil,nil,nil,nil,0], __LINE__],
347     [['Mon',false],[nil,nil,nil,nil,nil,nil,nil,nil,1], __LINE__],
348     [['Tue',false],[nil,nil,nil,nil,nil,nil,nil,nil,2], __LINE__],
349     [['Wed',false],[nil,nil,nil,nil,nil,nil,nil,nil,3], __LINE__],
350     [['Thurs',false],[nil,nil,nil,nil,nil,nil,nil,nil,4], __LINE__],
351     [['Friday',false],[nil,nil,nil,nil,nil,nil,nil,nil,5], __LINE__],
352     [['Sat.',false],[nil,nil,nil,nil,nil,nil,nil,nil,6], __LINE__],
353     [['sat.',false],[nil,nil,nil,nil,nil,nil,nil,nil,6], __LINE__],
354     [['SAT.',false],[nil,nil,nil,nil,nil,nil,nil,nil,6], __LINE__],
355     [['sAt.',false],[nil,nil,nil,nil,nil,nil,nil,nil,6], __LINE__],
356#     [['su',false],[nil,nil,nil,nil,nil,nil,nil,nil,0], __LINE__],
357#     [['mo',false],[nil,nil,nil,nil,nil,nil,nil,nil,1], __LINE__],
358
359     # time
360     [['09:55',false],[nil,nil,nil,9,55,nil,nil,nil,nil], __LINE__],
361     [['09:55:30',false],[nil,nil,nil,9,55,30,nil,nil,nil], __LINE__],
362     [['09:55:30am',false],[nil,nil,nil,9,55,30,nil,nil,nil], __LINE__],
363     [['09:55:30pm',false],[nil,nil,nil,21,55,30,nil,nil,nil], __LINE__],
364     [['09:55:30a.m.',false],[nil,nil,nil,9,55,30,nil,nil,nil], __LINE__],
365     [['09:55:30p.m.',false],[nil,nil,nil,21,55,30,nil,nil,nil], __LINE__],
366     [['09:55:30pm GMT',false],[nil,nil,nil,21,55,30,'GMT',0,nil], __LINE__],
367     [['09:55:30p.m. GMT',false],[nil,nil,nil,21,55,30,'GMT',0,nil], __LINE__],
368     [['09:55+0900',false],[nil,nil,nil,9,55,nil,'+0900',9*3600,nil], __LINE__],
369     [['09 AM',false],[nil,nil,nil,9,nil,nil,nil,nil,nil], __LINE__],
370     [['09am',false],[nil,nil,nil,9,nil,nil,nil,nil,nil], __LINE__],
371     [['09 A.M.',false],[nil,nil,nil,9,nil,nil,nil,nil,nil], __LINE__],
372     [['09 PM',false],[nil,nil,nil,21,nil,nil,nil,nil,nil], __LINE__],
373     [['09pm',false],[nil,nil,nil,21,nil,nil,nil,nil,nil], __LINE__],
374     [['09 P.M.',false],[nil,nil,nil,21,nil,nil,nil,nil,nil], __LINE__],
375
376     [['9h22m23s',false],[nil,nil,nil,9,22,23,nil,nil,nil], __LINE__],
377     [['9h 22m 23s',false],[nil,nil,nil,9,22,23,nil,nil,nil], __LINE__],
378     [['9h22m',false],[nil,nil,nil,9,22,nil,nil,nil,nil], __LINE__],
379     [['9h 22m',false],[nil,nil,nil,9,22,nil,nil,nil,nil], __LINE__],
380     [['9h',false],[nil,nil,nil,9,nil,nil,nil,nil,nil], __LINE__],
381     [['9h 22m 23s am',false],[nil,nil,nil,9,22,23,nil,nil,nil], __LINE__],
382     [['9h 22m 23s pm',false],[nil,nil,nil,21,22,23,nil,nil,nil], __LINE__],
383     [['9h 22m am',false],[nil,nil,nil,9,22,nil,nil,nil,nil], __LINE__],
384     [['9h 22m pm',false],[nil,nil,nil,21,22,nil,nil,nil,nil], __LINE__],
385     [['9h am',false],[nil,nil,nil,9,nil,nil,nil,nil,nil], __LINE__],
386     [['9h pm',false],[nil,nil,nil,21,nil,nil,nil,nil,nil], __LINE__],
387
388     [['00:00',false],[nil,nil,nil,0,0,nil,nil,nil,nil], __LINE__],
389     [['01:00',false],[nil,nil,nil,1,0,nil,nil,nil,nil], __LINE__],
390     [['11:00',false],[nil,nil,nil,11,0,nil,nil,nil,nil], __LINE__],
391     [['12:00',false],[nil,nil,nil,12,0,nil,nil,nil,nil], __LINE__],
392     [['13:00',false],[nil,nil,nil,13,0,nil,nil,nil,nil], __LINE__],
393     [['23:00',false],[nil,nil,nil,23,0,nil,nil,nil,nil], __LINE__],
394     [['24:00',false],[nil,nil,nil,24,0,nil,nil,nil,nil], __LINE__],
395
396     [['00:00 AM',false],[nil,nil,nil,0,0,nil,nil,nil,nil], __LINE__],
397     [['12:00 AM',false],[nil,nil,nil,0,0,nil,nil,nil,nil], __LINE__],
398     [['01:00 AM',false],[nil,nil,nil,1,0,nil,nil,nil,nil], __LINE__],
399     [['11:00 AM',false],[nil,nil,nil,11,0,nil,nil,nil,nil], __LINE__],
400     [['00:00 PM',false],[nil,nil,nil,12,0,nil,nil,nil,nil], __LINE__],
401     [['12:00 PM',false],[nil,nil,nil,12,0,nil,nil,nil,nil], __LINE__],
402     [['01:00 PM',false],[nil,nil,nil,13,0,nil,nil,nil,nil], __LINE__],
403     [['11:00 PM',false],[nil,nil,nil,23,0,nil,nil,nil,nil], __LINE__],
404
405     # pick up the rest
406     [['2000-01-02 1',false],[2000,1,2,1,nil,nil,nil,nil,nil], __LINE__],
407     [['2000-01-02 23',false],[2000,1,2,23,nil,nil,nil,nil,nil], __LINE__],
408     [['2000-01-02 24',false],[2000,1,2,24,nil,nil,nil,nil,nil], __LINE__],
409     [['1 03:04:05',false],[nil,nil,1,3,4,5,nil,nil,nil], __LINE__],
410     [['02 03:04:05',false],[nil,nil,2,3,4,5,nil,nil,nil], __LINE__],
411     [['31 03:04:05',false],[nil,nil,31,3,4,5,nil,nil,nil], __LINE__],
412
413     # null, space
414     [['',false],[nil,nil,nil,nil,nil,nil,nil,nil,nil], __LINE__],
415     [["\s",false],[nil,nil,nil,nil,nil,nil,nil,nil,nil], __LINE__],
416     [["\s" * 10, true],[nil,nil,nil,nil,nil,nil,nil,nil,nil], __LINE__],
417     [["\t",false],[nil,nil,nil,nil,nil,nil,nil,nil,nil], __LINE__],
418     [["\n",false],[nil,nil,nil,nil,nil,nil,nil,nil,nil], __LINE__],
419     [["\v",false],[nil,nil,nil,nil,nil,nil,nil,nil,nil], __LINE__],
420     [["\f",false],[nil,nil,nil,nil,nil,nil,nil,nil,nil], __LINE__],
421     [["\r",false],[nil,nil,nil,nil,nil,nil,nil,nil,nil], __LINE__],
422     [["\t\n\v\f\r\s",false],[nil,nil,nil,nil,nil,nil,nil,nil,nil], __LINE__],
423     [["1999-05-23\t\n\v\f\r\s21:34:56",false],[1999,5,23,21,34,56,nil,nil,nil], __LINE__],
424    ].each do |x,y,l|
425      h = Date._parse(*x)
426      a = h.values_at(:year,:mon,:mday,:hour,:min,:sec,:zone,:offset,:wday)
427      if y[1] == -1
428	a[1] = -1
429	a[2] = h[:yday]
430      end
431      assert_equal(y, a, format('<failed at line %d>', l))
432    end
433  end
434
435  def test__parse_slash_exp
436    [
437     # little
438     [['2/5/1999',false],[1999,5,2,nil,nil,nil,nil,nil,nil], __LINE__],
439     [['02/05/1999',false],[1999,5,2,nil,nil,nil,nil,nil,nil], __LINE__],
440     [['02/05/-1999',false],[-1999,5,2,nil,nil,nil,nil,nil,nil], __LINE__],
441     [['05/02',false],[nil,5,2,nil,nil,nil,nil,nil,nil], __LINE__],
442     [[' 5/ 2',false],[nil,5,2,nil,nil,nil,nil,nil,nil], __LINE__],
443
444     [["2/5/'99",true],[1999,5,2,nil,nil,nil,nil,nil,nil], __LINE__],
445     [['2/5/0099',false],[99,5,2,nil,nil,nil,nil,nil,nil], __LINE__],
446     [['2/5/0099',true],[99,5,2,nil,nil,nil,nil,nil,nil], __LINE__],
447
448     [['2/5 1999',false],[1999,5,2,nil,nil,nil,nil,nil,nil], __LINE__],
449     [['2/5-1999',false],[1999,5,2,nil,nil,nil,nil,nil,nil], __LINE__],
450     [['2/5--1999',false],[-1999,5,2,nil,nil,nil,nil,nil,nil], __LINE__],
451
452     # big
453     [['99/5/2',false],[99,5,2,nil,nil,nil,nil,nil,nil], __LINE__],
454     [['99/5/2',true],[1999,5,2,nil,nil,nil,nil,nil,nil], __LINE__],
455
456     [['1999/5/2',false],[1999,5,2,nil,nil,nil,nil,nil,nil], __LINE__],
457     [['1999/05/02',false],[1999,5,2,nil,nil,nil,nil,nil,nil], __LINE__],
458     [['-1999/05/02',false],[-1999,5,2,nil,nil,nil,nil,nil,nil], __LINE__],
459
460     [['0099/5/2',false],[99,5,2,nil,nil,nil,nil,nil,nil], __LINE__],
461     [['0099/5/2',true],[99,5,2,nil,nil,nil,nil,nil,nil], __LINE__],
462
463     [["'99/5/2",false],[99,5,2,nil,nil,nil,nil,nil,nil], __LINE__],
464     [["'99/5/2",true],[1999,5,2,nil,nil,nil,nil,nil,nil], __LINE__],
465    ].each do |x,y,l|
466      h = Date._parse(*x)
467      a = h.values_at(:year,:mon,:mday,:hour,:min,:sec,:zone,:offset,:wday)
468      if y[1] == -1
469	a[1] = -1
470	a[2] = h[:yday]
471      end
472      assert_equal(y, a, format('<failed at line %d>', l))
473    end
474  end
475
476  def test__parse__2
477    h = Date._parse('22:45:59.5')
478    assert_equal([22, 45, 59, 5.to_r/10**1], h.values_at(:hour, :min, :sec, :sec_fraction))
479    h = Date._parse('22:45:59.05')
480    assert_equal([22, 45, 59, 5.to_r/10**2], h.values_at(:hour, :min, :sec, :sec_fraction))
481    h = Date._parse('22:45:59.005')
482    assert_equal([22, 45, 59, 5.to_r/10**3], h.values_at(:hour, :min, :sec, :sec_fraction))
483    h = Date._parse('22:45:59.0123')
484    assert_equal([22, 45, 59, 123.to_r/10**4], h.values_at(:hour, :min, :sec, :sec_fraction))
485
486    h = Date._parse('224559.5')
487    assert_equal([22, 45, 59, 5.to_r/10**1], h.values_at(:hour, :min, :sec, :sec_fraction))
488    h = Date._parse('224559.05')
489    assert_equal([22, 45, 59, 5.to_r/10**2], h.values_at(:hour, :min, :sec, :sec_fraction))
490    h = Date._parse('224559.005')
491    assert_equal([22, 45, 59, 5.to_r/10**3], h.values_at(:hour, :min, :sec, :sec_fraction))
492    h = Date._parse('224559.0123')
493    assert_equal([22, 45, 59, 123.to_r/10**4], h.values_at(:hour, :min, :sec, :sec_fraction))
494
495    h = Date._parse('2006-w15-5')
496    assert_equal([2006, 15, 5], h.values_at(:cwyear, :cweek, :cwday))
497    h = Date._parse('2006w155')
498    assert_equal([2006, 15, 5], h.values_at(:cwyear, :cweek, :cwday))
499    h = Date._parse('06w155', false)
500    assert_equal([6, 15, 5], h.values_at(:cwyear, :cweek, :cwday))
501    h = Date._parse('06w155', true)
502    assert_equal([2006, 15, 5], h.values_at(:cwyear, :cweek, :cwday))
503
504    h = Date._parse('2006-w15')
505    assert_equal([2006, 15, nil], h.values_at(:cwyear, :cweek, :cwday))
506    h = Date._parse('2006w15')
507    assert_equal([2006, 15, nil], h.values_at(:cwyear, :cweek, :cwday))
508
509    h = Date._parse('-w15-5')
510    assert_equal([nil, 15, 5], h.values_at(:cwyear, :cweek, :cwday))
511    h = Date._parse('-w155')
512    assert_equal([nil, 15, 5], h.values_at(:cwyear, :cweek, :cwday))
513
514    h = Date._parse('-w15')
515    assert_equal([nil, 15, nil], h.values_at(:cwyear, :cweek, :cwday))
516    h = Date._parse('-w15')
517    assert_equal([nil, 15, nil], h.values_at(:cwyear, :cweek, :cwday))
518
519    h = Date._parse('-w-5')
520    assert_equal([nil, nil, 5], h.values_at(:cwyear, :cweek, :cwday))
521
522    h = Date._parse('--11-29')
523    assert_equal([nil, 11, 29], h.values_at(:year, :mon, :mday))
524    h = Date._parse('--1129')
525    assert_equal([nil, 11, 29], h.values_at(:year, :mon, :mday))
526    h = Date._parse('--11')
527    assert_equal([nil, 11, nil], h.values_at(:year, :mon, :mday))
528    h = Date._parse('---29')
529    assert_equal([nil, nil, 29], h.values_at(:year, :mon, :mday))
530    h = Date._parse('-333')
531    assert_equal([nil, 333], h.values_at(:year, :yday))
532
533    h = Date._parse('2006-333')
534    assert_equal([2006, 333], h.values_at(:year, :yday))
535    h = Date._parse('2006333')
536    assert_equal([2006, 333], h.values_at(:year, :yday))
537    h = Date._parse('06333', false)
538    assert_equal([6, 333], h.values_at(:year, :yday))
539    h = Date._parse('06333', true)
540    assert_equal([2006, 333], h.values_at(:year, :yday))
541    h = Date._parse('333')
542    assert_equal([nil, 333], h.values_at(:year, :yday))
543
544    h = Date._parse('')
545    assert_equal({}, h)
546  end
547
548  def test_parse
549    assert_equal(Date.new, Date.parse)
550    assert_equal(Date.new(2002,3,14), Date.parse('2002-03-14'))
551
552    assert_equal(DateTime.new(2002,3,14,11,22,33, 0),
553		 DateTime.parse('2002-03-14T11:22:33Z'))
554    assert_equal(DateTime.new(2002,3,14,11,22,33, 9.to_r/24),
555		 DateTime.parse('2002-03-14T11:22:33+09:00'))
556    assert_equal(DateTime.new(2002,3,14,11,22,33, -9.to_r/24),
557		 DateTime.parse('2002-03-14T11:22:33-09:00'))
558    assert_equal(DateTime.new(2002,3,14,11,22,33, -9.to_r/24) + 123456789.to_r/1000000000/86400,
559		 DateTime.parse('2002-03-14T11:22:33.123456789-09:00'))
560  end
561
562  def test_parse__2
563    d1 = DateTime.parse('2004-03-13T22:45:59.5')
564    d2 = DateTime.parse('2004-03-13T22:45:59')
565    assert_equal(d2 + 5.to_r/10**1/86400, d1)
566    d1 = DateTime.parse('2004-03-13T22:45:59.05')
567    d2 = DateTime.parse('2004-03-13T22:45:59')
568    assert_equal(d2 + 5.to_r/10**2/86400, d1)
569    d1 = DateTime.parse('2004-03-13T22:45:59.005')
570    d2 = DateTime.parse('2004-03-13T22:45:59')
571    assert_equal(d2 + 5.to_r/10**3/86400, d1)
572    d1 = DateTime.parse('2004-03-13T22:45:59.0123')
573    d2 = DateTime.parse('2004-03-13T22:45:59')
574    assert_equal(d2 + 123.to_r/10**4/86400, d1)
575    d1 = DateTime.parse('2004-03-13T22:45:59.5')
576    d1 += 1.to_r/2/86400
577    d2 = DateTime.parse('2004-03-13T22:46:00')
578    assert_equal(d2, d1)
579  end
580
581  def test__parse_odd_offset
582    h = DateTime._parse('2001-02-03T04:05:06+1')
583    assert_equal(3600, h[:offset])
584    h = DateTime._parse('2001-02-03T04:05:06+123')
585    assert_equal(4980, h[:offset])
586    h = DateTime._parse('2001-02-03T04:05:06+12345')
587    assert_equal(5025, h[:offset])
588  end
589
590  require 'time'
591
592  def test_parse__time
593    methods = [:to_s, :asctime, :iso8601, :rfc2822, :httpdate, :xmlschema]
594
595    t = Time.utc(2001,2,3,4,5,6)
596    methods.each do |m|
597      d = DateTime.parse(t.__send__(m))
598      assert_equal([2001, 2, 3, 4, 5, 6],
599		   [d.year, d.mon, d.mday, d.hour, d.min, d.sec],
600		   [m, t.__send__(m)].inspect)
601    end
602
603    t = Time.mktime(2001,2,3,4,5,6)
604    methods.each do |m|
605      next if m == :httpdate
606      d = DateTime.parse(t.__send__(m))
607      assert_equal([2001, 2, 3, 4, 5, 6],
608		   [d.year, d.mon, d.mday, d.hour, d.min, d.sec],
609		   [m, t.__send__(m)].inspect)
610    end
611  end
612
613  def test_parse__comp
614    n = DateTime.now
615
616    d = DateTime.parse('073')
617    assert_equal([n.year, 73, 0, 0, 0],
618		 [d.year, d.yday, d.hour, d.min, d.sec])
619    d = DateTime.parse('13')
620    assert_equal([n.year, n.mon, 13, 0, 0, 0],
621		 [d.year, d.mon, d.mday, d.hour, d.min, d.sec])
622
623    d = DateTime.parse('Mar 13')
624    assert_equal([n.year, 3, 13, 0, 0, 0],
625		 [d.year, d.mon, d.mday, d.hour, d.min, d.sec])
626    d = DateTime.parse('Mar 2004')
627    assert_equal([2004, 3, 1, 0, 0, 0],
628		 [d.year, d.mon, d.mday, d.hour, d.min, d.sec])
629    d = DateTime.parse('23:55')
630    assert_equal([n.year, n.mon, n.mday, 23, 55, 0],
631		 [d.year, d.mon, d.mday, d.hour, d.min, d.sec])
632    d = DateTime.parse('23:55:30')
633    assert_equal([n.year, n.mon, n.mday, 23, 55, 30],
634		 [d.year, d.mon, d.mday, d.hour, d.min, d.sec])
635
636    d = DateTime.parse('Sun 23:55')
637    d2 = d - d.wday
638    assert_equal([d2.year, d2.mon, d2.mday, 23, 55, 0],
639		 [d.year, d.mon, d.mday, d.hour, d.min, d.sec])
640    d = DateTime.parse('Aug 23:55')
641    assert_equal([n.year, 8, 1, 23, 55, 0],
642		 [d.year, d.mon, d.mday, d.hour, d.min, d.sec])
643  end
644
645  def test_parse__d_to_s
646    d = Date.new(2002,3,14)
647    assert_equal(d, Date.parse(d.to_s))
648
649    d = DateTime.new(2002,3,14,11,22,33, 9.to_r/24)
650    assert_equal(d, DateTime.parse(d.to_s))
651  end
652
653  def test_parse_utf8
654    h = DateTime._parse("Sun\u{3000}Aug 16 01:02:03 \u{65e5}\u{672c} 2009")
655    assert_equal(2009, h[:year])
656    assert_equal(8, h[:mon])
657    assert_equal(16, h[:mday])
658    assert_equal(0, h[:wday])
659    assert_equal(1, h[:hour])
660    assert_equal(2, h[:min])
661    assert_equal(3, h[:sec])
662    assert_equal("\u{65e5}\u{672c}", h[:zone])
663  end
664
665  def test_parse__ex
666    assert_raise(ArgumentError) do
667      Date.parse('')
668    end
669    assert_raise(ArgumentError) do
670      DateTime.parse('')
671    end
672    assert_raise(ArgumentError) do
673      Date.parse('2001-02-29')
674    end
675    assert_raise(ArgumentError) do
676      DateTime.parse('2001-02-29T23:59:60')
677    end
678    assert_nothing_raised(ArgumentError) do
679      DateTime.parse('2001-03-01T23:59:60')
680    end
681    assert_raise(ArgumentError) do
682      DateTime.parse('2001-03-01T23:59:61')
683    end
684    assert_raise(ArgumentError) do
685      Date.parse('23:55')
686    end
687  end
688
689  def test__iso8601
690    h = Date._iso8601('01-02-03T04:05:06Z')
691    assert_equal([2001, 2, 3, 4, 5, 6, 0],
692		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
693    h = Date._iso8601('2001-02-03T04:05:06Z')
694    assert_equal([2001, 2, 3, 4, 5, 6, 0],
695		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
696    h = Date._iso8601('--02-03T04:05:06Z')
697    assert_equal([nil, 2, 3, 4, 5, 6, 0],
698		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
699    h = Date._iso8601('---03T04:05:06Z')
700    assert_equal([nil, nil, 3, 4, 5, 6, 0],
701		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
702
703    h = Date._iso8601('2001-02-03T04:05')
704    assert_equal([2001, 2, 3, 4, 5, nil, nil],
705		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
706    h = Date._iso8601('2001-02-03T04:05:06')
707    assert_equal([2001, 2, 3, 4, 5, 6, nil],
708		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
709    h = Date._iso8601('2001-02-03T04:05:06,07')
710    assert_equal([2001, 2, 3, 4, 5, 6, nil],
711		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
712    h = Date._iso8601('2001-02-03T04:05:06Z')
713    assert_equal([2001, 2, 3, 4, 5, 6, 0],
714		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
715    h = Date._iso8601('2001-02-03T04:05:06.07+01:00')
716    assert_equal([2001, 2, 3, 4, 5, 6, 3600],
717		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
718
719    h = Date._iso8601('010203T040506Z')
720    assert_equal([2001, 2, 3, 4, 5, 6, 0],
721		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
722    h = Date._iso8601('20010203T040506Z')
723    assert_equal([2001, 2, 3, 4, 5, 6, 0],
724		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
725    h = Date._iso8601('--0203T040506Z')
726    assert_equal([nil, 2, 3, 4, 5, 6, 0],
727		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
728    h = Date._iso8601('---03T040506Z')
729    assert_equal([nil, nil, 3, 4, 5, 6, 0],
730		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
731
732    h = Date._iso8601('010203T0405')
733    assert_equal([2001, 2, 3, 4, 5, nil, nil],
734		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
735    h = Date._iso8601('20010203T0405')
736    assert_equal([2001, 2, 3, 4, 5, nil, nil],
737		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
738    h = Date._iso8601('20010203T040506')
739    assert_equal([2001, 2, 3, 4, 5, 6, nil],
740		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
741    h = Date._iso8601('20010203T040506,07')
742    assert_equal([2001, 2, 3, 4, 5, 6, nil],
743		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
744    h = Date._iso8601('20010203T040506Z')
745    assert_equal([2001, 2, 3, 4, 5, 6, 0],
746		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
747    h = Date._iso8601('20010203T040506.07+0100')
748    assert_equal([2001, 2, 3, 4, 5, 6, 3600],
749		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
750
751    h = Date._iso8601('200102030405')
752    assert_equal([2001, 2, 3, 4, 5, nil, nil],
753		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
754    h = Date._iso8601('20010203040506')
755    assert_equal([2001, 2, 3, 4, 5, 6, nil],
756		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
757    h = Date._iso8601('20010203040506,07')
758    assert_equal([2001, 2, 3, 4, 5, 6, nil],
759		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
760    h = Date._iso8601('20010203040506Z')
761    assert_equal([2001, 2, 3, 4, 5, 6, 0],
762		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
763    h = Date._iso8601('20010203040506.07+0100')
764    assert_equal([2001, 2, 3, 4, 5, 6, 3600],
765		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
766
767    h = Date._iso8601('01-023T04:05:06Z')
768    assert_equal([2001, 23, 4, 5, 6, 0],
769		 h.values_at(:year, :yday, :hour, :min, :sec, :offset))
770    h = Date._iso8601('2001-023T04:05:06Z')
771    assert_equal([2001, 23, 4, 5, 6, 0],
772		 h.values_at(:year, :yday, :hour, :min, :sec, :offset))
773    h = Date._iso8601('-023T04:05:06Z')
774    assert_equal([nil, 23, 4, 5, 6, 0],
775		 h.values_at(:year, :yday, :hour, :min, :sec, :offset))
776
777    h = Date._iso8601('01023T040506Z')
778    assert_equal([2001, 23, 4, 5, 6, 0],
779		 h.values_at(:year, :yday, :hour, :min, :sec, :offset))
780    h = Date._iso8601('2001023T040506Z')
781    assert_equal([2001, 23, 4, 5, 6, 0],
782		 h.values_at(:year, :yday, :hour, :min, :sec, :offset))
783    h = Date._iso8601('-023T040506Z')
784    assert_equal([nil, 23, 4, 5, 6, 0],
785		 h.values_at(:year, :yday, :hour, :min, :sec, :offset))
786
787    h = Date._iso8601('01-w02-3T04:05:06Z')
788    assert_equal([2001, 2, 3, 4, 5, 6, 0],
789		 h.values_at(:cwyear, :cweek, :cwday, :hour, :min, :sec, :offset))
790    h = Date._iso8601('2001-w02-3T04:05:06Z')
791    assert_equal([2001, 2, 3, 4, 5, 6, 0],
792		 h.values_at(:cwyear, :cweek, :cwday, :hour, :min, :sec, :offset))
793    h = Date._iso8601('-w02-3T04:05:06Z')
794    assert_equal([nil, 2, 3, 4, 5, 6, 0],
795		 h.values_at(:cwyear, :cweek, :cwday, :hour, :min, :sec, :offset))
796    h = Date._iso8601('-w-3T04:05:06Z')
797    assert_equal([nil, nil, 3, 4, 5, 6, 0],
798		 h.values_at(:cwyear, :cweek, :cwday, :hour, :min, :sec, :offset))
799
800    h = Date._iso8601('01w023T040506Z')
801    assert_equal([2001, 2, 3, 4, 5, 6, 0],
802		 h.values_at(:cwyear, :cweek, :cwday, :hour, :min, :sec, :offset))
803    h = Date._iso8601('2001w023T040506Z')
804    assert_equal([2001, 2, 3, 4, 5, 6, 0],
805		 h.values_at(:cwyear, :cweek, :cwday, :hour, :min, :sec, :offset))
806    h = Date._iso8601('-w023T040506Z')
807    assert_equal([nil, 2, 3, 4, 5, 6, 0],
808		 h.values_at(:cwyear, :cweek, :cwday, :hour, :min, :sec, :offset))
809    h = Date._iso8601('-w-3T040506Z')
810    assert_equal([nil, nil, 3, 4, 5, 6, 0],
811		 h.values_at(:cwyear, :cweek, :cwday, :hour, :min, :sec, :offset))
812
813    h = Date._iso8601('04:05')
814    assert_equal([nil, nil, nil, 4, 5, nil, nil],
815		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
816    h = Date._iso8601('04:05:06')
817    assert_equal([nil, nil, nil, 4, 5, 6, nil],
818		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
819    h = Date._iso8601('04:05:06,07')
820    assert_equal([nil, nil, nil, 4, 5, 6, nil],
821		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
822    h = Date._iso8601('04:05:06Z')
823    assert_equal([nil, nil, nil, 4, 5, 6, 0],
824		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
825    h = Date._iso8601('04:05:06.07+01:00')
826    assert_equal([nil, nil, nil, 4, 5, 6, 3600],
827		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
828
829    h = Date._iso8601('040506,07')
830    assert_equal([nil, nil, nil, 4, 5, 6, nil],
831		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
832    h = Date._iso8601('040506.07+0100')
833    assert_equal([nil, nil, nil, 4, 5, 6, 3600],
834		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
835
836    h = Date._iso8601('')
837    assert_equal({}, h)
838  end
839
840  def test__rfc3339
841    h = Date._rfc3339('2001-02-03T04:05:06Z')
842    assert_equal([2001, 2, 3, 4, 5, 6, 0],
843		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
844    h = Date._rfc3339('2001-02-03 04:05:06Z')
845    assert_equal([2001, 2, 3, 4, 5, 6, 0],
846		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
847    h = Date._rfc3339('2001-02-03T04:05:06.07+01:00')
848    assert_equal([2001, 2, 3, 4, 5, 6, 3600],
849		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
850
851    h = Date._rfc3339('')
852    assert_equal({}, h)
853  end
854
855  def test__xmlschema
856    h = Date._xmlschema('2001-02-03')
857    assert_equal([2001, 2, 3, nil, nil, nil, nil],
858		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
859    h = Date._xmlschema('2001-02-03Z')
860    assert_equal([2001, 2, 3, nil, nil, nil, 0],
861		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
862    h = Date._xmlschema('2001-02-03+01:00')
863    assert_equal([2001, 2, 3, nil, nil, nil, 3600],
864		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
865
866    h = Date._xmlschema('2001-02-03T04:05:06')
867    assert_equal([2001, 2, 3, 4, 5, 6, nil],
868		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
869    h = Date._xmlschema('2001-02-03T04:05:06.07')
870    assert_equal([2001, 2, 3, 4, 5, 6, nil],
871		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
872    h = Date._xmlschema('2001-02-03T04:05:06.07Z')
873    assert_equal([2001, 2, 3, 4, 5, 6, 0],
874		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
875    h = Date._xmlschema('2001-02-03T04:05:06.07+01:00')
876    assert_equal([2001, 2, 3, 4, 5, 6, 3600],
877		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
878
879    h = Date._xmlschema('04:05:06')
880    assert_equal([nil, nil, nil, 4, 5, 6, nil],
881		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
882    h = Date._xmlschema('04:05:06Z')
883    assert_equal([nil, nil, nil, 4, 5, 6, 0],
884		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
885    h = Date._xmlschema('04:05:06+01:00')
886    assert_equal([nil, nil, nil, 4, 5, 6, 3600],
887		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
888
889    h = Date._xmlschema('2001-02')
890    assert_equal([2001, 2, nil, nil, nil, nil, nil],
891		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
892    h = Date._xmlschema('2001-02Z')
893    assert_equal([2001, 2, nil, nil, nil, nil, 0],
894		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
895    h = Date._xmlschema('2001-02+01:00')
896    assert_equal([2001, 2, nil, nil, nil, nil, 3600],
897		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
898    h = Date._xmlschema('2001-02-01:00')
899    assert_equal([2001, 2, nil, nil, nil, nil, -3600],
900		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
901
902    h = Date._xmlschema('2001')
903    assert_equal([2001, nil, nil, nil, nil, nil, nil],
904		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
905    h = Date._xmlschema('2001Z')
906    assert_equal([2001, nil, nil, nil, nil, nil, 0],
907		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
908    h = Date._xmlschema('2001+01:00')
909    assert_equal([2001, nil, nil, nil, nil, nil, 3600],
910		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
911    h = Date._xmlschema('2001-01:00')
912    assert_equal([2001, nil, nil, nil, nil, nil, -3600],
913		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
914
915    h = Date._xmlschema('--02')
916    assert_equal([nil, 2, nil, nil, nil, nil, nil],
917		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
918    h = Date._xmlschema('--02Z')
919    assert_equal([nil, 2, nil, nil, nil, nil, 0],
920		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
921    h = Date._xmlschema('--02+01:00')
922    assert_equal([nil, 2, nil, nil, nil, nil, 3600],
923		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
924
925    h = Date._xmlschema('92001-02-03T04:05:06.07+01:00')
926    assert_equal([92001, 2, 3, 4, 5, 6, 3600],
927		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
928
929    h = Date._xmlschema('-92001-02-03T04:05:06.07+01:00')
930    assert_equal([-92001, 2, 3, 4, 5, 6, 3600],
931		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
932
933    h = Date._xmlschema('')
934    assert_equal({}, h)
935  end
936
937  def test__rfc2822
938    h = Date._rfc2822('Sat, 3 Feb 2001 04:05:06 UT')
939    assert_equal([2001, 2, 3, 4, 5, 6, 0],
940		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
941    h = Date._rfc2822('Sat, 3 Feb 2001 04:05:06 EST')
942    assert_equal([2001, 2, 3, 4, 5, 6, -5*3600],
943		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
944    h = Date._rfc2822('Sat, 3 Feb 2001 04:05:06 +0000')
945    assert_equal([2001, 2, 3, 4, 5, 6, 0],
946		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
947    h = Date._rfc2822('Sat, 3 Feb 2001 04:05:06 +0100')
948    assert_equal([2001, 2, 3, 4, 5, 6, 3600],
949		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
950
951    h = Date._rfc2822('Sat, 03 Feb 50 04:05:06 +0100')
952    assert_equal([1950, 2, 3, 4, 5, 6, 3600],
953		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
954    h = Date._rfc2822('Sat, 03 Feb 49 04:05:06 +0100')
955    assert_equal([2049, 2, 3, 4, 5, 6, 3600],
956		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
957    h = Date._rfc2822('Sat, 03 Feb 100 04:05:06 +0100')
958    assert_equal([2000, 2, 3, 4, 5, 6, 3600],
959		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
960
961    h1 = Date._rfc2822('Sat, 3 Feb 2001 04:05:06 UT')
962    h2 = Date._rfc822('Sat, 3 Feb 2001 04:05:06 UT')
963    assert_equal(h1, h2)
964
965    h = Date._rfc2822('')
966    assert_equal({}, h)
967  end
968
969  def test__httpdate
970    h = Date._httpdate('Sat, 03 Feb 2001 04:05:06 GMT')
971    assert_equal([2001, 2, 3, 4, 5, 6, 0],
972		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
973
974    h = Date._httpdate('Saturday, 03-Feb-01 04:05:06 GMT')
975    assert_equal([2001, 2, 3, 4, 5, 6, 0],
976		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
977
978    h = Date._httpdate('Sat Feb  3 04:05:06 2001')
979    assert_equal([2001, 2, 3, 4, 5, 6, nil],
980		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
981    h = Date._httpdate('Sat Feb 03 04:05:06 2001')
982    assert_equal([2001, 2, 3, 4, 5, 6, nil],
983		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
984
985    h = Date._httpdate('')
986    assert_equal({}, h)
987  end
988
989  def test__jisx0301
990    h = Date._jisx0301('13.02.03')
991    assert_equal([2001, 2, 3, nil, nil, nil, nil],
992		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
993    h = Date._jisx0301('H13.02.03')
994    assert_equal([2001, 2, 3, nil, nil, nil, nil],
995		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
996    h = Date._jisx0301('S63.02.03')
997    assert_equal([1988, 2, 3, nil, nil, nil, nil],
998		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
999
1000    h = Date._jisx0301('H13.02.03T04:05:06')
1001    assert_equal([2001, 2, 3, 4, 5, 6, nil],
1002		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
1003    h = Date._jisx0301('H13.02.03T04:05:06,07')
1004    assert_equal([2001, 2, 3, 4, 5, 6, nil],
1005		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
1006    h = Date._jisx0301('H13.02.03T04:05:06Z')
1007    assert_equal([2001, 2, 3, 4, 5, 6, 0],
1008		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
1009    h = Date._jisx0301('H13.02.03T04:05:06.07+0100')
1010    assert_equal([2001, 2, 3, 4, 5, 6, 3600],
1011		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
1012
1013    h = Date._jisx0301('')
1014    assert_equal({}, h)
1015  end
1016
1017  def test_iso8601
1018    assert_instance_of(Date, Date.iso8601)
1019    assert_instance_of(DateTime, DateTime.iso8601)
1020
1021    d = Date.iso8601('2001-02-03', Date::ITALY + 10)
1022    assert_equal(Date.new(2001,2,3), d)
1023    assert_equal(Date::ITALY + 10, d.start)
1024
1025    d = DateTime.iso8601('2001-02-03T04:05:06+07:00', Date::ITALY + 10)
1026    assert_equal(DateTime.new(2001,2,3,4,5,6,'+07:00'), d)
1027    assert_equal(Date::ITALY + 10, d.start)
1028  end
1029
1030  def test_rfc3339
1031    assert_instance_of(Date, Date.rfc3339)
1032    assert_instance_of(DateTime, DateTime.rfc3339)
1033
1034    d = Date.rfc3339('2001-02-03T04:05:06+07:00', Date::ITALY + 10)
1035    assert_equal(Date.new(2001,2,3), d)
1036    assert_equal(Date::ITALY + 10, d.start)
1037
1038    d = DateTime.rfc3339('2001-02-03T04:05:06+07:00', Date::ITALY + 10)
1039    assert_equal(DateTime.new(2001,2,3,4,5,6,'+07:00'), d)
1040    assert_equal(Date::ITALY + 10, d.start)
1041  end
1042
1043  def test_xmlschema
1044    assert_instance_of(Date, Date.xmlschema)
1045    assert_instance_of(DateTime, DateTime.xmlschema)
1046
1047    d = Date.xmlschema('2001-02-03', Date::ITALY + 10)
1048    assert_equal(Date.new(2001,2,3), d)
1049    assert_equal(Date::ITALY + 10, d.start)
1050
1051    d = DateTime.xmlschema('2001-02-03T04:05:06+07:00', Date::ITALY + 10)
1052    assert_equal(DateTime.new(2001,2,3,4,5,6,'+07:00'), d)
1053    assert_equal(Date::ITALY + 10, d.start)
1054  end
1055
1056  def test_rfc2822
1057    assert_instance_of(Date, Date.rfc2822)
1058    assert_instance_of(DateTime, DateTime.rfc2822)
1059    assert_instance_of(Date, Date.rfc822)
1060    assert_instance_of(DateTime, DateTime.rfc822)
1061
1062    d = Date.rfc2822('Sat, 3 Feb 2001 04:05:06 +0700', Date::ITALY + 10)
1063    assert_equal(Date.new(2001,2,3), d)
1064    assert_equal(Date::ITALY + 10, d.start)
1065    d = Date.rfc2822('3 Feb 2001 04:05:06 +0700', Date::ITALY + 10)
1066    assert_equal(Date.new(2001,2,3), d)
1067    assert_equal(Date::ITALY + 10, d.start)
1068
1069    d = DateTime.rfc2822('Sat, 3 Feb 2001 04:05:06 +0700', Date::ITALY + 10)
1070    assert_equal(DateTime.new(2001,2,3,4,5,6,'+07:00'), d)
1071    assert_equal(Date::ITALY + 10, d.start)
1072    d = DateTime.rfc2822('3 Feb 2001 04:05:06 +0700', Date::ITALY + 10)
1073    assert_equal(DateTime.new(2001,2,3,4,5,6,'+07:00'), d)
1074    assert_equal(Date::ITALY + 10, d.start)
1075  end
1076
1077  def test_httpdate
1078    assert_instance_of(Date, Date.httpdate)
1079    assert_instance_of(DateTime, DateTime.httpdate)
1080
1081    d = Date.httpdate('Sat, 03 Feb 2001 04:05:06 GMT', Date::ITALY + 10)
1082    assert_equal(Date.new(2001,2,3), d)
1083    assert_equal(Date::ITALY + 10, d.start)
1084
1085    d = DateTime.httpdate('Sat, 03 Feb 2001 04:05:06 GMT', Date::ITALY + 10)
1086    assert_equal(DateTime.new(2001,2,3,4,5,6,'+00:00'), d)
1087    assert_equal(Date::ITALY + 10, d.start)
1088  end
1089
1090  def test_jisx0301
1091    assert_instance_of(Date, Date.jisx0301)
1092    assert_instance_of(DateTime, DateTime.jisx0301)
1093
1094    d = Date.jisx0301('H13.02.03', Date::ITALY + 10)
1095    assert_equal(Date.new(2001,2,3), d)
1096    assert_equal(Date::ITALY + 10, d.start)
1097
1098    d = DateTime.jisx0301('H13.02.03T04:05:06+07:00', Date::ITALY + 10)
1099    assert_equal(DateTime.new(2001,2,3,4,5,6,'+07:00'), d)
1100    assert_equal(Date::ITALY + 10, d.start)
1101  end
1102
1103  def test_given_string
1104    s = '2001-02-03T04:05:06Z'
1105    s0 = s.dup
1106
1107    assert_not_equal({}, Date._parse(s))
1108    assert_equal(s0, s)
1109
1110    assert_not_equal({}, Date._iso8601(s))
1111    assert_equal(s0, s)
1112
1113    assert_not_equal({}, Date._rfc3339(s))
1114    assert_equal(s0, s)
1115
1116    assert_not_equal({}, Date._xmlschema(s))
1117    assert_equal(s0, s)
1118
1119    s = 'Sat, 3 Feb 2001 04:05:06 UT'
1120    s0 = s.dup
1121    assert_not_equal({}, Date._rfc2822(s))
1122    assert_equal(s0, s)
1123    assert_not_equal({}, Date._rfc822(s))
1124    assert_equal(s0, s)
1125
1126    s = 'Sat, 03 Feb 2001 04:05:06 GMT'
1127    s0 = s.dup
1128    assert_not_equal({}, Date._httpdate(s))
1129    assert_equal(s0, s)
1130
1131    s = 'H13.02.03T04:05:06,07Z'
1132    s0 = s.dup
1133    assert_not_equal({}, Date._jisx0301(s))
1134    assert_equal(s0, s)
1135  end
1136
1137end
1138