blob: bd8e6b415afa8ae4b9a48f664a0ab6da74ed8342 [file] [log] [blame]
Fred Draked077ca12001-12-12 05:38:08 +00001import calendar
2import unittest
3
Walter Dörwald21d3a322003-05-01 17:45:56 +00004from test import test_support
Fred Draked077ca12001-12-12 05:38:08 +00005
6
Walter Dörwald58917a62006-03-31 15:26:22 +00007result_2004 = """
8 2004
9
10 January February March
11Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
12 1 2 3 4 1 1 2 3 4 5 6 7
13 5 6 7 8 9 10 11 2 3 4 5 6 7 8 8 9 10 11 12 13 14
1412 13 14 15 16 17 18 9 10 11 12 13 14 15 15 16 17 18 19 20 21
1519 20 21 22 23 24 25 16 17 18 19 20 21 22 22 23 24 25 26 27 28
1626 27 28 29 30 31 23 24 25 26 27 28 29 29 30 31
17
18 April May June
19Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
20 1 2 3 4 1 2 1 2 3 4 5 6
21 5 6 7 8 9 10 11 3 4 5 6 7 8 9 7 8 9 10 11 12 13
2212 13 14 15 16 17 18 10 11 12 13 14 15 16 14 15 16 17 18 19 20
2319 20 21 22 23 24 25 17 18 19 20 21 22 23 21 22 23 24 25 26 27
2426 27 28 29 30 24 25 26 27 28 29 30 28 29 30
25 31
26
27 July August September
28Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
29 1 2 3 4 1 1 2 3 4 5
30 5 6 7 8 9 10 11 2 3 4 5 6 7 8 6 7 8 9 10 11 12
3112 13 14 15 16 17 18 9 10 11 12 13 14 15 13 14 15 16 17 18 19
3219 20 21 22 23 24 25 16 17 18 19 20 21 22 20 21 22 23 24 25 26
3326 27 28 29 30 31 23 24 25 26 27 28 29 27 28 29 30
34 30 31
35
36 October November December
37Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
38 1 2 3 1 2 3 4 5 6 7 1 2 3 4 5
39 4 5 6 7 8 9 10 8 9 10 11 12 13 14 6 7 8 9 10 11 12
4011 12 13 14 15 16 17 15 16 17 18 19 20 21 13 14 15 16 17 18 19
4118 19 20 21 22 23 24 22 23 24 25 26 27 28 20 21 22 23 24 25 26
4225 26 27 28 29 30 31 29 30 27 28 29 30 31
43"""
44
45
46class OutputTestCase(unittest.TestCase):
47 def normalize_calendar(self, s):
48 def neitherspacenordigit(c):
49 return not c.isspace() and not c.isdigit()
50
51 lines = []
52 for line in s.splitlines(False):
53 # Drop texts, as they are locale dependent
54 if line and not filter(neitherspacenordigit, line):
55 lines.append(line)
56 return lines
57
58 def test_output(self):
59 self.assertEqual(
60 self.normalize_calendar(calendar.calendar(2004)),
61 self.normalize_calendar(result_2004)
62 )
63
64
Fred Draked077ca12001-12-12 05:38:08 +000065class CalendarTestCase(unittest.TestCase):
66 def test_isleap(self):
67 # Make sure that the return is right for a few years, and
68 # ensure that the return values are 1 or 0, not just true or
69 # false (see SF bug #485794). Specific additional tests may
70 # be appropriate; this tests a single "cycle".
71 self.assertEqual(calendar.isleap(2000), 1)
72 self.assertEqual(calendar.isleap(2001), 0)
73 self.assertEqual(calendar.isleap(2002), 0)
74 self.assertEqual(calendar.isleap(2003), 0)
75
76 def test_setfirstweekday(self):
77 self.assertRaises(ValueError, calendar.setfirstweekday, 'flabber')
78 self.assertRaises(ValueError, calendar.setfirstweekday, -1)
79 self.assertRaises(ValueError, calendar.setfirstweekday, 200)
80 orig = calendar.firstweekday()
81 calendar.setfirstweekday(calendar.SUNDAY)
82 self.assertEqual(calendar.firstweekday(), calendar.SUNDAY)
83 calendar.setfirstweekday(calendar.MONDAY)
84 self.assertEqual(calendar.firstweekday(), calendar.MONDAY)
85 calendar.setfirstweekday(orig)
86
Skip Montanaro693c6c42002-03-15 03:57:04 +000087 def test_enumerateweekdays(self):
88 self.assertRaises(IndexError, calendar.day_abbr.__getitem__, -10)
89 self.assertRaises(IndexError, calendar.day_name.__getitem__, 10)
90 self.assertEqual(len([d for d in calendar.day_abbr]), 7)
Fred Draked077ca12001-12-12 05:38:08 +000091
Tim Peters0c2c8e72002-03-23 03:26:53 +000092 def test_days(self):
93 for attr in "day_name", "day_abbr":
94 value = getattr(calendar, attr)
95 self.assertEqual(len(value), 7)
96 self.assertEqual(len(value[:]), 7)
97 # ensure they're all unique
Tim Petersbbc0d442004-11-13 16:18:32 +000098 self.assertEqual(len(set(value)), 7)
99 # verify it "acts like a sequence" in two forms of iteration
100 self.assertEqual(value[::-1], list(reversed(value)))
Tim Peters0c2c8e72002-03-23 03:26:53 +0000101
102 def test_months(self):
103 for attr in "month_name", "month_abbr":
104 value = getattr(calendar, attr)
105 self.assertEqual(len(value), 13)
106 self.assertEqual(len(value[:]), 13)
107 self.assertEqual(value[0], "")
108 # ensure they're all unique
Tim Petersbbc0d442004-11-13 16:18:32 +0000109 self.assertEqual(len(set(value)), 13)
110 # verify it "acts like a sequence" in two forms of iteration
111 self.assertEqual(value[::-1], list(reversed(value)))
Tim Peters0c2c8e72002-03-23 03:26:53 +0000112
Walter Dörwald59ad4562004-07-02 19:00:09 +0000113
114class MonthCalendarTestCase(unittest.TestCase):
115 def setUp(self):
116 self.oldfirstweekday = calendar.firstweekday()
117 calendar.setfirstweekday(self.firstweekday)
118
119 def tearDown(self):
120 calendar.setfirstweekday(self.oldfirstweekday)
121
122 def check_weeks(self, year, month, weeks):
123 cal = calendar.monthcalendar(year, month)
124 self.assertEqual(len(cal), len(weeks))
125 for i in xrange(len(weeks)):
126 self.assertEqual(weeks[i], sum(day != 0 for day in cal[i]))
127
128
129class MondayTestCase(MonthCalendarTestCase):
130 firstweekday = calendar.MONDAY
131
132 def test_february(self):
Walter Dörwald58917a62006-03-31 15:26:22 +0000133 # A 28-day february starting on monday (7+7+7+7 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000134 self.check_weeks(1999, 2, (7, 7, 7, 7))
135
Walter Dörwald58917a62006-03-31 15:26:22 +0000136 # A 28-day february starting on tuesday (6+7+7+7+1 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000137 self.check_weeks(2005, 2, (6, 7, 7, 7, 1))
138
Walter Dörwald58917a62006-03-31 15:26:22 +0000139 # A 28-day february starting on sunday (1+7+7+7+6 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000140 self.check_weeks(1987, 2, (1, 7, 7, 7, 6))
141
Walter Dörwald58917a62006-03-31 15:26:22 +0000142 # A 29-day february starting on monday (7+7+7+7+1 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000143 self.check_weeks(1988, 2, (7, 7, 7, 7, 1))
144
Walter Dörwald58917a62006-03-31 15:26:22 +0000145 # A 29-day february starting on tuesday (6+7+7+7+2 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000146 self.check_weeks(1972, 2, (6, 7, 7, 7, 2))
147
Walter Dörwald58917a62006-03-31 15:26:22 +0000148 # A 29-day february starting on sunday (1+7+7+7+7 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000149 self.check_weeks(2004, 2, (1, 7, 7, 7, 7))
150
151 def test_april(self):
Walter Dörwald58917a62006-03-31 15:26:22 +0000152 # A 30-day april starting on monday (7+7+7+7+2 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000153 self.check_weeks(1935, 4, (7, 7, 7, 7, 2))
154
Walter Dörwald58917a62006-03-31 15:26:22 +0000155 # A 30-day april starting on tuesday (6+7+7+7+3 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000156 self.check_weeks(1975, 4, (6, 7, 7, 7, 3))
157
Walter Dörwald58917a62006-03-31 15:26:22 +0000158 # A 30-day april starting on sunday (1+7+7+7+7+1 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000159 self.check_weeks(1945, 4, (1, 7, 7, 7, 7, 1))
160
Walter Dörwald58917a62006-03-31 15:26:22 +0000161 # A 30-day april starting on saturday (2+7+7+7+7 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000162 self.check_weeks(1995, 4, (2, 7, 7, 7, 7))
163
Walter Dörwald58917a62006-03-31 15:26:22 +0000164 # A 30-day april starting on friday (3+7+7+7+6 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000165 self.check_weeks(1994, 4, (3, 7, 7, 7, 6))
166
167 def test_december(self):
Walter Dörwald58917a62006-03-31 15:26:22 +0000168 # A 31-day december starting on monday (7+7+7+7+3 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000169 self.check_weeks(1980, 12, (7, 7, 7, 7, 3))
170
Walter Dörwald58917a62006-03-31 15:26:22 +0000171 # A 31-day december starting on tuesday (6+7+7+7+4 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000172 self.check_weeks(1987, 12, (6, 7, 7, 7, 4))
173
Walter Dörwald58917a62006-03-31 15:26:22 +0000174 # A 31-day december starting on sunday (1+7+7+7+7+2 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000175 self.check_weeks(1968, 12, (1, 7, 7, 7, 7, 2))
176
Walter Dörwald58917a62006-03-31 15:26:22 +0000177 # A 31-day december starting on thursday (4+7+7+7+6 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000178 self.check_weeks(1988, 12, (4, 7, 7, 7, 6))
179
Walter Dörwald58917a62006-03-31 15:26:22 +0000180 # A 31-day december starting on friday (3+7+7+7+7 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000181 self.check_weeks(2017, 12, (3, 7, 7, 7, 7))
182
Walter Dörwald58917a62006-03-31 15:26:22 +0000183 # A 31-day december starting on saturday (2+7+7+7+7+1 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000184 self.check_weeks(2068, 12, (2, 7, 7, 7, 7, 1))
185
186
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000187class SundayTestCase(MonthCalendarTestCase):
188 firstweekday = calendar.SUNDAY
189
190 def test_february(self):
Walter Dörwald58917a62006-03-31 15:26:22 +0000191 # A 28-day february starting on sunday (7+7+7+7 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000192 self.check_weeks(2009, 2, (7, 7, 7, 7))
193
Walter Dörwald58917a62006-03-31 15:26:22 +0000194 # A 28-day february starting on monday (6+7+7+7+1 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000195 self.check_weeks(1999, 2, (6, 7, 7, 7, 1))
196
Walter Dörwald58917a62006-03-31 15:26:22 +0000197 # A 28-day february starting on saturday (1+7+7+7+6 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000198 self.check_weeks(1997, 2, (1, 7, 7, 7, 6))
199
Walter Dörwald58917a62006-03-31 15:26:22 +0000200 # A 29-day february starting on sunday (7+7+7+7+1 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000201 self.check_weeks(2004, 2, (7, 7, 7, 7, 1))
202
Walter Dörwald58917a62006-03-31 15:26:22 +0000203 # A 29-day february starting on monday (6+7+7+7+2 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000204 self.check_weeks(1960, 2, (6, 7, 7, 7, 2))
205
Walter Dörwald58917a62006-03-31 15:26:22 +0000206 # A 29-day february starting on saturday (1+7+7+7+7 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000207 self.check_weeks(1964, 2, (1, 7, 7, 7, 7))
208
209 def test_april(self):
Walter Dörwald58917a62006-03-31 15:26:22 +0000210 # A 30-day april starting on sunday (7+7+7+7+2 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000211 self.check_weeks(1923, 4, (7, 7, 7, 7, 2))
212
Walter Dörwald58917a62006-03-31 15:26:22 +0000213 # A 30-day april starting on monday (6+7+7+7+3 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000214 self.check_weeks(1918, 4, (6, 7, 7, 7, 3))
215
Walter Dörwald58917a62006-03-31 15:26:22 +0000216 # A 30-day april starting on saturday (1+7+7+7+7+1 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000217 self.check_weeks(1950, 4, (1, 7, 7, 7, 7, 1))
218
Walter Dörwald58917a62006-03-31 15:26:22 +0000219 # A 30-day april starting on friday (2+7+7+7+7 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000220 self.check_weeks(1960, 4, (2, 7, 7, 7, 7))
221
Walter Dörwald58917a62006-03-31 15:26:22 +0000222 # A 30-day april starting on thursday (3+7+7+7+6 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000223 self.check_weeks(1909, 4, (3, 7, 7, 7, 6))
224
225 def test_december(self):
Walter Dörwald58917a62006-03-31 15:26:22 +0000226 # A 31-day december starting on sunday (7+7+7+7+3 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000227 self.check_weeks(2080, 12, (7, 7, 7, 7, 3))
228
Walter Dörwald58917a62006-03-31 15:26:22 +0000229 # A 31-day december starting on monday (6+7+7+7+4 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000230 self.check_weeks(1941, 12, (6, 7, 7, 7, 4))
231
Walter Dörwald58917a62006-03-31 15:26:22 +0000232 # A 31-day december starting on saturday (1+7+7+7+7+2 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000233 self.check_weeks(1923, 12, (1, 7, 7, 7, 7, 2))
234
Walter Dörwald58917a62006-03-31 15:26:22 +0000235 # A 31-day december starting on wednesday (4+7+7+7+6 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000236 self.check_weeks(1948, 12, (4, 7, 7, 7, 6))
237
Walter Dörwald58917a62006-03-31 15:26:22 +0000238 # A 31-day december starting on thursday (3+7+7+7+7 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000239 self.check_weeks(1927, 12, (3, 7, 7, 7, 7))
240
Walter Dörwald58917a62006-03-31 15:26:22 +0000241 # A 31-day december starting on friday (2+7+7+7+7+1 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000242 self.check_weeks(1995, 12, (2, 7, 7, 7, 7, 1))
243
244
Fred Draked077ca12001-12-12 05:38:08 +0000245def test_main():
Walter Dörwald59ad4562004-07-02 19:00:09 +0000246 test_support.run_unittest(
Walter Dörwald58917a62006-03-31 15:26:22 +0000247 OutputTestCase,
Walter Dörwald59ad4562004-07-02 19:00:09 +0000248 CalendarTestCase,
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000249 MondayTestCase,
250 SundayTestCase
Walter Dörwald59ad4562004-07-02 19:00:09 +0000251 )
252
Fred Draked077ca12001-12-12 05:38:08 +0000253
254if __name__ == "__main__":
255 test_main()