@@ -219,25 +219,49 @@ def test_ValueError(self):
219219 else :
220220 self .fail ("'%s' did not raise ValueError" % bad_format )
221221
222- # Ambiguous or incomplete cases using ISO year/week/weekday directives
223- # 1. ISO week (%V) is specified, but the year is specified with %Y
224- # instead of %G
225- with self .assertRaises (ValueError ):
226- _strptime ._strptime ("1999 50" , "%Y %V" )
227- # 2. ISO year (%G) and ISO week (%V) are specified, but weekday is not
228- with self .assertRaises (ValueError ):
229- _strptime ._strptime ("1999 51" , "%G %V" )
230- # 3. ISO year (%G) and weekday are specified, but ISO week (%V) is not
231- for w in ('A' , 'a' , 'w' , 'u' ):
232- with self .assertRaises (ValueError ):
233- _strptime ._strptime ("1999 51" ,"%G %{}" .format (w ))
234- # 4. ISO year is specified alone (e.g. time.strptime('2015', '%G'))
235- with self .assertRaises (ValueError ):
236- _strptime ._strptime ("2015" , "%G" )
237- # 5. Julian/ordinal day (%j) is specified with %G, but not %Y
238- with self .assertRaises (ValueError ):
239- _strptime ._strptime ("1999 256" , "%G %j" )
222+ msg_week_no_year_or_weekday = r"ISO week directive '%V' must be used with " \
223+ r"the ISO year directive '%G' and a weekday directive " \
224+ r"\('%A', '%a', '%w', or '%u'\)."
225+ msg_week_not_compatible = r"ISO week directive '%V' is incompatible with " \
226+ r"the year directive '%Y'. Use the ISO year '%G' instead."
227+ msg_julian_not_compatible = r"Day of the year directive '%j' is not " \
228+ r"compatible with ISO year directive '%G'. Use '%Y' instead."
229+ msg_year_no_week_or_weekday = r"ISO year directive '%G' must be used with " \
230+ r"the ISO week directive '%V' and a weekday directive " \
231+ r"\('%A', '%a', '%w', or '%u'\)."
232+
233+ locale_time = _strptime .LocaleTime ()
240234
235+ # Ambiguous or incomplete cases using ISO year/week/weekday directives
236+ subtests = [
237+ # 1. ISO week (%V) is specified, but the year is specified with %Y
238+ # instead of %G
239+ ("1999 50" , "%Y %V" , msg_week_no_year_or_weekday ),
240+ ("1999 50 5" , "%Y %V %u" , msg_week_not_compatible ),
241+ # 2. ISO year (%G) and ISO week (%V) are specified, but weekday is not
242+ ("1999 51" , "%G %V" , msg_year_no_week_or_weekday ),
243+ # 3. ISO year (%G) and weekday are specified, but ISO week (%V) is not
244+ ("1999 {}" .format (locale_time .f_weekday [5 ]), "%G %A" ,
245+ msg_year_no_week_or_weekday ),
246+ ("1999 {}" .format (locale_time .a_weekday [5 ]), "%G %a" ,
247+ msg_year_no_week_or_weekday ),
248+ ("1999 5" , "%G %w" , msg_year_no_week_or_weekday ),
249+ ("1999 5" , "%G %u" , msg_year_no_week_or_weekday ),
250+ # 4. ISO year is specified alone (e.g. time.strptime('2015', '%G'))
251+ ("2015" , "%G" , msg_year_no_week_or_weekday ),
252+ # 5. Julian/ordinal day (%j) is specified with %G, but not %Y
253+ ("1999 256" , "%G %j" , msg_julian_not_compatible ),
254+ ("1999 50 5 256" , "%G %V %u %j" , msg_julian_not_compatible ),
255+ # ISO week specified alone
256+ ("50" , "%V" , msg_week_no_year_or_weekday ),
257+ # ISO year is unspecified, falling back to year
258+ ("50 5" , "%V %u" , msg_week_no_year_or_weekday ),
259+ ]
260+
261+ for (data_string , format , message ) in subtests :
262+ with self .subTest (data_string = data_string , format = format ):
263+ with self .assertRaisesRegex (ValueError , message ):
264+ _strptime ._strptime (data_string , format )
241265
242266 def test_strptime_exception_context (self ):
243267 # check that this doesn't chain exceptions needlessly (see #17572)
0 commit comments