2002-09-23 19:46:49 -03:00
|
|
|
"""PyUnit testing against strptime"""
|
2002-07-19 14:04:46 -03:00
|
|
|
|
|
|
|
import unittest
|
|
|
|
import time
|
|
|
|
import locale
|
|
|
|
import re
|
2003-08-11 04:24:05 -03:00
|
|
|
import sys
|
2002-08-22 16:57:50 -03:00
|
|
|
from test import test_support
|
2004-10-17 22:37:57 -03:00
|
|
|
from datetime import date as datetime_date
|
2002-07-19 14:04:46 -03:00
|
|
|
|
|
|
|
import _strptime
|
|
|
|
|
2003-07-24 03:27:17 -03:00
|
|
|
class getlang_Tests(unittest.TestCase):
|
|
|
|
"""Test _getlang"""
|
|
|
|
def test_basic(self):
|
|
|
|
self.failUnlessEqual(_strptime._getlang(), locale.getlocale(locale.LC_TIME))
|
|
|
|
|
2002-07-19 14:04:46 -03:00
|
|
|
class LocaleTime_Tests(unittest.TestCase):
|
2003-08-05 01:02:49 -03:00
|
|
|
"""Tests for _strptime.LocaleTime.
|
2003-11-16 12:17:49 -04:00
|
|
|
|
2003-08-05 01:02:49 -03:00
|
|
|
All values are lower-cased when stored in LocaleTime, so make sure to
|
|
|
|
compare values after running ``lower`` on them.
|
2003-11-16 12:17:49 -04:00
|
|
|
|
2003-08-05 01:02:49 -03:00
|
|
|
"""
|
2002-07-19 14:04:46 -03:00
|
|
|
|
|
|
|
def setUp(self):
|
|
|
|
"""Create time tuple based on current time."""
|
|
|
|
self.time_tuple = time.localtime()
|
|
|
|
self.LT_ins = _strptime.LocaleTime()
|
|
|
|
|
2002-11-27 04:30:25 -04:00
|
|
|
def compare_against_time(self, testing, directive, tuple_position,
|
|
|
|
error_msg):
|
2002-08-08 17:19:19 -03:00
|
|
|
"""Helper method that tests testing against directive based on the
|
2002-07-19 14:04:46 -03:00
|
|
|
tuple_position of time_tuple. Uses error_msg as error message.
|
|
|
|
|
|
|
|
"""
|
2003-08-05 01:02:49 -03:00
|
|
|
strftime_output = time.strftime(directive, self.time_tuple).lower()
|
2002-07-19 14:04:46 -03:00
|
|
|
comparison = testing[self.time_tuple[tuple_position]]
|
2002-11-27 04:30:25 -04:00
|
|
|
self.failUnless(strftime_output in testing, "%s: not found in tuple" %
|
|
|
|
error_msg)
|
|
|
|
self.failUnless(comparison == strftime_output,
|
|
|
|
"%s: position within tuple incorrect; %s != %s" %
|
|
|
|
(error_msg, comparison, strftime_output))
|
2002-08-08 17:19:19 -03:00
|
|
|
|
2002-07-19 14:04:46 -03:00
|
|
|
def test_weekday(self):
|
2002-08-22 16:57:50 -03:00
|
|
|
# Make sure that full and abbreviated weekday names are correct in
|
|
|
|
# both string and position with tuple
|
2002-11-27 04:30:25 -04:00
|
|
|
self.compare_against_time(self.LT_ins.f_weekday, '%A', 6,
|
|
|
|
"Testing of full weekday name failed")
|
|
|
|
self.compare_against_time(self.LT_ins.a_weekday, '%a', 6,
|
|
|
|
"Testing of abbreviated weekday name failed")
|
2002-07-19 14:04:46 -03:00
|
|
|
|
|
|
|
def test_month(self):
|
2002-08-22 16:57:50 -03:00
|
|
|
# Test full and abbreviated month names; both string and position
|
|
|
|
# within the tuple
|
2002-11-27 04:30:25 -04:00
|
|
|
self.compare_against_time(self.LT_ins.f_month, '%B', 1,
|
|
|
|
"Testing against full month name failed")
|
|
|
|
self.compare_against_time(self.LT_ins.a_month, '%b', 1,
|
|
|
|
"Testing against abbreviated month name failed")
|
2002-07-19 14:04:46 -03:00
|
|
|
|
|
|
|
def test_am_pm(self):
|
2002-08-22 16:57:50 -03:00
|
|
|
# Make sure AM/PM representation done properly
|
2003-08-05 01:02:49 -03:00
|
|
|
strftime_output = time.strftime("%p", self.time_tuple).lower()
|
2002-11-27 04:30:25 -04:00
|
|
|
self.failUnless(strftime_output in self.LT_ins.am_pm,
|
|
|
|
"AM/PM representation not in tuple")
|
2002-07-19 14:04:46 -03:00
|
|
|
if self.time_tuple[3] < 12: position = 0
|
|
|
|
else: position = 1
|
2002-11-27 04:30:25 -04:00
|
|
|
self.failUnless(strftime_output == self.LT_ins.am_pm[position],
|
|
|
|
"AM/PM representation in the wrong position within the tuple")
|
2002-07-19 14:04:46 -03:00
|
|
|
|
|
|
|
def test_timezone(self):
|
2002-08-22 16:57:50 -03:00
|
|
|
# Make sure timezone is correct
|
2003-08-05 01:02:49 -03:00
|
|
|
timezone = time.strftime("%Z", self.time_tuple).lower()
|
2003-05-11 03:23:36 -03:00
|
|
|
if timezone:
|
2003-08-05 01:02:49 -03:00
|
|
|
self.failUnless(timezone in self.LT_ins.timezone[0] or \
|
|
|
|
timezone in self.LT_ins.timezone[1],
|
2003-05-11 03:23:36 -03:00
|
|
|
"timezone %s not found in %s" %
|
|
|
|
(timezone, self.LT_ins.timezone))
|
2002-07-19 14:04:46 -03:00
|
|
|
|
|
|
|
def test_date_time(self):
|
2002-08-22 16:57:50 -03:00
|
|
|
# Check that LC_date_time, LC_date, and LC_time are correct
|
2002-09-23 19:46:49 -03:00
|
|
|
# the magic date is used so as to not have issues with %c when day of
|
|
|
|
# the month is a single digit and has a leading space. This is not an
|
|
|
|
# issue since strptime still parses it correctly. The problem is
|
|
|
|
# testing these directives for correctness by comparing strftime
|
|
|
|
# output.
|
|
|
|
magic_date = (1999, 3, 17, 22, 44, 55, 2, 76, 0)
|
|
|
|
strftime_output = time.strftime("%c", magic_date)
|
2002-11-27 04:30:25 -04:00
|
|
|
self.failUnless(strftime_output == time.strftime(self.LT_ins.LC_date_time,
|
|
|
|
magic_date),
|
|
|
|
"LC_date_time incorrect")
|
2002-09-23 19:46:49 -03:00
|
|
|
strftime_output = time.strftime("%x", magic_date)
|
2002-11-27 04:30:25 -04:00
|
|
|
self.failUnless(strftime_output == time.strftime(self.LT_ins.LC_date,
|
|
|
|
magic_date),
|
|
|
|
"LC_date incorrect")
|
2002-09-23 19:46:49 -03:00
|
|
|
strftime_output = time.strftime("%X", magic_date)
|
2002-11-27 04:30:25 -04:00
|
|
|
self.failUnless(strftime_output == time.strftime(self.LT_ins.LC_time,
|
|
|
|
magic_date),
|
|
|
|
"LC_time incorrect")
|
2003-08-05 01:02:49 -03:00
|
|
|
LT = _strptime.LocaleTime()
|
|
|
|
LT.am_pm = ('', '')
|
2002-09-23 19:46:49 -03:00
|
|
|
self.failUnless(LT.LC_time, "LocaleTime's LC directives cannot handle "
|
|
|
|
"empty strings")
|
2002-07-19 14:04:46 -03:00
|
|
|
|
|
|
|
def test_lang(self):
|
2003-07-24 03:27:17 -03:00
|
|
|
# Make sure lang is set to what _getlang() returns
|
|
|
|
# Assuming locale has not changed between now and when self.LT_ins was created
|
|
|
|
self.failUnlessEqual(self.LT_ins.lang, _strptime._getlang())
|
2002-07-19 14:04:46 -03:00
|
|
|
|
2003-01-17 23:53:49 -04:00
|
|
|
|
2002-07-19 14:04:46 -03:00
|
|
|
class TimeRETests(unittest.TestCase):
|
|
|
|
"""Tests for TimeRE."""
|
|
|
|
|
|
|
|
def setUp(self):
|
|
|
|
"""Construct generic TimeRE object."""
|
|
|
|
self.time_re = _strptime.TimeRE()
|
|
|
|
self.locale_time = _strptime.LocaleTime()
|
|
|
|
|
|
|
|
def test_pattern(self):
|
2002-08-22 16:57:50 -03:00
|
|
|
# Test TimeRE.pattern
|
2002-07-19 14:04:46 -03:00
|
|
|
pattern_string = self.time_re.pattern(r"%a %A %d")
|
2002-11-27 04:30:25 -04:00
|
|
|
self.failUnless(pattern_string.find(self.locale_time.a_weekday[2]) != -1,
|
|
|
|
"did not find abbreviated weekday in pattern string '%s'" %
|
|
|
|
pattern_string)
|
|
|
|
self.failUnless(pattern_string.find(self.locale_time.f_weekday[4]) != -1,
|
|
|
|
"did not find full weekday in pattern string '%s'" %
|
|
|
|
pattern_string)
|
|
|
|
self.failUnless(pattern_string.find(self.time_re['d']) != -1,
|
|
|
|
"did not find 'd' directive pattern string '%s'" %
|
|
|
|
pattern_string)
|
2002-07-19 14:04:46 -03:00
|
|
|
|
2003-04-19 01:00:56 -03:00
|
|
|
def test_pattern_escaping(self):
|
|
|
|
# Make sure any characters in the format string that might be taken as
|
|
|
|
# regex syntax is escaped.
|
|
|
|
pattern_string = self.time_re.pattern("\d+")
|
|
|
|
self.failUnless(r"\\d\+" in pattern_string,
|
|
|
|
"%s does not have re characters escaped properly" %
|
|
|
|
pattern_string)
|
|
|
|
|
2002-07-19 14:04:46 -03:00
|
|
|
def test_compile(self):
|
2002-08-22 16:57:50 -03:00
|
|
|
# Check that compiled regex is correct
|
2002-07-19 14:04:46 -03:00
|
|
|
found = self.time_re.compile(r"%A").match(self.locale_time.f_weekday[6])
|
2002-11-27 04:30:25 -04:00
|
|
|
self.failUnless(found and found.group('A') == self.locale_time.f_weekday[6],
|
|
|
|
"re object for '%A' failed")
|
2002-07-19 14:04:46 -03:00
|
|
|
compiled = self.time_re.compile(r"%a %b")
|
2002-11-27 04:30:25 -04:00
|
|
|
found = compiled.match("%s %s" % (self.locale_time.a_weekday[4],
|
|
|
|
self.locale_time.a_month[4]))
|
2002-08-08 17:19:19 -03:00
|
|
|
self.failUnless(found,
|
2002-11-27 04:30:25 -04:00
|
|
|
"Match failed with '%s' regex and '%s' string" %
|
|
|
|
(compiled.pattern, "%s %s" % (self.locale_time.a_weekday[4],
|
|
|
|
self.locale_time.a_month[4])))
|
|
|
|
self.failUnless(found.group('a') == self.locale_time.a_weekday[4] and
|
|
|
|
found.group('b') == self.locale_time.a_month[4],
|
|
|
|
"re object couldn't find the abbreviated weekday month in "
|
|
|
|
"'%s' using '%s'; group 'a' = '%s', group 'b' = %s'" %
|
|
|
|
(found.string, found.re.pattern, found.group('a'),
|
|
|
|
found.group('b')))
|
|
|
|
for directive in ('a','A','b','B','c','d','H','I','j','m','M','p','S',
|
|
|
|
'U','w','W','x','X','y','Y','Z','%'):
|
2003-01-17 23:53:49 -04:00
|
|
|
compiled = self.time_re.compile("%" + directive)
|
|
|
|
found = compiled.match(time.strftime("%" + directive))
|
2002-11-27 04:30:25 -04:00
|
|
|
self.failUnless(found, "Matching failed on '%s' using '%s' regex" %
|
2003-01-17 23:53:49 -04:00
|
|
|
(time.strftime("%" + directive),
|
2002-11-27 04:30:25 -04:00
|
|
|
compiled.pattern))
|
2002-07-19 14:04:46 -03:00
|
|
|
|
2003-01-17 23:53:49 -04:00
|
|
|
def test_blankpattern(self):
|
|
|
|
# Make sure when tuple or something has no values no regex is generated.
|
|
|
|
# Fixes bug #661354
|
2003-08-05 01:02:49 -03:00
|
|
|
test_locale = _strptime.LocaleTime()
|
2003-11-16 12:17:49 -04:00
|
|
|
test_locale.timezone = (frozenset(), frozenset())
|
2003-01-17 23:53:49 -04:00
|
|
|
self.failUnless(_strptime.TimeRE(test_locale).pattern("%Z") == '',
|
|
|
|
"with timezone == ('',''), TimeRE().pattern('%Z') != ''")
|
|
|
|
|
2003-04-19 01:00:56 -03:00
|
|
|
def test_matching_with_escapes(self):
|
|
|
|
# Make sure a format that requires escaping of characters works
|
|
|
|
compiled_re = self.time_re.compile("\w+ %m")
|
|
|
|
found = compiled_re.match("\w+ 10")
|
|
|
|
self.failUnless(found, "Escaping failed of format '\w+ 10'")
|
|
|
|
|
2004-10-05 23:11:37 -03:00
|
|
|
def test_locale_data_w_regex_metacharacters(self):
|
|
|
|
# Check that if locale data contains regex metacharacters they are
|
|
|
|
# escaped properly.
|
|
|
|
# Discovered by bug #1039270 .
|
|
|
|
locale_time = _strptime.LocaleTime()
|
|
|
|
locale_time.timezone = (frozenset(("utc", "gmt",
|
|
|
|
"Tokyo (standard time)")),
|
|
|
|
frozenset("Tokyo (daylight time)"))
|
|
|
|
time_re = _strptime.TimeRE(locale_time)
|
|
|
|
self.failUnless(time_re.compile("%Z").match("Tokyo (standard time)"),
|
|
|
|
"locale data that contains regex metacharacters is not"
|
|
|
|
" properly escaped")
|
|
|
|
|
2002-07-19 14:04:46 -03:00
|
|
|
class StrptimeTests(unittest.TestCase):
|
|
|
|
"""Tests for _strptime.strptime."""
|
|
|
|
|
|
|
|
def setUp(self):
|
|
|
|
"""Create testing time tuple."""
|
|
|
|
self.time_tuple = time.gmtime()
|
|
|
|
|
2005-11-02 19:04:26 -04:00
|
|
|
def test_ValueError(self):
|
|
|
|
# Make sure ValueError is raised when match fails or format is bad
|
2002-11-27 04:30:25 -04:00
|
|
|
self.assertRaises(ValueError, _strptime.strptime, data_string="%d",
|
|
|
|
format="%A")
|
2005-11-02 19:04:26 -04:00
|
|
|
for bad_format in ("%", "% ", "%e"):
|
|
|
|
try:
|
|
|
|
_strptime.strptime("2005", bad_format)
|
|
|
|
except ValueError:
|
|
|
|
continue
|
2007-01-10 12:19:56 -04:00
|
|
|
except Exception as err:
|
2005-11-02 19:04:26 -04:00
|
|
|
self.fail("'%s' raised %s, not ValueError" %
|
|
|
|
(bad_format, err.__class__.__name__))
|
|
|
|
else:
|
|
|
|
self.fail("'%s' did not raise ValueError" % bad_format)
|
2002-07-19 14:04:46 -03:00
|
|
|
|
2003-04-28 18:30:13 -03:00
|
|
|
def test_unconverteddata(self):
|
|
|
|
# Check ValueError is raised when there is unconverted data
|
|
|
|
self.assertRaises(ValueError, _strptime.strptime, "10 12", "%m")
|
|
|
|
|
2002-07-19 14:04:46 -03:00
|
|
|
def helper(self, directive, position):
|
|
|
|
"""Helper fxn in testing."""
|
2003-01-17 23:53:49 -04:00
|
|
|
strf_output = time.strftime("%" + directive, self.time_tuple)
|
|
|
|
strp_output = _strptime.strptime(strf_output, "%" + directive)
|
2002-11-27 04:30:25 -04:00
|
|
|
self.failUnless(strp_output[position] == self.time_tuple[position],
|
|
|
|
"testing of '%s' directive failed; '%s' -> %s != %s" %
|
|
|
|
(directive, strf_output, strp_output[position],
|
|
|
|
self.time_tuple[position]))
|
2002-07-19 14:04:46 -03:00
|
|
|
|
|
|
|
def test_year(self):
|
2002-08-22 16:57:50 -03:00
|
|
|
# Test that the year is handled properly
|
2002-07-19 14:04:46 -03:00
|
|
|
for directive in ('y', 'Y'):
|
|
|
|
self.helper(directive, 0)
|
2003-01-17 23:53:49 -04:00
|
|
|
# Must also make sure %y values are correct for bounds set by Open Group
|
|
|
|
for century, bounds in ((1900, ('69', '99')), (2000, ('00', '68'))):
|
|
|
|
for bound in bounds:
|
|
|
|
strp_output = _strptime.strptime(bound, '%y')
|
|
|
|
expected_result = century + int(bound)
|
|
|
|
self.failUnless(strp_output[0] == expected_result,
|
|
|
|
"'y' test failed; passed in '%s' "
|
|
|
|
"and returned '%s'" % (bound, strp_output[0]))
|
2002-07-19 14:04:46 -03:00
|
|
|
|
|
|
|
def test_month(self):
|
2002-08-22 16:57:50 -03:00
|
|
|
# Test for month directives
|
2002-07-19 14:04:46 -03:00
|
|
|
for directive in ('B', 'b', 'm'):
|
|
|
|
self.helper(directive, 1)
|
|
|
|
|
|
|
|
def test_day(self):
|
2002-08-22 16:57:50 -03:00
|
|
|
# Test for day directives
|
2002-07-19 14:04:46 -03:00
|
|
|
self.helper('d', 2)
|
|
|
|
|
|
|
|
def test_hour(self):
|
2002-08-22 16:57:50 -03:00
|
|
|
# Test hour directives
|
2002-07-19 14:04:46 -03:00
|
|
|
self.helper('H', 3)
|
|
|
|
strf_output = time.strftime("%I %p", self.time_tuple)
|
|
|
|
strp_output = _strptime.strptime(strf_output, "%I %p")
|
2002-11-27 04:30:25 -04:00
|
|
|
self.failUnless(strp_output[3] == self.time_tuple[3],
|
|
|
|
"testing of '%%I %%p' directive failed; '%s' -> %s != %s" %
|
|
|
|
(strf_output, strp_output[3], self.time_tuple[3]))
|
2002-07-19 14:04:46 -03:00
|
|
|
|
|
|
|
def test_minute(self):
|
2002-08-22 16:57:50 -03:00
|
|
|
# Test minute directives
|
2002-07-19 14:04:46 -03:00
|
|
|
self.helper('M', 4)
|
|
|
|
|
|
|
|
def test_second(self):
|
2002-08-22 16:57:50 -03:00
|
|
|
# Test second directives
|
2002-07-19 14:04:46 -03:00
|
|
|
self.helper('S', 5)
|
|
|
|
|
|
|
|
def test_weekday(self):
|
2002-08-22 16:57:50 -03:00
|
|
|
# Test weekday directives
|
2002-07-19 14:04:46 -03:00
|
|
|
for directive in ('A', 'a', 'w'):
|
|
|
|
self.helper(directive,6)
|
|
|
|
|
|
|
|
def test_julian(self):
|
2002-08-22 16:57:50 -03:00
|
|
|
# Test julian directives
|
2002-07-19 14:04:46 -03:00
|
|
|
self.helper('j', 7)
|
|
|
|
|
|
|
|
def test_timezone(self):
|
2002-08-22 16:57:50 -03:00
|
|
|
# Test timezone directives.
|
|
|
|
# When gmtime() is used with %Z, entire result of strftime() is empty.
|
2002-11-27 04:30:25 -04:00
|
|
|
# Check for equal timezone names deals with bad locale info when this
|
2003-01-17 23:53:49 -04:00
|
|
|
# occurs; first found in FreeBSD 4.4.
|
2003-05-11 03:23:36 -03:00
|
|
|
strp_output = _strptime.strptime("UTC", "%Z")
|
|
|
|
self.failUnlessEqual(strp_output.tm_isdst, 0)
|
|
|
|
strp_output = _strptime.strptime("GMT", "%Z")
|
|
|
|
self.failUnlessEqual(strp_output.tm_isdst, 0)
|
2003-08-11 04:24:05 -03:00
|
|
|
if sys.platform == "mac":
|
|
|
|
# Timezones don't really work on MacOS9
|
|
|
|
return
|
2002-07-19 14:04:46 -03:00
|
|
|
time_tuple = time.localtime()
|
|
|
|
strf_output = time.strftime("%Z") #UTC does not have a timezone
|
|
|
|
strp_output = _strptime.strptime(strf_output, "%Z")
|
2002-11-27 04:30:25 -04:00
|
|
|
locale_time = _strptime.LocaleTime()
|
2003-07-03 16:59:57 -03:00
|
|
|
if time.tzname[0] != time.tzname[1] or not time.daylight:
|
2002-11-27 04:30:25 -04:00
|
|
|
self.failUnless(strp_output[8] == time_tuple[8],
|
|
|
|
"timezone check failed; '%s' -> %s != %s" %
|
|
|
|
(strf_output, strp_output[8], time_tuple[8]))
|
|
|
|
else:
|
|
|
|
self.failUnless(strp_output[8] == -1,
|
2003-07-03 16:59:57 -03:00
|
|
|
"LocaleTime().timezone has duplicate values and "
|
|
|
|
"time.daylight but timezone value not set to -1")
|
2002-07-19 14:04:46 -03:00
|
|
|
|
2003-08-11 04:24:05 -03:00
|
|
|
def test_bad_timezone(self):
|
|
|
|
# Explicitly test possibility of bad timezone;
|
|
|
|
# when time.tzname[0] == time.tzname[1] and time.daylight
|
|
|
|
if sys.platform == "mac":
|
|
|
|
return #MacOS9 has severely broken timezone support.
|
2004-07-12 16:34:02 -03:00
|
|
|
tz_name = time.tzname[0]
|
2004-07-13 21:43:51 -03:00
|
|
|
if tz_name.upper() in ("UTC", "GMT"):
|
2004-07-12 16:34:02 -03:00
|
|
|
return
|
2003-08-11 04:24:05 -03:00
|
|
|
try:
|
|
|
|
original_tzname = time.tzname
|
|
|
|
original_daylight = time.daylight
|
2003-08-11 16:06:13 -03:00
|
|
|
time.tzname = (tz_name, tz_name)
|
2003-08-11 04:24:05 -03:00
|
|
|
time.daylight = 1
|
2003-08-11 16:06:13 -03:00
|
|
|
tz_value = _strptime.strptime(tz_name, "%Z")[8]
|
2004-07-12 16:34:02 -03:00
|
|
|
self.failUnlessEqual(tz_value, -1,
|
|
|
|
"%s lead to a timezone value of %s instead of -1 when "
|
|
|
|
"time.daylight set to %s and passing in %s" %
|
|
|
|
(time.tzname, tz_value, time.daylight, tz_name))
|
2003-08-11 04:24:05 -03:00
|
|
|
finally:
|
|
|
|
time.tzname = original_tzname
|
|
|
|
time.daylight = original_daylight
|
|
|
|
|
2002-07-19 14:04:46 -03:00
|
|
|
def test_date_time(self):
|
2002-08-22 16:57:50 -03:00
|
|
|
# Test %c directive
|
2002-07-19 14:04:46 -03:00
|
|
|
for position in range(6):
|
|
|
|
self.helper('c', position)
|
|
|
|
|
|
|
|
def test_date(self):
|
2002-08-22 16:57:50 -03:00
|
|
|
# Test %x directive
|
2002-07-19 14:04:46 -03:00
|
|
|
for position in range(0,3):
|
|
|
|
self.helper('x', position)
|
|
|
|
|
|
|
|
def test_time(self):
|
2002-08-22 16:57:50 -03:00
|
|
|
# Test %X directive
|
2002-07-19 14:04:46 -03:00
|
|
|
for position in range(3,6):
|
|
|
|
self.helper('X', position)
|
|
|
|
|
|
|
|
def test_percent(self):
|
2002-08-22 16:57:50 -03:00
|
|
|
# Make sure % signs are handled properly
|
2002-07-19 14:04:46 -03:00
|
|
|
strf_output = time.strftime("%m %% %Y", self.time_tuple)
|
|
|
|
strp_output = _strptime.strptime(strf_output, "%m %% %Y")
|
2002-11-27 04:30:25 -04:00
|
|
|
self.failUnless(strp_output[0] == self.time_tuple[0] and
|
|
|
|
strp_output[1] == self.time_tuple[1],
|
|
|
|
"handling of percent sign failed")
|
2002-07-19 14:04:46 -03:00
|
|
|
|
2002-09-23 19:46:49 -03:00
|
|
|
def test_caseinsensitive(self):
|
|
|
|
# Should handle names case-insensitively.
|
|
|
|
strf_output = time.strftime("%B", self.time_tuple)
|
|
|
|
self.failUnless(_strptime.strptime(strf_output.upper(), "%B"),
|
|
|
|
"strptime does not handle ALL-CAPS names properly")
|
|
|
|
self.failUnless(_strptime.strptime(strf_output.lower(), "%B"),
|
|
|
|
"strptime does not handle lowercase names properly")
|
|
|
|
self.failUnless(_strptime.strptime(strf_output.capitalize(), "%B"),
|
|
|
|
"strptime does not handle capword names properly")
|
|
|
|
|
2003-01-17 23:53:49 -04:00
|
|
|
def test_defaults(self):
|
|
|
|
# Default return value should be (1900, 1, 1, 0, 0, 0, 0, 1, 0)
|
|
|
|
defaults = (1900, 1, 1, 0, 0, 0, 0, 1, -1)
|
|
|
|
strp_output = _strptime.strptime('1', '%m')
|
|
|
|
self.failUnless(strp_output == defaults,
|
|
|
|
"Default values for strptime() are incorrect;"
|
|
|
|
" %s != %s" % (strp_output, defaults))
|
|
|
|
|
2003-08-28 23:28:54 -03:00
|
|
|
def test_escaping(self):
|
|
|
|
# Make sure all characters that have regex significance are escaped.
|
|
|
|
# Parentheses are in a purposeful order; will cause an error of
|
|
|
|
# unbalanced parentheses when the regex is compiled if they are not
|
|
|
|
# escaped.
|
|
|
|
# Test instigated by bug #796149 .
|
|
|
|
need_escaping = ".^$*+?{}\[]|)("
|
|
|
|
self.failUnless(_strptime.strptime(need_escaping, need_escaping))
|
|
|
|
|
2002-08-29 12:25:04 -03:00
|
|
|
class Strptime12AMPMTests(unittest.TestCase):
|
|
|
|
"""Test a _strptime regression in '%I %p' at 12 noon (12 PM)"""
|
|
|
|
|
|
|
|
def test_twelve_noon_midnight(self):
|
|
|
|
eq = self.assertEqual
|
|
|
|
eq(time.strptime('12 PM', '%I %p')[3], 12)
|
|
|
|
eq(time.strptime('12 AM', '%I %p')[3], 0)
|
|
|
|
eq(_strptime.strptime('12 PM', '%I %p')[3], 12)
|
|
|
|
eq(_strptime.strptime('12 AM', '%I %p')[3], 0)
|
|
|
|
|
|
|
|
|
2002-12-26 12:19:52 -04:00
|
|
|
class JulianTests(unittest.TestCase):
|
|
|
|
"""Test a _strptime regression that all julian (1-366) are accepted"""
|
|
|
|
|
|
|
|
def test_all_julian_days(self):
|
|
|
|
eq = self.assertEqual
|
|
|
|
for i in range(1, 367):
|
|
|
|
# use 2004, since it is a leap year, we have 366 days
|
|
|
|
eq(_strptime.strptime('%d 2004' % i, '%j %Y')[7], i)
|
|
|
|
|
2003-03-09 03:44:42 -04:00
|
|
|
class CalculationTests(unittest.TestCase):
|
|
|
|
"""Test that strptime() fills in missing info correctly"""
|
|
|
|
|
|
|
|
def setUp(self):
|
|
|
|
self.time_tuple = time.gmtime()
|
|
|
|
|
|
|
|
def test_julian_calculation(self):
|
|
|
|
# Make sure that when Julian is missing that it is calculated
|
|
|
|
format_string = "%Y %m %d %H %M %S %w %Z"
|
|
|
|
result = _strptime.strptime(time.strftime(format_string, self.time_tuple),
|
|
|
|
format_string)
|
|
|
|
self.failUnless(result.tm_yday == self.time_tuple.tm_yday,
|
|
|
|
"Calculation of tm_yday failed; %s != %s" %
|
|
|
|
(result.tm_yday, self.time_tuple.tm_yday))
|
|
|
|
|
|
|
|
def test_gregorian_calculation(self):
|
|
|
|
# Test that Gregorian date can be calculated from Julian day
|
|
|
|
format_string = "%Y %H %M %S %w %j %Z"
|
|
|
|
result = _strptime.strptime(time.strftime(format_string, self.time_tuple),
|
|
|
|
format_string)
|
|
|
|
self.failUnless(result.tm_year == self.time_tuple.tm_year and
|
|
|
|
result.tm_mon == self.time_tuple.tm_mon and
|
|
|
|
result.tm_mday == self.time_tuple.tm_mday,
|
|
|
|
"Calculation of Gregorian date failed;"
|
|
|
|
"%s-%s-%s != %s-%s-%s" %
|
|
|
|
(result.tm_year, result.tm_mon, result.tm_mday,
|
|
|
|
self.time_tuple.tm_year, self.time_tuple.tm_mon,
|
|
|
|
self.time_tuple.tm_mday))
|
|
|
|
|
|
|
|
def test_day_of_week_calculation(self):
|
|
|
|
# Test that the day of the week is calculated as needed
|
|
|
|
format_string = "%Y %m %d %H %S %j %Z"
|
|
|
|
result = _strptime.strptime(time.strftime(format_string, self.time_tuple),
|
|
|
|
format_string)
|
|
|
|
self.failUnless(result.tm_wday == self.time_tuple.tm_wday,
|
|
|
|
"Calculation of day of the week failed;"
|
|
|
|
"%s != %s" % (result.tm_wday, self.time_tuple.tm_wday))
|
2003-08-05 01:02:49 -03:00
|
|
|
|
2004-10-17 22:37:57 -03:00
|
|
|
def test_week_of_year_and_day_of_week_calculation(self):
|
|
|
|
# Should be able to infer date if given year, week of year (%U or %W)
|
|
|
|
# and day of the week
|
|
|
|
def test_helper(ymd_tuple, test_reason):
|
|
|
|
for directive in ('W', 'U'):
|
|
|
|
format_string = "%%Y %%%s %%w" % directive
|
2004-10-28 01:49:21 -03:00
|
|
|
dt_date = datetime_date(*ymd_tuple)
|
|
|
|
strp_input = dt_date.strftime(format_string)
|
2004-10-17 22:37:57 -03:00
|
|
|
strp_output = _strptime.strptime(strp_input, format_string)
|
|
|
|
self.failUnless(strp_output[:3] == ymd_tuple,
|
2004-10-28 01:49:21 -03:00
|
|
|
"%s(%s) test failed w/ '%s': %s != %s (%s != %s)" %
|
2004-10-17 22:37:57 -03:00
|
|
|
(test_reason, directive, strp_input,
|
2004-10-28 01:49:21 -03:00
|
|
|
strp_output[:3], ymd_tuple,
|
|
|
|
strp_output[7], dt_date.timetuple()[7]))
|
2004-10-17 22:37:57 -03:00
|
|
|
test_helper((1901, 1, 3), "week 0")
|
|
|
|
test_helper((1901, 1, 8), "common case")
|
|
|
|
test_helper((1901, 1, 13), "day on Sunday")
|
|
|
|
test_helper((1901, 1, 14), "day on Monday")
|
|
|
|
test_helper((1905, 1, 1), "Jan 1 on Sunday")
|
|
|
|
test_helper((1906, 1, 1), "Jan 1 on Monday")
|
2004-10-28 01:49:21 -03:00
|
|
|
test_helper((1906, 1, 7), "first Sunday in a year starting on Monday")
|
2004-10-17 22:37:57 -03:00
|
|
|
test_helper((1905, 12, 31), "Dec 31 on Sunday")
|
|
|
|
test_helper((1906, 12, 31), "Dec 31 on Monday")
|
2004-10-28 01:49:21 -03:00
|
|
|
test_helper((2008, 12, 29), "Monday in the last week of the year")
|
|
|
|
test_helper((2008, 12, 22), "Monday in the second-to-last week of the "
|
|
|
|
"year")
|
|
|
|
test_helper((1978, 10, 23), "randomly chosen date")
|
|
|
|
test_helper((2004, 12, 18), "randomly chosen date")
|
|
|
|
test_helper((1978, 10, 23), "year starting and ending on Monday while "
|
|
|
|
"date not on Sunday or Monday")
|
|
|
|
test_helper((1917, 12, 17), "year starting and ending on Monday with "
|
|
|
|
"a Monday not at the beginning or end "
|
|
|
|
"of the year")
|
|
|
|
test_helper((1917, 12, 31), "Dec 31 on Monday with year starting and "
|
|
|
|
"ending on Monday")
|
Merged revisions 53538-53622 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r53545 | andrew.kuchling | 2007-01-24 21:06:41 +0100 (Wed, 24 Jan 2007) | 1 line
Strengthen warning about using lock()
........
r53556 | thomas.heller | 2007-01-25 19:34:14 +0100 (Thu, 25 Jan 2007) | 3 lines
Fix for #1643874: When calling SysAllocString, create a PyCObject
which will eventually call SysFreeString to free the BSTR resource.
........
r53563 | andrew.kuchling | 2007-01-25 21:02:13 +0100 (Thu, 25 Jan 2007) | 1 line
Add item
........
r53564 | brett.cannon | 2007-01-25 21:22:02 +0100 (Thu, 25 Jan 2007) | 8 lines
Fix time.strptime's %U support. Basically rewrote the algorithm to be more
generic so that one only has to shift certain values based on whether the week
was specified to start on Monday or Sunday. Cut out a lot of edge case code
compared to the previous version. Also broke algorithm out into its own
function (that is private to the module).
Fixes bug #1643943 (thanks Biran Nahas for the report).
........
r53570 | brett.cannon | 2007-01-26 00:30:39 +0100 (Fri, 26 Jan 2007) | 4 lines
Remove specific mention of my name and email address from modules. Not really
needed and all bug reports should go to the bug tracker, not directly to me.
Plus I am not the only person to have edited these files at this point.
........
r53573 | fred.drake | 2007-01-26 17:28:44 +0100 (Fri, 26 Jan 2007) | 1 line
fix typo (extraneous ")")
........
r53575 | georg.brandl | 2007-01-27 18:43:02 +0100 (Sat, 27 Jan 2007) | 4 lines
Patch #1638243: the compiler package is now able to correctly compile
a with statement; previously, executing code containing a with statement
compiled by the compiler package crashed the interpreter.
........
r53578 | georg.brandl | 2007-01-27 18:59:42 +0100 (Sat, 27 Jan 2007) | 3 lines
Patch #1634778: add missing encoding aliases for iso8859_15 and
iso8859_16.
........
r53579 | georg.brandl | 2007-01-27 20:38:50 +0100 (Sat, 27 Jan 2007) | 2 lines
Bug #1645944: os.access now returns bool but docstring is not updated
........
r53590 | brett.cannon | 2007-01-28 21:58:00 +0100 (Sun, 28 Jan 2007) | 2 lines
Use the thread lock's context manager instead of a try/finally statement.
........
r53591 | brett.cannon | 2007-01-29 05:41:44 +0100 (Mon, 29 Jan 2007) | 2 lines
Add a test for slicing an exception.
........
r53594 | andrew.kuchling | 2007-01-29 21:21:43 +0100 (Mon, 29 Jan 2007) | 1 line
Minor edits to the curses HOWTO
........
r53596 | andrew.kuchling | 2007-01-29 21:55:40 +0100 (Mon, 29 Jan 2007) | 1 line
Various minor edits
........
r53597 | andrew.kuchling | 2007-01-29 22:28:48 +0100 (Mon, 29 Jan 2007) | 1 line
More edits
........
r53601 | tim.peters | 2007-01-30 04:03:46 +0100 (Tue, 30 Jan 2007) | 2 lines
Whitespace normalization.
........
r53603 | georg.brandl | 2007-01-30 21:21:30 +0100 (Tue, 30 Jan 2007) | 2 lines
Bug #1648191: typo in docs.
........
r53605 | brett.cannon | 2007-01-30 22:34:36 +0100 (Tue, 30 Jan 2007) | 8 lines
No more raising of string exceptions!
The next step of PEP 352 (for 2.6) causes raising a string exception to trigger
a TypeError. Trying to catch a string exception raises a DeprecationWarning.
References to string exceptions has been removed from the docs since they are
now just an error.
........
r53618 | raymond.hettinger | 2007-02-01 22:02:59 +0100 (Thu, 01 Feb 2007) | 1 line
Bug #1648179: set.update() not recognizing __iter__ overrides in dict subclasses.
........
2007-02-04 21:24:16 -04:00
|
|
|
test_helper((2007, 01, 07), "First Sunday of 2007")
|
|
|
|
test_helper((2007, 01, 14), "Second Sunday of 2007")
|
|
|
|
test_helper((2006, 12, 31), "Last Sunday of 2006")
|
|
|
|
test_helper((2006, 12, 24), "Second to last Sunday of 2006")
|
2004-10-17 22:37:57 -03:00
|
|
|
|
2003-08-05 01:02:49 -03:00
|
|
|
|
|
|
|
class CacheTests(unittest.TestCase):
|
|
|
|
"""Test that caching works properly."""
|
|
|
|
|
|
|
|
def test_time_re_recreation(self):
|
|
|
|
# Make sure cache is recreated when current locale does not match what
|
|
|
|
# cached object was created with.
|
|
|
|
_strptime.strptime("10", "%d")
|
2005-09-14 23:34:56 -03:00
|
|
|
_strptime.strptime("2005", "%Y")
|
2003-08-05 01:02:49 -03:00
|
|
|
_strptime._TimeRE_cache.locale_time.lang = "Ni"
|
|
|
|
original_time_re = id(_strptime._TimeRE_cache)
|
|
|
|
_strptime.strptime("10", "%d")
|
|
|
|
self.failIfEqual(original_time_re, id(_strptime._TimeRE_cache))
|
2005-09-14 23:34:56 -03:00
|
|
|
self.failUnlessEqual(len(_strptime._regex_cache), 1)
|
2003-08-05 01:02:49 -03:00
|
|
|
|
|
|
|
def test_regex_cleanup(self):
|
|
|
|
# Make sure cached regexes are discarded when cache becomes "full".
|
|
|
|
try:
|
|
|
|
del _strptime._regex_cache['%d']
|
|
|
|
except KeyError:
|
|
|
|
pass
|
|
|
|
bogus_key = 0
|
|
|
|
while len(_strptime._regex_cache) <= _strptime._CACHE_MAX_SIZE:
|
|
|
|
_strptime._regex_cache[bogus_key] = None
|
|
|
|
bogus_key += 1
|
|
|
|
_strptime.strptime("10", "%d")
|
|
|
|
self.failUnlessEqual(len(_strptime._regex_cache), 1)
|
|
|
|
|
|
|
|
def test_new_localetime(self):
|
|
|
|
# A new LocaleTime instance should be created when a new TimeRE object
|
|
|
|
# is created.
|
|
|
|
locale_time_id = id(_strptime._TimeRE_cache.locale_time)
|
|
|
|
_strptime._TimeRE_cache.locale_time.lang = "Ni"
|
|
|
|
_strptime.strptime("10", "%d")
|
|
|
|
self.failIfEqual(locale_time_id,
|
|
|
|
id(_strptime._TimeRE_cache.locale_time))
|
|
|
|
|
|
|
|
|
2002-08-22 16:57:50 -03:00
|
|
|
def test_main():
|
2003-05-01 14:45:56 -03:00
|
|
|
test_support.run_unittest(
|
2003-07-24 03:27:17 -03:00
|
|
|
getlang_Tests,
|
2003-05-01 14:45:56 -03:00
|
|
|
LocaleTime_Tests,
|
|
|
|
TimeRETests,
|
|
|
|
StrptimeTests,
|
|
|
|
Strptime12AMPMTests,
|
|
|
|
JulianTests,
|
2003-07-24 03:27:17 -03:00
|
|
|
CalculationTests,
|
2003-08-05 01:02:49 -03:00
|
|
|
CacheTests
|
2003-05-01 14:45:56 -03:00
|
|
|
)
|
2002-07-19 14:04:46 -03:00
|
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
2002-08-22 16:57:50 -03:00
|
|
|
test_main()
|