2008-03-17 22:00:07 -03:00
|
|
|
"""
|
|
|
|
Unittest for time.strftime
|
|
|
|
"""
|
|
|
|
|
|
|
|
import calendar
|
|
|
|
import sys
|
|
|
|
import os
|
|
|
|
import re
|
|
|
|
from test import test_support
|
|
|
|
import time
|
|
|
|
import unittest
|
|
|
|
|
|
|
|
|
|
|
|
# helper functions
|
|
|
|
def fixasctime(s):
|
|
|
|
if s[8] == ' ':
|
|
|
|
s = s[:8] + '0' + s[9:]
|
|
|
|
return s
|
1996-12-13 14:07:07 -04:00
|
|
|
|
2004-03-20 19:09:40 -04:00
|
|
|
def escapestr(text, ampm):
|
2008-03-17 22:00:07 -03:00
|
|
|
"""
|
|
|
|
Escape text to deal with possible locale values that have regex
|
|
|
|
syntax while allowing regex syntax used for comparison.
|
|
|
|
"""
|
2004-03-20 19:09:40 -04:00
|
|
|
new_text = re.escape(text)
|
|
|
|
new_text = new_text.replace(re.escape(ampm), ampm)
|
2008-03-17 22:00:07 -03:00
|
|
|
new_text = new_text.replace('\%', '%')
|
|
|
|
new_text = new_text.replace('\:', ':')
|
|
|
|
new_text = new_text.replace('\?', '?')
|
2004-03-20 19:09:40 -04:00
|
|
|
return new_text
|
|
|
|
|
2008-03-17 22:00:07 -03:00
|
|
|
class StrftimeTest(unittest.TestCase):
|
1996-12-12 15:03:11 -04:00
|
|
|
|
2008-03-17 22:00:07 -03:00
|
|
|
def __init__(self, *k, **kw):
|
|
|
|
unittest.TestCase.__init__(self, *k, **kw)
|
1996-12-12 15:07:19 -04:00
|
|
|
|
2008-03-17 22:00:07 -03:00
|
|
|
def _update_variables(self, now):
|
|
|
|
# we must update the local variables on every cycle
|
|
|
|
self.gmt = time.gmtime(now)
|
|
|
|
now = time.localtime(now)
|
|
|
|
|
|
|
|
if now[3] < 12: self.ampm='(AM|am)'
|
|
|
|
else: self.ampm='(PM|pm)'
|
|
|
|
|
|
|
|
self.jan1 = time.localtime(time.mktime((now[0], 1, 1, 0, 0, 0, 0, 1, 0)))
|
1996-12-12 15:03:11 -04:00
|
|
|
|
1998-03-26 15:42:58 -04:00
|
|
|
try:
|
2008-03-17 22:00:07 -03:00
|
|
|
if now[8]: self.tz = time.tzname[1]
|
|
|
|
else: self.tz = time.tzname[0]
|
|
|
|
except AttributeError:
|
|
|
|
self.tz = ''
|
|
|
|
|
|
|
|
if now[3] > 12: self.clock12 = now[3] - 12
|
|
|
|
elif now[3] > 0: self.clock12 = now[3]
|
|
|
|
else: self.clock12 = 12
|
|
|
|
|
|
|
|
self.now = now
|
|
|
|
|
|
|
|
def setUp(self):
|
1998-03-26 15:42:58 -04:00
|
|
|
try:
|
2008-03-17 22:00:07 -03:00
|
|
|
import java
|
|
|
|
java.util.Locale.setDefault(java.util.Locale.US)
|
|
|
|
except ImportError:
|
|
|
|
import locale
|
|
|
|
locale.setlocale(locale.LC_TIME, 'C')
|
|
|
|
|
|
|
|
def test_strftime(self):
|
|
|
|
now = time.time()
|
|
|
|
self._update_variables(now)
|
|
|
|
self.strftest1(now)
|
|
|
|
self.strftest2(now)
|
|
|
|
|
|
|
|
if test_support.verbose:
|
|
|
|
print "Strftime test, platform: %s, Python version: %s" % \
|
|
|
|
(sys.platform, sys.version.split()[0])
|
|
|
|
|
|
|
|
for j in range(-5, 5):
|
|
|
|
for i in range(25):
|
|
|
|
arg = now + (i+j*100)*23*3603
|
|
|
|
self._update_variables(arg)
|
|
|
|
self.strftest1(arg)
|
|
|
|
self.strftest2(arg)
|
|
|
|
|
|
|
|
def strftest1(self, now):
|
|
|
|
if test_support.verbose:
|
|
|
|
print "strftime test for", time.ctime(now)
|
|
|
|
now = self.now
|
|
|
|
# Make sure any characters that could be taken as regex syntax is
|
|
|
|
# escaped in escapestr()
|
|
|
|
expectations = (
|
|
|
|
('%a', calendar.day_abbr[now[6]], 'abbreviated weekday name'),
|
|
|
|
('%A', calendar.day_name[now[6]], 'full weekday name'),
|
|
|
|
('%b', calendar.month_abbr[now[1]], 'abbreviated month name'),
|
|
|
|
('%B', calendar.month_name[now[1]], 'full month name'),
|
|
|
|
# %c see below
|
|
|
|
('%d', '%02d' % now[2], 'day of month as number (00-31)'),
|
|
|
|
('%H', '%02d' % now[3], 'hour (00-23)'),
|
|
|
|
('%I', '%02d' % self.clock12, 'hour (01-12)'),
|
|
|
|
('%j', '%03d' % now[7], 'julian day (001-366)'),
|
|
|
|
('%m', '%02d' % now[1], 'month as number (01-12)'),
|
|
|
|
('%M', '%02d' % now[4], 'minute, (00-59)'),
|
|
|
|
('%p', self.ampm, 'AM or PM as appropriate'),
|
|
|
|
('%S', '%02d' % now[5], 'seconds of current time (00-60)'),
|
|
|
|
('%U', '%02d' % ((now[7] + self.jan1[6])//7),
|
|
|
|
'week number of the year (Sun 1st)'),
|
|
|
|
('%w', '0?%d' % ((1+now[6]) % 7), 'weekday as a number (Sun 1st)'),
|
|
|
|
('%W', '%02d' % ((now[7] + (self.jan1[6] - 1)%7)//7),
|
|
|
|
'week number of the year (Mon 1st)'),
|
|
|
|
# %x see below
|
|
|
|
('%X', '%02d:%02d:%02d' % (now[3], now[4], now[5]), '%H:%M:%S'),
|
|
|
|
('%y', '%02d' % (now[0]%100), 'year without century'),
|
|
|
|
('%Y', '%d' % now[0], 'year with century'),
|
|
|
|
# %Z see below
|
|
|
|
('%%', '%', 'single percent sign'),
|
|
|
|
)
|
|
|
|
|
|
|
|
for e in expectations:
|
|
|
|
# musn't raise a value error
|
|
|
|
try:
|
|
|
|
result = time.strftime(e[0], now)
|
|
|
|
except ValueError, error:
|
Merged revisions 77593,77702-77703,77858,77887,78113-78115,78117,78245,78385-78386,78496,78760,78771-78773,78802 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r77593 | georg.brandl | 2010-01-18 00:33:53 +0100 (Mo, 18 Jan 2010) | 1 line
Fix internal reference.
........
r77702 | georg.brandl | 2010-01-23 09:43:31 +0100 (Sa, 23 Jan 2010) | 1 line
#7762: fix refcount annotation of PyUnicode_Tailmatch().
........
r77703 | georg.brandl | 2010-01-23 09:47:54 +0100 (Sa, 23 Jan 2010) | 1 line
#7725: fix referencing issue.
........
r77858 | georg.brandl | 2010-01-30 18:57:48 +0100 (Sa, 30 Jan 2010) | 1 line
#7802: fix invalid example (heh).
........
r77887 | georg.brandl | 2010-01-31 19:51:49 +0100 (So, 31 Jan 2010) | 5 lines
Fix-up ftplib documentation:
move exception descriptions to toplevel, not inside a class
remove attribution in "versionadded"
spell and grammar check docstring of FTP_TLS
........
r78113 | georg.brandl | 2010-02-08 23:37:20 +0100 (Mo, 08 Feb 2010) | 1 line
Fix missing string formatting argument.
........
r78114 | georg.brandl | 2010-02-08 23:37:52 +0100 (Mo, 08 Feb 2010) | 1 line
Fix undefined local.
........
r78115 | georg.brandl | 2010-02-08 23:40:51 +0100 (Mo, 08 Feb 2010) | 1 line
Fix missing string formatting placeholder.
........
r78117 | georg.brandl | 2010-02-08 23:48:37 +0100 (Mo, 08 Feb 2010) | 1 line
Convert test failure from output-producing to self.fail().
........
r78245 | georg.brandl | 2010-02-19 20:36:08 +0100 (Fr, 19 Feb 2010) | 1 line
#7967: PyXML is no more.
........
r78385 | georg.brandl | 2010-02-23 22:33:17 +0100 (Di, 23 Feb 2010) | 1 line
#8000: fix deprecated directive. What a shame to lose that glorious issue number to such a minor bug :)
........
r78386 | georg.brandl | 2010-02-23 22:48:57 +0100 (Di, 23 Feb 2010) | 1 line
#6544: fix refleak in kqueue, occurring in certain error conditions.
........
r78496 | georg.brandl | 2010-02-27 15:58:08 +0100 (Sa, 27 Feb 2010) | 1 line
Link to http://www.python.org/dev/workflow/ from bugs page.
........
r78760 | georg.brandl | 2010-03-07 16:23:59 +0100 (So, 07 Mär 2010) | 1 line
#5341: more built-in vs builtin fixes.
........
r78771 | georg.brandl | 2010-03-07 21:58:31 +0100 (So, 07 Mär 2010) | 1 line
#8085: The function is called PyObject_NewVar, not PyObject_VarNew.
........
r78772 | georg.brandl | 2010-03-07 22:12:28 +0100 (So, 07 Mär 2010) | 1 line
#8039: document conditional expressions better, giving them their own section.
........
r78773 | georg.brandl | 2010-03-07 22:32:06 +0100 (So, 07 Mär 2010) | 1 line
#8044: document Py_{Enter,Leave}RecursiveCall functions.
........
r78802 | georg.brandl | 2010-03-08 17:28:40 +0100 (Mo, 08 Mär 2010) | 1 line
Fix typo.
........
2010-03-21 16:29:04 -03:00
|
|
|
self.fail("strftime '%s' format gave error: %s" % (e[0], error))
|
2008-03-17 22:00:07 -03:00
|
|
|
if re.match(escapestr(e[1], self.ampm), result):
|
|
|
|
continue
|
|
|
|
if not result or result[0] == '%':
|
Merged revisions 77593,77702-77703,77858,77887,78113-78115,78117,78245,78385-78386,78496,78760,78771-78773,78802 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r77593 | georg.brandl | 2010-01-18 00:33:53 +0100 (Mo, 18 Jan 2010) | 1 line
Fix internal reference.
........
r77702 | georg.brandl | 2010-01-23 09:43:31 +0100 (Sa, 23 Jan 2010) | 1 line
#7762: fix refcount annotation of PyUnicode_Tailmatch().
........
r77703 | georg.brandl | 2010-01-23 09:47:54 +0100 (Sa, 23 Jan 2010) | 1 line
#7725: fix referencing issue.
........
r77858 | georg.brandl | 2010-01-30 18:57:48 +0100 (Sa, 30 Jan 2010) | 1 line
#7802: fix invalid example (heh).
........
r77887 | georg.brandl | 2010-01-31 19:51:49 +0100 (So, 31 Jan 2010) | 5 lines
Fix-up ftplib documentation:
move exception descriptions to toplevel, not inside a class
remove attribution in "versionadded"
spell and grammar check docstring of FTP_TLS
........
r78113 | georg.brandl | 2010-02-08 23:37:20 +0100 (Mo, 08 Feb 2010) | 1 line
Fix missing string formatting argument.
........
r78114 | georg.brandl | 2010-02-08 23:37:52 +0100 (Mo, 08 Feb 2010) | 1 line
Fix undefined local.
........
r78115 | georg.brandl | 2010-02-08 23:40:51 +0100 (Mo, 08 Feb 2010) | 1 line
Fix missing string formatting placeholder.
........
r78117 | georg.brandl | 2010-02-08 23:48:37 +0100 (Mo, 08 Feb 2010) | 1 line
Convert test failure from output-producing to self.fail().
........
r78245 | georg.brandl | 2010-02-19 20:36:08 +0100 (Fr, 19 Feb 2010) | 1 line
#7967: PyXML is no more.
........
r78385 | georg.brandl | 2010-02-23 22:33:17 +0100 (Di, 23 Feb 2010) | 1 line
#8000: fix deprecated directive. What a shame to lose that glorious issue number to such a minor bug :)
........
r78386 | georg.brandl | 2010-02-23 22:48:57 +0100 (Di, 23 Feb 2010) | 1 line
#6544: fix refleak in kqueue, occurring in certain error conditions.
........
r78496 | georg.brandl | 2010-02-27 15:58:08 +0100 (Sa, 27 Feb 2010) | 1 line
Link to http://www.python.org/dev/workflow/ from bugs page.
........
r78760 | georg.brandl | 2010-03-07 16:23:59 +0100 (So, 07 Mär 2010) | 1 line
#5341: more built-in vs builtin fixes.
........
r78771 | georg.brandl | 2010-03-07 21:58:31 +0100 (So, 07 Mär 2010) | 1 line
#8085: The function is called PyObject_NewVar, not PyObject_VarNew.
........
r78772 | georg.brandl | 2010-03-07 22:12:28 +0100 (So, 07 Mär 2010) | 1 line
#8039: document conditional expressions better, giving them their own section.
........
r78773 | georg.brandl | 2010-03-07 22:32:06 +0100 (So, 07 Mär 2010) | 1 line
#8044: document Py_{Enter,Leave}RecursiveCall functions.
........
r78802 | georg.brandl | 2010-03-08 17:28:40 +0100 (Mo, 08 Mär 2010) | 1 line
Fix typo.
........
2010-03-21 16:29:04 -03:00
|
|
|
self.fail("strftime does not support standard '%s' format (%s)"
|
|
|
|
% (e[0], e[2]))
|
2008-03-17 22:00:07 -03:00
|
|
|
else:
|
Merged revisions 77593,77702-77703,77858,77887,78113-78115,78117,78245,78385-78386,78496,78760,78771-78773,78802 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r77593 | georg.brandl | 2010-01-18 00:33:53 +0100 (Mo, 18 Jan 2010) | 1 line
Fix internal reference.
........
r77702 | georg.brandl | 2010-01-23 09:43:31 +0100 (Sa, 23 Jan 2010) | 1 line
#7762: fix refcount annotation of PyUnicode_Tailmatch().
........
r77703 | georg.brandl | 2010-01-23 09:47:54 +0100 (Sa, 23 Jan 2010) | 1 line
#7725: fix referencing issue.
........
r77858 | georg.brandl | 2010-01-30 18:57:48 +0100 (Sa, 30 Jan 2010) | 1 line
#7802: fix invalid example (heh).
........
r77887 | georg.brandl | 2010-01-31 19:51:49 +0100 (So, 31 Jan 2010) | 5 lines
Fix-up ftplib documentation:
move exception descriptions to toplevel, not inside a class
remove attribution in "versionadded"
spell and grammar check docstring of FTP_TLS
........
r78113 | georg.brandl | 2010-02-08 23:37:20 +0100 (Mo, 08 Feb 2010) | 1 line
Fix missing string formatting argument.
........
r78114 | georg.brandl | 2010-02-08 23:37:52 +0100 (Mo, 08 Feb 2010) | 1 line
Fix undefined local.
........
r78115 | georg.brandl | 2010-02-08 23:40:51 +0100 (Mo, 08 Feb 2010) | 1 line
Fix missing string formatting placeholder.
........
r78117 | georg.brandl | 2010-02-08 23:48:37 +0100 (Mo, 08 Feb 2010) | 1 line
Convert test failure from output-producing to self.fail().
........
r78245 | georg.brandl | 2010-02-19 20:36:08 +0100 (Fr, 19 Feb 2010) | 1 line
#7967: PyXML is no more.
........
r78385 | georg.brandl | 2010-02-23 22:33:17 +0100 (Di, 23 Feb 2010) | 1 line
#8000: fix deprecated directive. What a shame to lose that glorious issue number to such a minor bug :)
........
r78386 | georg.brandl | 2010-02-23 22:48:57 +0100 (Di, 23 Feb 2010) | 1 line
#6544: fix refleak in kqueue, occurring in certain error conditions.
........
r78496 | georg.brandl | 2010-02-27 15:58:08 +0100 (Sa, 27 Feb 2010) | 1 line
Link to http://www.python.org/dev/workflow/ from bugs page.
........
r78760 | georg.brandl | 2010-03-07 16:23:59 +0100 (So, 07 Mär 2010) | 1 line
#5341: more built-in vs builtin fixes.
........
r78771 | georg.brandl | 2010-03-07 21:58:31 +0100 (So, 07 Mär 2010) | 1 line
#8085: The function is called PyObject_NewVar, not PyObject_VarNew.
........
r78772 | georg.brandl | 2010-03-07 22:12:28 +0100 (So, 07 Mär 2010) | 1 line
#8039: document conditional expressions better, giving them their own section.
........
r78773 | georg.brandl | 2010-03-07 22:32:06 +0100 (So, 07 Mär 2010) | 1 line
#8044: document Py_{Enter,Leave}RecursiveCall functions.
........
r78802 | georg.brandl | 2010-03-08 17:28:40 +0100 (Mo, 08 Mär 2010) | 1 line
Fix typo.
........
2010-03-21 16:29:04 -03:00
|
|
|
self.fail("Conflict for %s (%s): expected %s, but got %s"
|
|
|
|
% (e[0], e[2], e[1], result))
|
1997-03-07 16:30:03 -04:00
|
|
|
|
2008-03-17 22:00:07 -03:00
|
|
|
def strftest2(self, now):
|
|
|
|
nowsecs = str(long(now))[:-1]
|
|
|
|
now = self.now
|
|
|
|
|
|
|
|
nonstandard_expectations = (
|
|
|
|
# These are standard but don't have predictable output
|
|
|
|
('%c', fixasctime(time.asctime(now)), 'near-asctime() format'),
|
|
|
|
('%x', '%02d/%02d/%02d' % (now[1], now[2], (now[0]%100)),
|
|
|
|
'%m/%d/%y %H:%M:%S'),
|
|
|
|
('%Z', '%s' % self.tz, 'time zone name'),
|
|
|
|
|
|
|
|
# These are some platform specific extensions
|
|
|
|
('%D', '%02d/%02d/%02d' % (now[1], now[2], (now[0]%100)), 'mm/dd/yy'),
|
|
|
|
('%e', '%2d' % now[2], 'day of month as number, blank padded ( 0-31)'),
|
|
|
|
('%h', calendar.month_abbr[now[1]], 'abbreviated month name'),
|
|
|
|
('%k', '%2d' % now[3], 'hour, blank padded ( 0-23)'),
|
|
|
|
('%n', '\n', 'newline character'),
|
|
|
|
('%r', '%02d:%02d:%02d %s' % (self.clock12, now[4], now[5], self.ampm),
|
|
|
|
'%I:%M:%S %p'),
|
|
|
|
('%R', '%02d:%02d' % (now[3], now[4]), '%H:%M'),
|
|
|
|
('%s', nowsecs, 'seconds since the Epoch in UCT'),
|
|
|
|
('%t', '\t', 'tab character'),
|
|
|
|
('%T', '%02d:%02d:%02d' % (now[3], now[4], now[5]), '%H:%M:%S'),
|
|
|
|
('%3y', '%03d' % (now[0]%100),
|
|
|
|
'year without century rendered using fieldwidth'),
|
|
|
|
)
|
1997-03-07 16:30:03 -04:00
|
|
|
|
2008-03-17 22:00:07 -03:00
|
|
|
for e in nonstandard_expectations:
|
|
|
|
try:
|
|
|
|
result = time.strftime(e[0], now)
|
|
|
|
except ValueError, result:
|
|
|
|
msg = "Error for nonstandard '%s' format (%s): %s" % \
|
|
|
|
(e[0], e[2], str(result))
|
|
|
|
if test_support.verbose:
|
|
|
|
print msg
|
|
|
|
continue
|
|
|
|
|
|
|
|
if re.match(escapestr(e[1], self.ampm), result):
|
|
|
|
if test_support.verbose:
|
|
|
|
print "Supports nonstandard '%s' format (%s)" % (e[0], e[2])
|
|
|
|
elif not result or result[0] == '%':
|
|
|
|
if test_support.verbose:
|
|
|
|
print "Does not appear to support '%s' format (%s)" % \
|
|
|
|
(e[0], e[2])
|
|
|
|
else:
|
|
|
|
if test_support.verbose:
|
|
|
|
print "Conflict for nonstandard '%s' format (%s):" % \
|
|
|
|
(e[0], e[2])
|
|
|
|
print " Expected %s, but got %s" % (e[1], result)
|
|
|
|
|
|
|
|
def test_main():
|
|
|
|
test_support.run_unittest(StrftimeTest)
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
test_main()
|