@@ -147,19 +147,68 @@ def test_rfc_3339_extended_nanoseconds(self):
147147 self .assertEqual (123456789 , parsed ['subsecond' ])
148148 self .assertEqual (19800 , parsed ['offset' ])
149149
150- def test_iso_8601 (self ):
151- text = '201610 '
150+ def test_iso_8601_date (self ):
151+ text = '2012 '
152152
153153 parsed = Parser ().parse (text )
154- self .assertEqual (2016 , parsed ['year' ])
155- self .assertEqual (10 , parsed ['month' ])
154+ self .assertEqual (2012 , parsed ['year' ])
155+ self .assertEqual (1 , parsed ['month' ])
156156 self .assertEqual (1 , parsed ['day' ])
157157 self .assertEqual (0 , parsed ['hour' ])
158158 self .assertEqual (0 , parsed ['minute' ])
159159 self .assertEqual (0 , parsed ['second' ])
160160 self .assertEqual (0 , parsed ['subsecond' ])
161161 self .assertEqual (None , parsed ['offset' ])
162162
163+ text = '2012-05-03'
164+
165+ parsed = Parser ().parse (text )
166+ self .assertEqual (2012 , parsed ['year' ])
167+ self .assertEqual (5 , parsed ['month' ])
168+ self .assertEqual (3 , parsed ['day' ])
169+ self .assertEqual (0 , parsed ['hour' ])
170+ self .assertEqual (0 , parsed ['minute' ])
171+ self .assertEqual (0 , parsed ['second' ])
172+ self .assertEqual (0 , parsed ['subsecond' ])
173+ self .assertEqual (None , parsed ['offset' ])
174+
175+ text = '20120503'
176+
177+ parsed = Parser ().parse (text )
178+ self .assertEqual (2012 , parsed ['year' ])
179+ self .assertEqual (5 , parsed ['month' ])
180+ self .assertEqual (3 , parsed ['day' ])
181+ self .assertEqual (0 , parsed ['hour' ])
182+ self .assertEqual (0 , parsed ['minute' ])
183+ self .assertEqual (0 , parsed ['second' ])
184+ self .assertEqual (0 , parsed ['subsecond' ])
185+ self .assertEqual (None , parsed ['offset' ])
186+
187+ text = '2012-05'
188+
189+ parsed = Parser ().parse (text )
190+ self .assertEqual (2012 , parsed ['year' ])
191+ self .assertEqual (5 , parsed ['month' ])
192+ self .assertEqual (1 , parsed ['day' ])
193+ self .assertEqual (0 , parsed ['hour' ])
194+ self .assertEqual (0 , parsed ['minute' ])
195+ self .assertEqual (0 , parsed ['second' ])
196+ self .assertEqual (0 , parsed ['subsecond' ])
197+ self .assertEqual (None , parsed ['offset' ])
198+
199+ text = '201205'
200+
201+ parsed = Parser ().parse (text )
202+ self .assertEqual (2012 , parsed ['year' ])
203+ self .assertEqual (5 , parsed ['month' ])
204+ self .assertEqual (1 , parsed ['day' ])
205+ self .assertEqual (0 , parsed ['hour' ])
206+ self .assertEqual (0 , parsed ['minute' ])
207+ self .assertEqual (0 , parsed ['second' ])
208+ self .assertEqual (0 , parsed ['subsecond' ])
209+ self .assertEqual (None , parsed ['offset' ])
210+
211+ def test_iso8601_datetime (self ):
163212 text = '2016-10-01T14'
164213
165214 parsed = Parser ().parse (text )
@@ -232,6 +281,98 @@ def test_iso_8601(self):
232281 self .assertEqual (400000000 , parsed ['subsecond' ])
233282 self .assertEqual (19800 , parsed ['offset' ])
234283
284+ text = '2008-09-03T20:56:35.450686+01'
285+
286+ parsed = Parser ().parse (text )
287+ self .assertEqual (2008 , parsed ['year' ])
288+ self .assertEqual (9 , parsed ['month' ])
289+ self .assertEqual (3 , parsed ['day' ])
290+ self .assertEqual (20 , parsed ['hour' ])
291+ self .assertEqual (56 , parsed ['minute' ])
292+ self .assertEqual (35 , parsed ['second' ])
293+ self .assertEqual (450686000 , parsed ['subsecond' ])
294+ self .assertEqual (3600 , parsed ['offset' ])
295+
296+ def test_iso8601_week_number (self ):
297+ text = '2012-W05'
298+
299+ parsed = Parser ().parse (text )
300+ self .assertEqual (2012 , parsed ['year' ])
301+ self .assertEqual (1 , parsed ['month' ])
302+ self .assertEqual (30 , parsed ['day' ])
303+ self .assertEqual (0 , parsed ['hour' ])
304+ self .assertEqual (0 , parsed ['minute' ])
305+ self .assertEqual (0 , parsed ['second' ])
306+ self .assertEqual (0 , parsed ['subsecond' ])
307+ self .assertEqual (None , parsed ['offset' ])
308+
309+ text = '2012W05'
310+
311+ parsed = Parser ().parse (text )
312+ self .assertEqual (2012 , parsed ['year' ])
313+ self .assertEqual (1 , parsed ['month' ])
314+ self .assertEqual (30 , parsed ['day' ])
315+ self .assertEqual (0 , parsed ['hour' ])
316+ self .assertEqual (0 , parsed ['minute' ])
317+ self .assertEqual (0 , parsed ['second' ])
318+ self .assertEqual (0 , parsed ['subsecond' ])
319+ self .assertEqual (None , parsed ['offset' ])
320+
321+ text = '2012-W05-5'
322+
323+ parsed = Parser ().parse (text )
324+ self .assertEqual (2012 , parsed ['year' ])
325+ self .assertEqual (2 , parsed ['month' ])
326+ self .assertEqual (3 , parsed ['day' ])
327+ self .assertEqual (0 , parsed ['hour' ])
328+ self .assertEqual (0 , parsed ['minute' ])
329+ self .assertEqual (0 , parsed ['second' ])
330+ self .assertEqual (0 , parsed ['subsecond' ])
331+ self .assertEqual (None , parsed ['offset' ])
332+
333+ text = '2012W055'
334+
335+ parsed = Parser ().parse (text )
336+ self .assertEqual (2012 , parsed ['year' ])
337+ self .assertEqual (2 , parsed ['month' ])
338+ self .assertEqual (3 , parsed ['day' ])
339+ self .assertEqual (0 , parsed ['hour' ])
340+ self .assertEqual (0 , parsed ['minute' ])
341+ self .assertEqual (0 , parsed ['second' ])
342+ self .assertEqual (0 , parsed ['subsecond' ])
343+ self .assertEqual (None , parsed ['offset' ])
344+
345+ def test_iso8601_ordinal (self ):
346+ text = '2012-007'
347+
348+ parsed = Parser ().parse (text )
349+ self .assertEqual (2012 , parsed ['year' ])
350+ self .assertEqual (1 , parsed ['month' ])
351+ self .assertEqual (7 , parsed ['day' ])
352+ self .assertEqual (0 , parsed ['hour' ])
353+ self .assertEqual (0 , parsed ['minute' ])
354+ self .assertEqual (0 , parsed ['second' ])
355+ self .assertEqual (0 , parsed ['subsecond' ])
356+ self .assertEqual (None , parsed ['offset' ])
357+
358+ text = '2012007'
359+
360+ parsed = Parser ().parse (text )
361+ self .assertEqual (2012 , parsed ['year' ])
362+ self .assertEqual (1 , parsed ['month' ])
363+ self .assertEqual (7 , parsed ['day' ])
364+ self .assertEqual (0 , parsed ['hour' ])
365+ self .assertEqual (0 , parsed ['minute' ])
366+ self .assertEqual (0 , parsed ['second' ])
367+ self .assertEqual (0 , parsed ['subsecond' ])
368+ self .assertEqual (None , parsed ['offset' ])
369+
370+ def test_iso8601_ordinal_invalid (self ):
371+ text = '2012-007-05'
372+
373+ self .assertRaises (ParserError , Parser ().parse , text )
374+
375+
235376 def test_invalid (self ):
236377 text = '201610T'
237378
0 commit comments