comparison env/lib/python3.7/site-packages/isodate/tests/test_duration.py @ 0:26e78fe6e8c4 draft

"planemo upload commit c699937486c35866861690329de38ec1a5d9f783"
author shellac
date Sat, 02 May 2020 07:14:21 -0400
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:26e78fe6e8c4
1 ##############################################################################
2 # Copyright 2009, Gerhard Weis
3 # All rights reserved.
4 #
5 # Redistribution and use in source and binary forms, with or without
6 # modification, are permitted provided that the following conditions are met:
7 #
8 # * Redistributions of source code must retain the above copyright notice,
9 # this list of conditions and the following disclaimer.
10 # * Redistributions in binary form must reproduce the above copyright notice,
11 # this list of conditions and the following disclaimer in the documentation
12 # and/or other materials provided with the distribution.
13 # * Neither the name of the authors nor the names of its contributors
14 # may be used to endorse or promote products derived from this software
15 # without specific prior written permission.
16 #
17 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18 # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
21 # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22 # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23 # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24 # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25 # CONTRACT, STRICT LIABILITY, OR TORT
26 ##############################################################################
27 '''
28 Test cases for the isoduration module.
29 '''
30 import unittest
31 import operator
32 from datetime import timedelta, date, datetime
33
34 from isodate import Duration, parse_duration, ISO8601Error
35 from isodate import D_DEFAULT, D_WEEK, D_ALT_EXT, duration_isoformat
36
37 # the following list contains tuples of ISO duration strings and the expected
38 # result from the parse_duration method. A result of None means an ISO8601Error
39 # is expected.
40 PARSE_TEST_CASES = {'P18Y9M4DT11H9M8S': (Duration(4, 8, 0, 0, 9, 11, 0, 9, 18),
41 D_DEFAULT, None),
42 'P2W': (timedelta(weeks=2), D_WEEK, None),
43 'P3Y6M4DT12H30M5S': (Duration(4, 5, 0, 0, 30, 12, 0, 6, 3),
44 D_DEFAULT, None),
45 'P23DT23H': (timedelta(hours=23, days=23),
46 D_DEFAULT, None),
47 'P4Y': (Duration(years=4), D_DEFAULT, None),
48 'P1M': (Duration(months=1), D_DEFAULT, None),
49 'PT1M': (timedelta(minutes=1), D_DEFAULT, None),
50 'P0.5Y': (Duration(years=0.5), D_DEFAULT, None),
51 'PT36H': (timedelta(hours=36), D_DEFAULT, 'P1DT12H'),
52 'P1DT12H': (timedelta(days=1, hours=12), D_DEFAULT, None),
53 '+P11D': (timedelta(days=11), D_DEFAULT, 'P11D'),
54 '-P2W': (timedelta(weeks=-2), D_WEEK, None),
55 '-P2.2W': (timedelta(weeks=-2.2), D_DEFAULT,
56 '-P15DT9H36M'),
57 'P1DT2H3M4S': (timedelta(days=1, hours=2, minutes=3,
58 seconds=4), D_DEFAULT, None),
59 'P1DT2H3M': (timedelta(days=1, hours=2, minutes=3),
60 D_DEFAULT, None),
61 'P1DT2H': (timedelta(days=1, hours=2), D_DEFAULT, None),
62 'PT2H': (timedelta(hours=2), D_DEFAULT, None),
63 'PT2.3H': (timedelta(hours=2.3), D_DEFAULT, 'PT2H18M'),
64 'PT2H3M4S': (timedelta(hours=2, minutes=3, seconds=4),
65 D_DEFAULT, None),
66 'PT3M4S': (timedelta(minutes=3, seconds=4), D_DEFAULT,
67 None),
68 'PT22S': (timedelta(seconds=22), D_DEFAULT, None),
69 'PT22.22S': (timedelta(seconds=22.22), 'PT%S.%fS',
70 'PT22.220000S'),
71 '-P2Y': (Duration(years=-2), D_DEFAULT, None),
72 '-P3Y6M4DT12H30M5S': (Duration(-4, -5, 0, 0, -30, -12, 0,
73 -6, -3), D_DEFAULT, None),
74 '-P1DT2H3M4S': (timedelta(days=-1, hours=-2, minutes=-3,
75 seconds=-4), D_DEFAULT, None),
76 # alternative format
77 'P0018-09-04T11:09:08': (Duration(4, 8, 0, 0, 9, 11, 0, 9,
78 18), D_ALT_EXT, None),
79 # 'PT000022.22': timedelta(seconds=22.22),
80 }
81
82 # d1 d2 '+', '-', '>'
83 # A list of test cases to test addition and subtraction between datetime and
84 # Duration objects.
85 # each tuple contains 2 duration strings, and a result string for addition and
86 # one for subtraction. The last value says, if the first duration is greater
87 # than the second.
88 MATH_TEST_CASES = (('P5Y7M1DT9H45M16.72S', 'PT27M24.68S',
89 'P5Y7M1DT10H12M41.4S', 'P5Y7M1DT9H17M52.04S', None),
90 ('PT28M12.73S', 'PT56M29.92S',
91 'PT1H24M42.65S', '-PT28M17.19S', False),
92 ('P3Y7M23DT5H25M0.33S', 'PT1H1.95S',
93 'P3Y7M23DT6H25M2.28S', 'P3Y7M23DT4H24M58.38S', None),
94 ('PT1H1.95S', 'P3Y7M23DT5H25M0.33S',
95 'P3Y7M23DT6H25M2.28S', '-P3Y7M23DT4H24M58.38S', None),
96 ('P1332DT55M0.33S', 'PT1H1.95S',
97 'P1332DT1H55M2.28S', 'P1331DT23H54M58.38S', True),
98 ('PT1H1.95S', 'P1332DT55M0.33S',
99 'P1332DT1H55M2.28S', '-P1331DT23H54M58.38S', False))
100
101
102 # A list of test cases to test addition and subtraction of date/datetime
103 # and Duration objects. They are tested against the results of an
104 # equal long timedelta duration.
105 DATE_TEST_CASES = ((date(2008, 2, 29),
106 timedelta(days=10, hours=12, minutes=20),
107 Duration(days=10, hours=12, minutes=20)),
108 (date(2008, 1, 31),
109 timedelta(days=10, hours=12, minutes=20),
110 Duration(days=10, hours=12, minutes=20)),
111 (datetime(2008, 2, 29),
112 timedelta(days=10, hours=12, minutes=20),
113 Duration(days=10, hours=12, minutes=20)),
114 (datetime(2008, 1, 31),
115 timedelta(days=10, hours=12, minutes=20),
116 Duration(days=10, hours=12, minutes=20)),
117 (datetime(2008, 4, 21),
118 timedelta(days=10, hours=12, minutes=20),
119 Duration(days=10, hours=12, minutes=20)),
120 (datetime(2008, 5, 5),
121 timedelta(days=10, hours=12, minutes=20),
122 Duration(days=10, hours=12, minutes=20)),
123 (datetime(2000, 1, 1),
124 timedelta(hours=-33),
125 Duration(hours=-33)),
126 (datetime(2008, 5, 5),
127 Duration(years=1, months=1, days=10, hours=12,
128 minutes=20),
129 Duration(months=13, days=10, hours=12, minutes=20)),
130 (datetime(2000, 3, 30),
131 Duration(years=1, months=1, days=10, hours=12,
132 minutes=20),
133 Duration(months=13, days=10, hours=12, minutes=20)),
134 )
135
136 # A list of test cases of additon of date/datetime and Duration. The results
137 # are compared against a given expected result.
138 DATE_CALC_TEST_CASES = (
139 (date(2000, 2, 1),
140 Duration(years=1, months=1),
141 date(2001, 3, 1)),
142 (date(2000, 2, 29),
143 Duration(years=1, months=1),
144 date(2001, 3, 29)),
145 (date(2000, 2, 29),
146 Duration(years=1),
147 date(2001, 2, 28)),
148 (date(1996, 2, 29),
149 Duration(years=4),
150 date(2000, 2, 29)),
151 (date(2096, 2, 29),
152 Duration(years=4),
153 date(2100, 2, 28)),
154 (date(2000, 2, 1),
155 Duration(years=-1, months=-1),
156 date(1999, 1, 1)),
157 (date(2000, 2, 29),
158 Duration(years=-1, months=-1),
159 date(1999, 1, 29)),
160 (date(2000, 2, 1),
161 Duration(years=1, months=1, days=1),
162 date(2001, 3, 2)),
163 (date(2000, 2, 29),
164 Duration(years=1, months=1, days=1),
165 date(2001, 3, 30)),
166 (date(2000, 2, 29),
167 Duration(years=1, days=1),
168 date(2001, 3, 1)),
169 (date(1996, 2, 29),
170 Duration(years=4, days=1),
171 date(2000, 3, 1)),
172 (date(2096, 2, 29),
173 Duration(years=4, days=1),
174 date(2100, 3, 1)),
175 (date(2000, 2, 1),
176 Duration(years=-1, months=-1, days=-1),
177 date(1998, 12, 31)),
178 (date(2000, 2, 29),
179 Duration(years=-1, months=-1, days=-1),
180 date(1999, 1, 28)),
181 (date(2001, 4, 1),
182 Duration(years=-1, months=-1, days=-1),
183 date(2000, 2, 29)),
184 (date(2000, 4, 1),
185 Duration(years=-1, months=-1, days=-1),
186 date(1999, 2, 28)),
187 (Duration(years=1, months=2),
188 Duration(years=0, months=0, days=1),
189 Duration(years=1, months=2, days=1)),
190 (Duration(years=-1, months=-1, days=-1),
191 date(2000, 4, 1),
192 date(1999, 2, 28)),
193 (Duration(years=1, months=1, weeks=5),
194 date(2000, 1, 30),
195 date(2001, 4, 4)),
196 (parse_duration("P1Y1M5W"),
197 date(2000, 1, 30),
198 date(2001, 4, 4)),
199 (parse_duration("P0.5Y"),
200 date(2000, 1, 30),
201 None),
202 (Duration(years=1, months=1, hours=3),
203 datetime(2000, 1, 30, 12, 15, 00),
204 datetime(2001, 2, 28, 15, 15, 00)),
205 (parse_duration("P1Y1MT3H"),
206 datetime(2000, 1, 30, 12, 15, 00),
207 datetime(2001, 2, 28, 15, 15, 00)),
208 (Duration(years=1, months=2),
209 timedelta(days=1),
210 Duration(years=1, months=2, days=1)),
211 (timedelta(days=1),
212 Duration(years=1, months=2),
213 Duration(years=1, months=2, days=1)),
214 (datetime(2008, 1, 1, 0, 2),
215 Duration(months=1),
216 datetime(2008, 2, 1, 0, 2)),
217 (datetime.strptime("200802", "%Y%M"),
218 parse_duration("P1M"),
219 datetime(2008, 2, 1, 0, 2)),
220 (datetime(2008, 2, 1),
221 Duration(months=1),
222 datetime(2008, 3, 1)),
223 (datetime.strptime("200802", "%Y%m"),
224 parse_duration("P1M"),
225 datetime(2008, 3, 1)),
226 # (date(2000, 1, 1),
227 # Duration(years=1.5),
228 # date(2001, 6, 1)),
229 # (date(2000, 1, 1),
230 # Duration(years=1, months=1.5),
231 # date(2001, 2, 14)),
232 )
233
234 # A list of test cases of multiplications of durations
235 # are compared against a given expected result.
236 DATE_MUL_TEST_CASES = (
237 (Duration(years=1, months=1),
238 3,
239 Duration(years=3, months=3)),
240 (Duration(years=1, months=1),
241 -3,
242 Duration(years=-3, months=-3)),
243 (3,
244 Duration(years=1, months=1),
245 Duration(years=3, months=3)),
246 (-3,
247 Duration(years=1, months=1),
248 Duration(years=-3, months=-3)),
249 (5,
250 Duration(years=2, minutes=40),
251 Duration(years=10, hours=3, minutes=20)),
252 (-5,
253 Duration(years=2, minutes=40),
254 Duration(years=-10, hours=-3, minutes=-20)),
255 (7,
256 Duration(years=1, months=2, weeks=40),
257 Duration(years=8, months=2, weeks=280)))
258
259
260 class DurationTest(unittest.TestCase):
261 '''
262 This class tests various other aspects of the isoduration module,
263 which are not covered with the test cases listed above.
264 '''
265
266 def test_associative(self):
267 '''
268 Adding 2 durations to a date is not associative.
269 '''
270 days1 = Duration(days=1)
271 months1 = Duration(months=1)
272 start = date(2000, 3, 30)
273 res1 = start + days1 + months1
274 res2 = start + months1 + days1
275 self.assertNotEqual(res1, res2)
276
277 def test_typeerror(self):
278 '''
279 Test if TypError is raised with certain parameters.
280 '''
281 self.assertRaises(TypeError, parse_duration, date(2000, 1, 1))
282 self.assertRaises(TypeError, operator.sub, Duration(years=1),
283 date(2000, 1, 1))
284 self.assertRaises(TypeError, operator.sub, 'raise exc',
285 Duration(years=1))
286 self.assertRaises(TypeError, operator.add,
287 Duration(years=1, months=1, weeks=5),
288 'raise exception')
289 self.assertRaises(TypeError, operator.add, 'raise exception',
290 Duration(years=1, months=1, weeks=5))
291 self.assertRaises(TypeError, operator.mul,
292 Duration(years=1, months=1, weeks=5),
293 'raise exception')
294 self.assertRaises(TypeError, operator.mul, 'raise exception',
295 Duration(years=1, months=1, weeks=5))
296 self.assertRaises(TypeError, operator.mul,
297 Duration(years=1, months=1, weeks=5),
298 3.14)
299 self.assertRaises(TypeError, operator.mul, 3.14,
300 Duration(years=1, months=1, weeks=5))
301
302 def test_parseerror(self):
303 '''
304 Test for unparseable duration string.
305 '''
306 self.assertRaises(ISO8601Error, parse_duration, 'T10:10:10')
307
308 def test_repr(self):
309 '''
310 Test __repr__ and __str__ for Duration objects.
311 '''
312 dur = Duration(10, 10, years=10, months=10)
313 self.assertEqual('10 years, 10 months, 10 days, 0:00:10', str(dur))
314 self.assertEqual('isodate.duration.Duration(10, 10, 0,'
315 ' years=10, months=10)', repr(dur))
316 dur = Duration(months=0)
317 self.assertEqual('0:00:00', str(dur))
318 dur = Duration(months=1)
319 self.assertEqual('1 month, 0:00:00', str(dur))
320
321 def test_hash(self):
322 '''
323 Test __hash__ for Duration objects.
324 '''
325 dur1 = Duration(10, 10, years=10, months=10)
326 dur2 = Duration(9, 9, years=9, months=9)
327 dur3 = Duration(10, 10, years=10, months=10)
328 self.assertNotEqual(hash(dur1), hash(dur2))
329 self.assertNotEqual(id(dur1), id(dur2))
330 self.assertEqual(hash(dur1), hash(dur3))
331 self.assertNotEqual(id(dur1), id(dur3))
332 durSet = set()
333 durSet.add(dur1)
334 durSet.add(dur2)
335 durSet.add(dur3)
336 self.assertEqual(len(durSet), 2)
337
338 def test_neg(self):
339 '''
340 Test __neg__ for Duration objects.
341 '''
342 self.assertEqual(-Duration(0), Duration(0))
343 self.assertEqual(-Duration(years=1, months=1),
344 Duration(years=-1, months=-1))
345 self.assertEqual(-Duration(years=1, months=1), Duration(months=-13))
346 self.assertNotEqual(-Duration(years=1), timedelta(days=-365))
347 self.assertNotEqual(-timedelta(days=365), Duration(years=-1))
348 # FIXME: this test fails in python 3... it seems like python3
349 # treats a == b the same b == a
350 # self.assertNotEqual(-timedelta(days=10), -Duration(days=10))
351
352 def test_format(self):
353 '''
354 Test various other strftime combinations.
355 '''
356 self.assertEqual(duration_isoformat(Duration(0)), 'P0D')
357 self.assertEqual(duration_isoformat(-Duration(0)), 'P0D')
358 self.assertEqual(duration_isoformat(Duration(seconds=10)), 'PT10S')
359 self.assertEqual(duration_isoformat(Duration(years=-1, months=-1)),
360 '-P1Y1M')
361 self.assertEqual(duration_isoformat(-Duration(years=1, months=1)),
362 '-P1Y1M')
363 self.assertEqual(duration_isoformat(-Duration(years=-1, months=-1)),
364 'P1Y1M')
365 self.assertEqual(duration_isoformat(-Duration(years=-1, months=-1)),
366 'P1Y1M')
367 dur = Duration(years=3, months=7, days=23, hours=5, minutes=25,
368 milliseconds=330)
369 self.assertEqual(duration_isoformat(dur), 'P3Y7M23DT5H25M0.33S')
370 self.assertEqual(duration_isoformat(-dur), '-P3Y7M23DT5H25M0.33S')
371
372 def test_equal(self):
373 '''
374 Test __eq__ and __ne__ methods.
375 '''
376 self.assertEqual(Duration(years=1, months=1),
377 Duration(years=1, months=1))
378 self.assertEqual(Duration(years=1, months=1), Duration(months=13))
379 self.assertNotEqual(Duration(years=1, months=2),
380 Duration(years=1, months=1))
381 self.assertNotEqual(Duration(years=1, months=1), Duration(months=14))
382 self.assertNotEqual(Duration(years=1), timedelta(days=365))
383 self.assertFalse(Duration(years=1, months=1) !=
384 Duration(years=1, months=1))
385 self.assertFalse(Duration(years=1, months=1) != Duration(months=13))
386 self.assertTrue(Duration(years=1, months=2) !=
387 Duration(years=1, months=1))
388 self.assertTrue(Duration(years=1, months=1) != Duration(months=14))
389 self.assertTrue(Duration(years=1) != timedelta(days=365))
390 self.assertEqual(Duration(days=1), timedelta(days=1))
391 # FIXME: this test fails in python 3... it seems like python3
392 # treats a != b the same b != a
393 # self.assertNotEqual(timedelta(days=1), Duration(days=1))
394
395 def test_totimedelta(self):
396 '''
397 Test conversion form Duration to timedelta.
398 '''
399 dur = Duration(years=1, months=2, days=10)
400 self.assertEqual(dur.totimedelta(datetime(1998, 2, 25)),
401 timedelta(434))
402 # leap year has one day more in february
403 self.assertEqual(dur.totimedelta(datetime(2000, 2, 25)),
404 timedelta(435))
405 dur = Duration(months=2)
406 # march is longer than february, but april is shorter than
407 # march (cause only one day difference compared to 2)
408 self.assertEqual(dur.totimedelta(datetime(2000, 2, 25)), timedelta(60))
409 self.assertEqual(dur.totimedelta(datetime(2001, 2, 25)), timedelta(59))
410 self.assertEqual(dur.totimedelta(datetime(2001, 3, 25)), timedelta(61))
411
412
413 def create_parsetestcase(durationstring, expectation, format, altstr):
414 """
415 Create a TestCase class for a specific test.
416
417 This allows having a separate TestCase for each test tuple from the
418 PARSE_TEST_CASES list, so that a failed test won't stop other tests.
419 """
420
421 class TestParseDuration(unittest.TestCase):
422 '''
423 A test case template to parse an ISO duration string into a
424 timedelta or Duration object.
425 '''
426
427 def test_parse(self):
428 '''
429 Parse an ISO duration string and compare it to the expected value.
430 '''
431 result = parse_duration(durationstring)
432 self.assertEqual(result, expectation)
433
434 def test_format(self):
435 '''
436 Take duration/timedelta object and create ISO string from it.
437 This is the reverse test to test_parse.
438 '''
439 if altstr:
440 self.assertEqual(duration_isoformat(expectation, format),
441 altstr)
442 else:
443 # if durationstring == '-P2W':
444 # import pdb; pdb.set_trace()
445 self.assertEqual(duration_isoformat(expectation, format),
446 durationstring)
447
448 return unittest.TestLoader().loadTestsFromTestCase(TestParseDuration)
449
450
451 def create_mathtestcase(dur1, dur2, resadd, ressub, resge):
452 """
453 Create a TestCase class for a specific test.
454
455 This allows having a separate TestCase for each test tuple from the
456 MATH_TEST_CASES list, so that a failed test won't stop other tests.
457 """
458
459 dur1 = parse_duration(dur1)
460 dur2 = parse_duration(dur2)
461 resadd = parse_duration(resadd)
462 ressub = parse_duration(ressub)
463
464 class TestMathDuration(unittest.TestCase):
465 '''
466 A test case template test addition, subtraction and >
467 operators for Duration objects.
468 '''
469
470 def test_add(self):
471 '''
472 Test operator + (__add__, __radd__)
473 '''
474 self.assertEqual(dur1 + dur2, resadd)
475
476 def test_sub(self):
477 '''
478 Test operator - (__sub__, __rsub__)
479 '''
480 self.assertEqual(dur1 - dur2, ressub)
481
482 def test_ge(self):
483 '''
484 Test operator > and <
485 '''
486 def dogetest():
487 ''' Test greater than.'''
488 return dur1 > dur2
489
490 def doletest():
491 ''' Test less than.'''
492 return dur1 < dur2
493 if resge is None:
494 self.assertRaises(TypeError, dogetest)
495 self.assertRaises(TypeError, doletest)
496 else:
497 self.assertEqual(dogetest(), resge)
498 self.assertEqual(doletest(), not resge)
499
500 return unittest.TestLoader().loadTestsFromTestCase(TestMathDuration)
501
502
503 def create_datetestcase(start, tdelta, duration):
504 """
505 Create a TestCase class for a specific test.
506
507 This allows having a separate TestCase for each test tuple from the
508 DATE_TEST_CASES list, so that a failed test won't stop other tests.
509 """
510
511 class TestDateCalc(unittest.TestCase):
512 '''
513 A test case template test addition, subtraction
514 operators for Duration objects.
515 '''
516
517 def test_add(self):
518 '''
519 Test operator +.
520 '''
521 self.assertEqual(start + tdelta, start + duration)
522
523 def test_sub(self):
524 '''
525 Test operator -.
526 '''
527 self.assertEqual(start - tdelta, start - duration)
528
529 return unittest.TestLoader().loadTestsFromTestCase(TestDateCalc)
530
531
532 def create_datecalctestcase(start, duration, expectation):
533 """
534 Create a TestCase class for a specific test.
535
536 This allows having a separate TestCase for each test tuple from the
537 DATE_CALC_TEST_CASES list, so that a failed test won't stop other tests.
538 """
539
540 class TestDateCalc(unittest.TestCase):
541 '''
542 A test case template test addition operators for Duration objects.
543 '''
544
545 def test_calc(self):
546 '''
547 Test operator +.
548 '''
549 if expectation is None:
550 self.assertRaises(ValueError, operator.add, start, duration)
551 else:
552 self.assertEqual(start + duration, expectation)
553
554 return unittest.TestLoader().loadTestsFromTestCase(TestDateCalc)
555
556
557 def create_datemultestcase(operand1, operand2, expectation):
558 """
559 Create a TestCase class for a specific test.
560
561 This allows having a separate TestCase for each test tuple from the
562 DATE_CALC_TEST_CASES list, so that a failed test won't stop other tests.
563 """
564
565 class TestDateMul(unittest.TestCase):
566 '''
567 A test case template test addition operators for Duration objects.
568 '''
569
570 def test_mul(self):
571 '''
572 Test operator *.
573 '''
574 self.assertEqual(operand1 * operand2, expectation)
575
576 return unittest.TestLoader().loadTestsFromTestCase(TestDateMul)
577
578
579 def test_suite():
580 '''
581 Return a test suite containing all test defined above.
582 '''
583 suite = unittest.TestSuite()
584 for durationstring, (expectation, format,
585 altstr) in PARSE_TEST_CASES.items():
586 suite.addTest(create_parsetestcase(durationstring, expectation,
587 format, altstr))
588 for testdata in MATH_TEST_CASES:
589 suite.addTest(create_mathtestcase(*testdata))
590 for testdata in DATE_TEST_CASES:
591 suite.addTest(create_datetestcase(*testdata))
592 for testdata in DATE_CALC_TEST_CASES:
593 suite.addTest(create_datecalctestcase(*testdata))
594 for testdata in DATE_MUL_TEST_CASES:
595 suite.addTest(create_datemultestcase(*testdata))
596 suite.addTest(unittest.TestLoader().loadTestsFromTestCase(DurationTest))
597 return suite
598
599
600 # load_tests Protocol
601 def load_tests(loader, tests, pattern):
602 return test_suite()
603
604
605 if __name__ == '__main__':
606 unittest.main(defaultTest='test_suite')