From 57554442fe3e209c135e15dda4ea45123e579e58 Mon Sep 17 00:00:00 2001 From: Marc Tamlyn Date: Thu, 24 Jul 2014 13:57:24 +0100 Subject: Fixed #2443 -- Added DurationField. A field for storing periods of time - modeled in Python by timedelta. It is stored in the native interval data type on PostgreSQL and as a bigint of microseconds on other backends. Also includes significant changes to the internals of time related maths in expressions, including the removal of DateModifierNode. Thanks to Tim and Josh in particular for reviews. --- tests/utils_tests/test_dateparse.py | 44 +++++++++++++++++++++++++++++++++++-- 1 file changed, 42 insertions(+), 2 deletions(-) (limited to 'tests/utils_tests/test_dateparse.py') diff --git a/tests/utils_tests/test_dateparse.py b/tests/utils_tests/test_dateparse.py index cdf91c039e..a224e3b174 100644 --- a/tests/utils_tests/test_dateparse.py +++ b/tests/utils_tests/test_dateparse.py @@ -1,9 +1,9 @@ from __future__ import unicode_literals -from datetime import date, time, datetime +from datetime import date, time, datetime, timedelta import unittest -from django.utils.dateparse import parse_date, parse_time, parse_datetime +from django.utils.dateparse import parse_date, parse_time, parse_datetime, parse_duration from django.utils.timezone import get_fixed_timezone @@ -46,3 +46,43 @@ class DateParseTests(unittest.TestCase): # Invalid inputs self.assertEqual(parse_datetime('20120423091500'), None) self.assertRaises(ValueError, parse_datetime, '2012-04-56T09:15:90') + + +class DurationParseTests(unittest.TestCase): + def test_seconds(self): + self.assertEqual(parse_duration('30'), timedelta(seconds=30)) + + def test_minutes_seconds(self): + self.assertEqual(parse_duration('15:30'), timedelta(minutes=15, seconds=30)) + self.assertEqual(parse_duration('5:30'), timedelta(minutes=5, seconds=30)) + + def test_hours_minutes_seconds(self): + self.assertEqual(parse_duration('10:15:30'), timedelta(hours=10, minutes=15, seconds=30)) + self.assertEqual(parse_duration('1:15:30'), timedelta(hours=1, minutes=15, seconds=30)) + self.assertEqual(parse_duration('100:200:300'), timedelta(hours=100, minutes=200, seconds=300)) + + def test_days(self): + self.assertEqual(parse_duration('4 15:30'), timedelta(days=4, minutes=15, seconds=30)) + self.assertEqual(parse_duration('4 10:15:30'), timedelta(days=4, hours=10, minutes=15, seconds=30)) + + def test_fractions_of_seconds(self): + self.assertEqual(parse_duration('15:30.1'), timedelta(minutes=15, seconds=30, milliseconds=100)) + self.assertEqual(parse_duration('15:30.01'), timedelta(minutes=15, seconds=30, milliseconds=10)) + self.assertEqual(parse_duration('15:30.001'), timedelta(minutes=15, seconds=30, milliseconds=1)) + self.assertEqual(parse_duration('15:30.0001'), timedelta(minutes=15, seconds=30, microseconds=100)) + self.assertEqual(parse_duration('15:30.00001'), timedelta(minutes=15, seconds=30, microseconds=10)) + self.assertEqual(parse_duration('15:30.000001'), timedelta(minutes=15, seconds=30, microseconds=1)) + + def test_negative(self): + self.assertEqual(parse_duration('-4 15:30'), timedelta(days=-4, minutes=15, seconds=30)) + + def test_iso_8601(self): + self.assertEqual(parse_duration('P4Y'), None) + self.assertEqual(parse_duration('P4M'), None) + self.assertEqual(parse_duration('P4W'), None) + self.assertEqual(parse_duration('P4D'), timedelta(days=4)) + self.assertEqual(parse_duration('P0.5D'), timedelta(hours=12)) + self.assertEqual(parse_duration('PT5H'), timedelta(hours=5)) + self.assertEqual(parse_duration('PT5M'), timedelta(minutes=5)) + self.assertEqual(parse_duration('PT5S'), timedelta(seconds=5)) + self.assertEqual(parse_duration('PT0.000005S'), timedelta(microseconds=5)) -- cgit v1.3