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
2002-08-22 16:57:50 -03:00
from test import test_support
2002-07-19 14:04:46 -03:00
import _strptime
__version__ = ( 1 , 0 , 5 )
class LocaleTime_Tests ( unittest . TestCase ) :
2002-08-22 16:57:50 -03:00
""" Tests for _strptime.LocaleTime. """
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 ( )
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 .
"""
strftime_output = time . strftime ( directive , self . time_tuple )
comparison = testing [ self . time_tuple [ tuple_position ] ]
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-07-19 14:04:46 -03: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 " )
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-07-19 14:04:46 -03: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 " )
def test_am_pm ( self ) :
2002-08-22 16:57:50 -03:00
# Make sure AM/PM representation done properly
2002-07-19 14:04:46 -03:00
strftime_output = time . strftime ( " % p " , self . time_tuple )
self . failUnless ( strftime_output in self . LT_ins . am_pm , " AM/PM representation not in tuple " )
if self . time_tuple [ 3 ] < 12 : position = 0
else : position = 1
self . failUnless ( strftime_output == self . LT_ins . am_pm [ position ] , " AM/PM representation in the wrong position within the tuple " )
def test_timezone ( self ) :
2002-08-22 16:57:50 -03:00
# Make sure timezone is correct
2002-07-19 14:04:46 -03:00
if time . strftime ( " % Z " , self . time_tuple ) :
self . compare_against_time ( self . LT_ins . timezone , ' % Z ' , 8 , " Testing against timezone failed " )
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 )
self . failUnless ( strftime_output == time . strftime ( self . LT_ins . LC_date_time , magic_date ) , " LC_date_time incorrect " )
strftime_output = time . strftime ( " %x " , magic_date )
self . failUnless ( strftime_output == time . strftime ( self . LT_ins . LC_date , magic_date ) , " LC_date incorrect " )
strftime_output = time . strftime ( " %X " , magic_date )
self . failUnless ( strftime_output == time . strftime ( self . LT_ins . LC_time , magic_date ) , " LC_time incorrect " )
LT = _strptime . LocaleTime ( am_pm = ( ' ' , ' ' ) )
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 ) :
2002-08-22 16:57:50 -03:00
# Make sure lang is set
2002-07-19 14:04:46 -03:00
self . failUnless ( self . LT_ins . lang in ( locale . getdefaultlocale ( ) [ 0 ] , locale . getlocale ( locale . LC_TIME ) ) , " Setting of lang failed " )
def test_by_hand_input ( self ) :
2002-08-22 16:57:50 -03:00
# Test passed-in initialization value checks
2002-07-19 14:04:46 -03:00
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 ) )
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_getitem ( self ) :
2002-08-22 16:57:50 -03:00
# Make sure that __getitem__ works properly
2002-07-19 14:04:46 -03:00
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 ) :
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 " )
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 )
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 ] )
self . failUnless ( found and found . group ( ' A ' ) == self . locale_time . f_weekday [ 6 ] , " re object for ' % A ' failed " )
compiled = self . time_re . compile ( r " %a % b " )
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-07-19 14:04:46 -03: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 ] ) ) )
2002-08-08 17:19:19 -03:00
self . failUnless ( found . group ( ' a ' ) == self . locale_time . a_weekday [ 4 ] and found . group ( ' b ' ) == self . locale_time . a_month [ 4 ] ,
2002-07-19 14:04:46 -03:00
" 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 ' , ' % ' ) :
compiled = self . time_re . compile ( " %% %s " % directive )
found = compiled . match ( time . strftime ( " %% %s " % directive ) )
self . failUnless ( found , " Matching failed on ' %s ' using ' %s ' regex " % ( time . strftime ( " %% %s " % directive ) , compiled . pattern ) )
class StrptimeTests ( unittest . TestCase ) :
""" Tests for _strptime.strptime. """
def setUp ( self ) :
""" Create testing time tuple. """
self . time_tuple = time . gmtime ( )
def test_TypeError ( self ) :
2002-08-22 16:57:50 -03:00
# Make sure ValueError is raised when match fails
2002-07-19 14:04:46 -03:00
self . assertRaises ( ValueError , _strptime . strptime , data_string = " %d " , format = " % A " )
def test_returning_RE ( self ) :
2002-08-22 16:57:50 -03:00
# Make sure that an re can be returned
2002-07-19 14:04:46 -03:00
strp_output = _strptime . strptime ( False , " % Y " )
self . failUnless ( isinstance ( strp_output , type ( re . compile ( ' ' ) ) ) , " re object not returned correctly " )
self . failUnless ( _strptime . strptime ( " 1999 " , strp_output ) , " Use or re object failed " )
bad_locale_time = _strptime . LocaleTime ( lang = " gibberish " )
self . assertRaises ( TypeError , _strptime . strptime , data_string = ' 1999 ' , format = strp_output , locale_time = bad_locale_time )
def helper ( self , directive , position ) :
""" Helper fxn in testing. """
strf_output = time . strftime ( " %% %s " % directive , self . time_tuple )
strp_output = _strptime . strptime ( strf_output , " %% %s " % directive )
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 ] ) )
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 )
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 " )
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 ] ) )
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-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 " )
self . failUnless ( strp_output [ 8 ] == time_tuple [ 8 ] , " timezone check failed; ' %s ' -> %s != %s " % ( strf_output , strp_output [ 8 ] , time_tuple [ 8 ] ) )
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 " )
self . failUnless ( strp_output [ 0 ] == self . time_tuple [ 0 ] and strp_output [ 1 ] == self . time_tuple [ 1 ] , " handling of percent sign failed " )
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 " )
2002-07-19 14:04:46 -03:00
class FxnTests ( unittest . TestCase ) :
""" Test functions that fill in info by validating result and are triggered properly. """
def setUp ( self ) :
""" Create an initial time tuple. """
self . time_tuple = time . gmtime ( )
def test_julianday_result ( self ) :
2002-08-22 16:57:50 -03:00
# Test julianday
2002-07-19 14:04:46 -03:00
result = _strptime . julianday ( self . time_tuple [ 0 ] , self . time_tuple [ 1 ] , self . time_tuple [ 2 ] )
self . failUnless ( result == self . time_tuple [ 7 ] , " julianday failed; %s != %s " % ( result , self . time_tuple [ 7 ] ) )
def test_julianday_trigger ( self ) :
2002-08-22 16:57:50 -03:00
# Make sure julianday is called
2002-07-19 14:04:46 -03:00
strf_output = time . strftime ( " % Y- % m- %d " , self . time_tuple )
strp_output = _strptime . strptime ( strf_output , " % Y- % m- %d " )
self . failUnless ( strp_output [ 7 ] == self . time_tuple [ 7 ] , " strptime did not trigger julianday(); %s != %s " % ( strp_output [ 7 ] , self . time_tuple [ 7 ] ) )
2002-08-08 17:19:19 -03:00
2002-07-19 14:04:46 -03:00
def test_gregorian_result ( self ) :
2002-08-22 16:57:50 -03:00
# Test gregorian
2002-07-19 14:04:46 -03:00
result = _strptime . gregorian ( self . time_tuple [ 7 ] , self . time_tuple [ 0 ] )
comparison = [ self . time_tuple [ 0 ] , self . time_tuple [ 1 ] , self . time_tuple [ 2 ] ]
self . failUnless ( result == comparison , " gregorian() failed; %s != %s " % ( result , comparison ) )
def test_gregorian_trigger ( self ) :
2002-08-22 16:57:50 -03:00
# Test that gregorian() is triggered
2002-07-19 14:04:46 -03:00
strf_output = time . strftime ( " % j % Y " , self . time_tuple )
strp_output = _strptime . strptime ( strf_output , " % j % Y " )
self . failUnless ( strp_output [ 1 ] == self . time_tuple [ 1 ] and strp_output [ 2 ] == self . time_tuple [ 2 ] , " gregorian() not triggered; month -- %s != %s , day -- %s != %s " % ( strp_output [ 1 ] , self . time_tuple [ 1 ] , strp_output [ 2 ] , self . time_tuple [ 2 ] ) )
def test_dayofweek_result ( self ) :
2002-08-22 16:57:50 -03:00
# Test dayofweek
2002-07-19 14:04:46 -03:00
result = _strptime . dayofweek ( self . time_tuple [ 0 ] , self . time_tuple [ 1 ] , self . time_tuple [ 2 ] )
comparison = self . time_tuple [ 6 ]
self . failUnless ( result == comparison , " dayofweek() failed; %s != %s " % ( result , comparison ) )
def test_dayofweek_trigger ( self ) :
2002-08-22 16:57:50 -03:00
# Make sure dayofweek() gets triggered
2002-07-19 14:04:46 -03:00
strf_output = time . strftime ( " % Y- % m- %d " , self . time_tuple )
strp_output = _strptime . strptime ( strf_output , " % Y- % m- %d " )
self . failUnless ( strp_output [ 6 ] == self . time_tuple [ 6 ] , " triggering of dayofweek() failed; %s != %s " % ( strp_output [ 6 ] , self . time_tuple [ 6 ] ) )
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-08-22 16:57:50 -03:00
def test_main ( ) :
suite = unittest . TestSuite ( )
suite . addTest ( unittest . makeSuite ( LocaleTime_Tests ) )
suite . addTest ( unittest . makeSuite ( TimeRETests ) )
suite . addTest ( unittest . makeSuite ( StrptimeTests ) )
suite . addTest ( unittest . makeSuite ( FxnTests ) )
2002-08-29 12:25:04 -03:00
suite . addTest ( unittest . makeSuite ( Strptime12AMPMTests ) )
2002-08-22 16:57:50 -03:00
test_support . run_suite ( suite )
2002-07-19 14:04:46 -03:00
if __name__ == ' __main__ ' :
2002-08-22 16:57:50 -03:00
test_main ( )