summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_strptime.py
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/test/test_strptime.py')
-rw-r--r--Lib/test/test_strptime.py114
1 files changed, 54 insertions, 60 deletions
diff --git a/Lib/test/test_strptime.py b/Lib/test/test_strptime.py
index 9ac75e6..fef5d90 100644
--- a/Lib/test/test_strptime.py
+++ b/Lib/test/test_strptime.py
@@ -4,6 +4,7 @@ import unittest
import time
import locale
import re
+import sets
from test import test_support
import _strptime
@@ -14,7 +15,12 @@ class getlang_Tests(unittest.TestCase):
self.failUnlessEqual(_strptime._getlang(), locale.getlocale(locale.LC_TIME))
class LocaleTime_Tests(unittest.TestCase):
- """Tests for _strptime.LocaleTime."""
+ """Tests for _strptime.LocaleTime.
+
+ All values are lower-cased when stored in LocaleTime, so make sure to
+ compare values after running ``lower`` on them.
+
+ """
def setUp(self):
"""Create time tuple based on current time."""
@@ -27,7 +33,7 @@ class LocaleTime_Tests(unittest.TestCase):
tuple_position of time_tuple. Uses error_msg as error message.
"""
- strftime_output = time.strftime(directive, self.time_tuple)
+ strftime_output = time.strftime(directive, self.time_tuple).lower()
comparison = testing[self.time_tuple[tuple_position]]
self.failUnless(strftime_output in testing, "%s: not found in tuple" %
error_msg)
@@ -53,7 +59,7 @@ class LocaleTime_Tests(unittest.TestCase):
def test_am_pm(self):
# Make sure AM/PM representation done properly
- strftime_output = time.strftime("%p", self.time_tuple)
+ strftime_output = time.strftime("%p", self.time_tuple).lower()
self.failUnless(strftime_output in self.LT_ins.am_pm,
"AM/PM representation not in tuple")
if self.time_tuple[3] < 12: position = 0
@@ -63,9 +69,10 @@ class LocaleTime_Tests(unittest.TestCase):
def test_timezone(self):
# Make sure timezone is correct
- timezone = time.strftime("%Z", self.time_tuple)
+ timezone = time.strftime("%Z", self.time_tuple).lower()
if timezone:
- self.failUnless(timezone in self.LT_ins.timezone,
+ self.failUnless(timezone in self.LT_ins.timezone[0] or \
+ timezone in self.LT_ins.timezone[1],
"timezone %s not found in %s" %
(timezone, self.LT_ins.timezone))
@@ -89,7 +96,8 @@ class LocaleTime_Tests(unittest.TestCase):
self.failUnless(strftime_output == time.strftime(self.LT_ins.LC_time,
magic_date),
"LC_time incorrect")
- LT = _strptime.LocaleTime(am_pm=('',''))
+ LT = _strptime.LocaleTime()
+ LT.am_pm = ('', '')
self.failUnless(LT.LC_time, "LocaleTime's LC directives cannot handle "
"empty strings")
@@ -98,44 +106,6 @@ class LocaleTime_Tests(unittest.TestCase):
# Assuming locale has not changed between now and when self.LT_ins was created
self.failUnlessEqual(self.LT_ins.lang, _strptime._getlang())
- def test_by_hand_input(self):
- # Test passed-in initialization value checks
- self.failUnless(_strptime.LocaleTime(f_weekday=range(7)),
- "Argument size check for f_weekday failed")
- self.assertRaises(TypeError, _strptime.LocaleTime, f_weekday=range(8))
- self.assertRaises(TypeError, _strptime.LocaleTime, f_weekday=range(6))
- self.failUnless(_strptime.LocaleTime(a_weekday=range(7)),
- "Argument size check for a_weekday failed")
- self.assertRaises(TypeError, _strptime.LocaleTime, a_weekday=range(8))
- self.assertRaises(TypeError, _strptime.LocaleTime, a_weekday=range(6))
- self.failUnless(_strptime.LocaleTime(f_month=range(12)),
- "Argument size check for f_month failed")
- self.assertRaises(TypeError, _strptime.LocaleTime, f_month=range(11))
- self.assertRaises(TypeError, _strptime.LocaleTime, f_month=range(13))
- self.failUnless(len(_strptime.LocaleTime(f_month=range(12)).f_month) == 13,
- "dummy value for f_month not added")
- self.failUnless(_strptime.LocaleTime(a_month=range(12)),
- "Argument size check for a_month failed")
- self.assertRaises(TypeError, _strptime.LocaleTime, a_month=range(11))
- self.assertRaises(TypeError, _strptime.LocaleTime, a_month=range(13))
- self.failUnless(len(_strptime.LocaleTime(a_month=range(12)).a_month) == 13,
- "dummy value for a_month not added")
- self.failUnless(_strptime.LocaleTime(am_pm=range(2)),
- "Argument size check for am_pm failed")
- self.assertRaises(TypeError, _strptime.LocaleTime, am_pm=range(1))
- self.assertRaises(TypeError, _strptime.LocaleTime, am_pm=range(3))
- self.failUnless(_strptime.LocaleTime(timezone=range(2)),
- "Argument size check for timezone failed")
- self.assertRaises(TypeError, _strptime.LocaleTime, timezone=range(1))
- self.assertRaises(TypeError, _strptime.LocaleTime, timezone=range(3))
-
- def test_unknowntimezone(self):
- # Handle timezone set to ('','') properly.
- # Fixes bug #661354
- locale_time = _strptime.LocaleTime(timezone=('',''))
- self.failUnless("%Z" not in locale_time.LC_date,
- "when timezone == ('',''), string.replace('','%Z') is "
- "occuring")
class TimeRETests(unittest.TestCase):
"""Tests for TimeRE."""
@@ -145,21 +115,6 @@ class TimeRETests(unittest.TestCase):
self.time_re = _strptime.TimeRE()
self.locale_time = _strptime.LocaleTime()
- def test_getitem(self):
- # Make sure that __getitem__ works properly
- self.failUnless(self.time_re['m'],
- "Fetching 'm' directive (built-in) failed")
- self.failUnless(self.time_re['b'],
- "Fetching 'b' directive (built w/ __tupleToRE) failed")
- for name in self.locale_time.a_month:
- self.failUnless(self.time_re['b'].find(name) != -1,
- "Not all abbreviated month names in regex")
- self.failUnless(self.time_re['c'],
- "Fetching 'c' directive (built w/ format) failed")
- self.failUnless(self.time_re['c'].find('%') == -1,
- "Conversion of 'c' directive failed; '%' found")
- self.assertRaises(KeyError, self.time_re.__getitem__, '1')
-
def test_pattern(self):
# Test TimeRE.pattern
pattern_string = self.time_re.pattern(r"%a %A %d")
@@ -210,7 +165,8 @@ class TimeRETests(unittest.TestCase):
def test_blankpattern(self):
# Make sure when tuple or something has no values no regex is generated.
# Fixes bug #661354
- test_locale = _strptime.LocaleTime(timezone=('',''))
+ test_locale = _strptime.LocaleTime()
+ test_locale.timezone = (sets.ImmutableSet(), sets.ImmutableSet())
self.failUnless(_strptime.TimeRE(test_locale).pattern("%Z") == '',
"with timezone == ('',''), TimeRE().pattern('%Z') != ''")
@@ -413,6 +369,43 @@ class CalculationTests(unittest.TestCase):
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))
+
+
+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")
+ _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))
+
+ 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))
+
+
def test_main():
test_support.run_unittest(
getlang_Tests,
@@ -422,6 +415,7 @@ def test_main():
Strptime12AMPMTests,
JulianTests,
CalculationTests,
+ CacheTests
)