Skip to content
2 changes: 1 addition & 1 deletion Lib/calendar.py
Original file line number Diff line number Diff line change
Expand Up @@ -370,7 +370,7 @@ def formatweekday(self, day, width):
"""
Returns a formatted week day name.
"""
if width >= 9:
if width >= max(map(len, day_name)):
names = day_name
else:
names = day_abbr
Expand Down
46 changes: 46 additions & 0 deletions Lib/test/test_calendar.py
Original file line number Diff line number Diff line change
Expand Up @@ -696,6 +696,52 @@ def test_locale_calendar_formatweekday(self):
except locale.Error:
raise unittest.SkipTest('cannot set the en_US locale')

# These locales have weekday names all shorter than English's longest
# 'Wednesday'. They should not be abbreviated unnecessarily
@support.run_with_locales("LC_ALL",
'Chinese', 'zh_CN.UTF-8',
'French', 'fr_FR.UTF-8',
'Norwegian', 'nb_NO.UTF-8',
'Malay', 'ms_MY.UTF8'
)
def test_locale_calendar_short_weekday_names(self):
names = (datetime.date(2001, 1, i+1).strftime('%A') for i in range(7))
max_length = max(map(len, names))
if max_length >= 9:
self.skipTest('weekday names are too long')

def get_weekday_names(width):
return calendar.TextCalendar().formatweekheader(width).split()

# Weekday names should not be abbreviated if the width is sufficient
self.assertEqual(
get_weekday_names(max_length),
get_weekday_names(max_length + 10)
)

# Any width shorter than necessary should produce abbreviations
self.assertNotEqual(
get_weekday_names(max_length),
get_weekday_names(max_length - 1)
)

# These locales have a weekday name longer than 'Wednesday'
# They should be properly abbreviated rather than truncated
@support.run_with_locales("LC_ALL",
'Portuguese', 'pt_PT.UTF-8',
'German', 'de_DE.UTF-8',
'Russian', 'ru_RU.UTF-8',
)
def test_locale_calendar_long_weekday_names(self):
names = (datetime.date(2001, 1, i+1).strftime('%A') for i in range(7))
max_length = max(map(len, names))
if max_length <= 9:
self.skipTest('weekday names are too short')

def get_weekday_names(width):
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This function is duplicated

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do you mean the local get_weekday_names function? Or did you mean the test_locale_calendar_short_weekday_names vs test_locale_calendar_long_weekday_names ? The latter two do different things. The first tests that locales with short names are NOT abbreviated needlessly; the second tests that locales with long names ARE abbreviated rather than truncated.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I mean the helper, get_weekday_names

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes. Is that important in a test? Do you prefer that function be moved up to the global scope to avoid the duplication, or some other suggestion?

return calendar.TextCalendar().formatweekheader(width).split()
self.assertEqual(get_weekday_names(4), get_weekday_names(9))

def test_locale_calendar_formatmonthname(self):
try:
# formatmonthname uses the same month names regardless of the width argument.
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Calendar uses the lengths of the locale's weekdays to decide if the width
requires abbreviation.
Loading