blob: 8396bdf6f56afc341b226de5367013bba0da8718 [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
Georg Brandl79f096a2010-11-26 07:57:57 +00005import locale
Fred Draked077ca12001-12-12 05:38:08 +00006
7
Walter Dörwaldbc966092006-04-12 10:09:16 +00008result_2004_text = """
Walter Dörwald58917a62006-03-31 15:26:22 +00009 2004
10
11 January February March
12Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
13 1 2 3 4 1 1 2 3 4 5 6 7
14 5 6 7 8 9 10 11 2 3 4 5 6 7 8 8 9 10 11 12 13 14
1512 13 14 15 16 17 18 9 10 11 12 13 14 15 15 16 17 18 19 20 21
1619 20 21 22 23 24 25 16 17 18 19 20 21 22 22 23 24 25 26 27 28
1726 27 28 29 30 31 23 24 25 26 27 28 29 29 30 31
18
19 April May June
20Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
21 1 2 3 4 1 2 1 2 3 4 5 6
22 5 6 7 8 9 10 11 3 4 5 6 7 8 9 7 8 9 10 11 12 13
2312 13 14 15 16 17 18 10 11 12 13 14 15 16 14 15 16 17 18 19 20
2419 20 21 22 23 24 25 17 18 19 20 21 22 23 21 22 23 24 25 26 27
2526 27 28 29 30 24 25 26 27 28 29 30 28 29 30
26 31
27
28 July August September
29Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
30 1 2 3 4 1 1 2 3 4 5
31 5 6 7 8 9 10 11 2 3 4 5 6 7 8 6 7 8 9 10 11 12
3212 13 14 15 16 17 18 9 10 11 12 13 14 15 13 14 15 16 17 18 19
3319 20 21 22 23 24 25 16 17 18 19 20 21 22 20 21 22 23 24 25 26
3426 27 28 29 30 31 23 24 25 26 27 28 29 27 28 29 30
35 30 31
36
37 October November December
38Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
39 1 2 3 1 2 3 4 5 6 7 1 2 3 4 5
40 4 5 6 7 8 9 10 8 9 10 11 12 13 14 6 7 8 9 10 11 12
4111 12 13 14 15 16 17 15 16 17 18 19 20 21 13 14 15 16 17 18 19
4218 19 20 21 22 23 24 22 23 24 25 26 27 28 20 21 22 23 24 25 26
4325 26 27 28 29 30 31 29 30 27 28 29 30 31
44"""
45
Walter Dörwaldbc966092006-04-12 10:09:16 +000046result_2004_html = """
47<?xml version="1.0" encoding="ascii"?>
48<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
49<html>
50<head>
51<meta http-equiv="Content-Type" content="text/html; charset=ascii" />
52<link rel="stylesheet" type="text/css" href="calendar.css" />
Walter Dörwald6d20b702007-08-28 23:35:33 +000053<title>Calendar for 2004</title>
Walter Dörwaldbc966092006-04-12 10:09:16 +000054</head>
55<body>
56<table border="0" cellpadding="0" cellspacing="0" class="year">
57<tr><th colspan="3" class="year">2004</th></tr><tr><td><table border="0" cellpadding="0" cellspacing="0" class="month">
58<tr><th colspan="7" class="month">January</th></tr>
59<tr><th class="mon">Mon</th><th class="tue">Tue</th><th class="wed">Wed</th><th class="thu">Thu</th><th class="fri">Fri</th><th class="sat">Sat</th><th class="sun">Sun</th></tr>
60<tr><td class="noday">&nbsp;</td><td class="noday">&nbsp;</td><td class="noday">&nbsp;</td><td class="thu">1</td><td class="fri">2</td><td class="sat">3</td><td class="sun">4</td></tr>
61<tr><td class="mon">5</td><td class="tue">6</td><td class="wed">7</td><td class="thu">8</td><td class="fri">9</td><td class="sat">10</td><td class="sun">11</td></tr>
62<tr><td class="mon">12</td><td class="tue">13</td><td class="wed">14</td><td class="thu">15</td><td class="fri">16</td><td class="sat">17</td><td class="sun">18</td></tr>
63<tr><td class="mon">19</td><td class="tue">20</td><td class="wed">21</td><td class="thu">22</td><td class="fri">23</td><td class="sat">24</td><td class="sun">25</td></tr>
64<tr><td class="mon">26</td><td class="tue">27</td><td class="wed">28</td><td class="thu">29</td><td class="fri">30</td><td class="sat">31</td><td class="noday">&nbsp;</td></tr>
65</table>
66</td><td><table border="0" cellpadding="0" cellspacing="0" class="month">
67<tr><th colspan="7" class="month">February</th></tr>
68<tr><th class="mon">Mon</th><th class="tue">Tue</th><th class="wed">Wed</th><th class="thu">Thu</th><th class="fri">Fri</th><th class="sat">Sat</th><th class="sun">Sun</th></tr>
69<tr><td class="noday">&nbsp;</td><td class="noday">&nbsp;</td><td class="noday">&nbsp;</td><td class="noday">&nbsp;</td><td class="noday">&nbsp;</td><td class="noday">&nbsp;</td><td class="sun">1</td></tr>
70<tr><td class="mon">2</td><td class="tue">3</td><td class="wed">4</td><td class="thu">5</td><td class="fri">6</td><td class="sat">7</td><td class="sun">8</td></tr>
71<tr><td class="mon">9</td><td class="tue">10</td><td class="wed">11</td><td class="thu">12</td><td class="fri">13</td><td class="sat">14</td><td class="sun">15</td></tr>
72<tr><td class="mon">16</td><td class="tue">17</td><td class="wed">18</td><td class="thu">19</td><td class="fri">20</td><td class="sat">21</td><td class="sun">22</td></tr>
73<tr><td class="mon">23</td><td class="tue">24</td><td class="wed">25</td><td class="thu">26</td><td class="fri">27</td><td class="sat">28</td><td class="sun">29</td></tr>
74</table>
75</td><td><table border="0" cellpadding="0" cellspacing="0" class="month">
76<tr><th colspan="7" class="month">March</th></tr>
77<tr><th class="mon">Mon</th><th class="tue">Tue</th><th class="wed">Wed</th><th class="thu">Thu</th><th class="fri">Fri</th><th class="sat">Sat</th><th class="sun">Sun</th></tr>
78<tr><td class="mon">1</td><td class="tue">2</td><td class="wed">3</td><td class="thu">4</td><td class="fri">5</td><td class="sat">6</td><td class="sun">7</td></tr>
79<tr><td class="mon">8</td><td class="tue">9</td><td class="wed">10</td><td class="thu">11</td><td class="fri">12</td><td class="sat">13</td><td class="sun">14</td></tr>
80<tr><td class="mon">15</td><td class="tue">16</td><td class="wed">17</td><td class="thu">18</td><td class="fri">19</td><td class="sat">20</td><td class="sun">21</td></tr>
81<tr><td class="mon">22</td><td class="tue">23</td><td class="wed">24</td><td class="thu">25</td><td class="fri">26</td><td class="sat">27</td><td class="sun">28</td></tr>
82<tr><td class="mon">29</td><td class="tue">30</td><td class="wed">31</td><td class="noday">&nbsp;</td><td class="noday">&nbsp;</td><td class="noday">&nbsp;</td><td class="noday">&nbsp;</td></tr>
83</table>
84</td></tr><tr><td><table border="0" cellpadding="0" cellspacing="0" class="month">
85<tr><th colspan="7" class="month">April</th></tr>
86<tr><th class="mon">Mon</th><th class="tue">Tue</th><th class="wed">Wed</th><th class="thu">Thu</th><th class="fri">Fri</th><th class="sat">Sat</th><th class="sun">Sun</th></tr>
87<tr><td class="noday">&nbsp;</td><td class="noday">&nbsp;</td><td class="noday">&nbsp;</td><td class="thu">1</td><td class="fri">2</td><td class="sat">3</td><td class="sun">4</td></tr>
88<tr><td class="mon">5</td><td class="tue">6</td><td class="wed">7</td><td class="thu">8</td><td class="fri">9</td><td class="sat">10</td><td class="sun">11</td></tr>
89<tr><td class="mon">12</td><td class="tue">13</td><td class="wed">14</td><td class="thu">15</td><td class="fri">16</td><td class="sat">17</td><td class="sun">18</td></tr>
90<tr><td class="mon">19</td><td class="tue">20</td><td class="wed">21</td><td class="thu">22</td><td class="fri">23</td><td class="sat">24</td><td class="sun">25</td></tr>
91<tr><td class="mon">26</td><td class="tue">27</td><td class="wed">28</td><td class="thu">29</td><td class="fri">30</td><td class="noday">&nbsp;</td><td class="noday">&nbsp;</td></tr>
92</table>
93</td><td><table border="0" cellpadding="0" cellspacing="0" class="month">
94<tr><th colspan="7" class="month">May</th></tr>
95<tr><th class="mon">Mon</th><th class="tue">Tue</th><th class="wed">Wed</th><th class="thu">Thu</th><th class="fri">Fri</th><th class="sat">Sat</th><th class="sun">Sun</th></tr>
96<tr><td class="noday">&nbsp;</td><td class="noday">&nbsp;</td><td class="noday">&nbsp;</td><td class="noday">&nbsp;</td><td class="noday">&nbsp;</td><td class="sat">1</td><td class="sun">2</td></tr>
97<tr><td class="mon">3</td><td class="tue">4</td><td class="wed">5</td><td class="thu">6</td><td class="fri">7</td><td class="sat">8</td><td class="sun">9</td></tr>
98<tr><td class="mon">10</td><td class="tue">11</td><td class="wed">12</td><td class="thu">13</td><td class="fri">14</td><td class="sat">15</td><td class="sun">16</td></tr>
99<tr><td class="mon">17</td><td class="tue">18</td><td class="wed">19</td><td class="thu">20</td><td class="fri">21</td><td class="sat">22</td><td class="sun">23</td></tr>
100<tr><td class="mon">24</td><td class="tue">25</td><td class="wed">26</td><td class="thu">27</td><td class="fri">28</td><td class="sat">29</td><td class="sun">30</td></tr>
101<tr><td class="mon">31</td><td class="noday">&nbsp;</td><td class="noday">&nbsp;</td><td class="noday">&nbsp;</td><td class="noday">&nbsp;</td><td class="noday">&nbsp;</td><td class="noday">&nbsp;</td></tr>
102</table>
103</td><td><table border="0" cellpadding="0" cellspacing="0" class="month">
104<tr><th colspan="7" class="month">June</th></tr>
105<tr><th class="mon">Mon</th><th class="tue">Tue</th><th class="wed">Wed</th><th class="thu">Thu</th><th class="fri">Fri</th><th class="sat">Sat</th><th class="sun">Sun</th></tr>
106<tr><td class="noday">&nbsp;</td><td class="tue">1</td><td class="wed">2</td><td class="thu">3</td><td class="fri">4</td><td class="sat">5</td><td class="sun">6</td></tr>
107<tr><td class="mon">7</td><td class="tue">8</td><td class="wed">9</td><td class="thu">10</td><td class="fri">11</td><td class="sat">12</td><td class="sun">13</td></tr>
108<tr><td class="mon">14</td><td class="tue">15</td><td class="wed">16</td><td class="thu">17</td><td class="fri">18</td><td class="sat">19</td><td class="sun">20</td></tr>
109<tr><td class="mon">21</td><td class="tue">22</td><td class="wed">23</td><td class="thu">24</td><td class="fri">25</td><td class="sat">26</td><td class="sun">27</td></tr>
110<tr><td class="mon">28</td><td class="tue">29</td><td class="wed">30</td><td class="noday">&nbsp;</td><td class="noday">&nbsp;</td><td class="noday">&nbsp;</td><td class="noday">&nbsp;</td></tr>
111</table>
112</td></tr><tr><td><table border="0" cellpadding="0" cellspacing="0" class="month">
113<tr><th colspan="7" class="month">July</th></tr>
114<tr><th class="mon">Mon</th><th class="tue">Tue</th><th class="wed">Wed</th><th class="thu">Thu</th><th class="fri">Fri</th><th class="sat">Sat</th><th class="sun">Sun</th></tr>
115<tr><td class="noday">&nbsp;</td><td class="noday">&nbsp;</td><td class="noday">&nbsp;</td><td class="thu">1</td><td class="fri">2</td><td class="sat">3</td><td class="sun">4</td></tr>
116<tr><td class="mon">5</td><td class="tue">6</td><td class="wed">7</td><td class="thu">8</td><td class="fri">9</td><td class="sat">10</td><td class="sun">11</td></tr>
117<tr><td class="mon">12</td><td class="tue">13</td><td class="wed">14</td><td class="thu">15</td><td class="fri">16</td><td class="sat">17</td><td class="sun">18</td></tr>
118<tr><td class="mon">19</td><td class="tue">20</td><td class="wed">21</td><td class="thu">22</td><td class="fri">23</td><td class="sat">24</td><td class="sun">25</td></tr>
119<tr><td class="mon">26</td><td class="tue">27</td><td class="wed">28</td><td class="thu">29</td><td class="fri">30</td><td class="sat">31</td><td class="noday">&nbsp;</td></tr>
120</table>
121</td><td><table border="0" cellpadding="0" cellspacing="0" class="month">
122<tr><th colspan="7" class="month">August</th></tr>
123<tr><th class="mon">Mon</th><th class="tue">Tue</th><th class="wed">Wed</th><th class="thu">Thu</th><th class="fri">Fri</th><th class="sat">Sat</th><th class="sun">Sun</th></tr>
124<tr><td class="noday">&nbsp;</td><td class="noday">&nbsp;</td><td class="noday">&nbsp;</td><td class="noday">&nbsp;</td><td class="noday">&nbsp;</td><td class="noday">&nbsp;</td><td class="sun">1</td></tr>
125<tr><td class="mon">2</td><td class="tue">3</td><td class="wed">4</td><td class="thu">5</td><td class="fri">6</td><td class="sat">7</td><td class="sun">8</td></tr>
126<tr><td class="mon">9</td><td class="tue">10</td><td class="wed">11</td><td class="thu">12</td><td class="fri">13</td><td class="sat">14</td><td class="sun">15</td></tr>
127<tr><td class="mon">16</td><td class="tue">17</td><td class="wed">18</td><td class="thu">19</td><td class="fri">20</td><td class="sat">21</td><td class="sun">22</td></tr>
128<tr><td class="mon">23</td><td class="tue">24</td><td class="wed">25</td><td class="thu">26</td><td class="fri">27</td><td class="sat">28</td><td class="sun">29</td></tr>
129<tr><td class="mon">30</td><td class="tue">31</td><td class="noday">&nbsp;</td><td class="noday">&nbsp;</td><td class="noday">&nbsp;</td><td class="noday">&nbsp;</td><td class="noday">&nbsp;</td></tr>
130</table>
131</td><td><table border="0" cellpadding="0" cellspacing="0" class="month">
132<tr><th colspan="7" class="month">September</th></tr>
133<tr><th class="mon">Mon</th><th class="tue">Tue</th><th class="wed">Wed</th><th class="thu">Thu</th><th class="fri">Fri</th><th class="sat">Sat</th><th class="sun">Sun</th></tr>
134<tr><td class="noday">&nbsp;</td><td class="noday">&nbsp;</td><td class="wed">1</td><td class="thu">2</td><td class="fri">3</td><td class="sat">4</td><td class="sun">5</td></tr>
135<tr><td class="mon">6</td><td class="tue">7</td><td class="wed">8</td><td class="thu">9</td><td class="fri">10</td><td class="sat">11</td><td class="sun">12</td></tr>
136<tr><td class="mon">13</td><td class="tue">14</td><td class="wed">15</td><td class="thu">16</td><td class="fri">17</td><td class="sat">18</td><td class="sun">19</td></tr>
137<tr><td class="mon">20</td><td class="tue">21</td><td class="wed">22</td><td class="thu">23</td><td class="fri">24</td><td class="sat">25</td><td class="sun">26</td></tr>
138<tr><td class="mon">27</td><td class="tue">28</td><td class="wed">29</td><td class="thu">30</td><td class="noday">&nbsp;</td><td class="noday">&nbsp;</td><td class="noday">&nbsp;</td></tr>
139</table>
140</td></tr><tr><td><table border="0" cellpadding="0" cellspacing="0" class="month">
141<tr><th colspan="7" class="month">October</th></tr>
142<tr><th class="mon">Mon</th><th class="tue">Tue</th><th class="wed">Wed</th><th class="thu">Thu</th><th class="fri">Fri</th><th class="sat">Sat</th><th class="sun">Sun</th></tr>
143<tr><td class="noday">&nbsp;</td><td class="noday">&nbsp;</td><td class="noday">&nbsp;</td><td class="noday">&nbsp;</td><td class="fri">1</td><td class="sat">2</td><td class="sun">3</td></tr>
144<tr><td class="mon">4</td><td class="tue">5</td><td class="wed">6</td><td class="thu">7</td><td class="fri">8</td><td class="sat">9</td><td class="sun">10</td></tr>
145<tr><td class="mon">11</td><td class="tue">12</td><td class="wed">13</td><td class="thu">14</td><td class="fri">15</td><td class="sat">16</td><td class="sun">17</td></tr>
146<tr><td class="mon">18</td><td class="tue">19</td><td class="wed">20</td><td class="thu">21</td><td class="fri">22</td><td class="sat">23</td><td class="sun">24</td></tr>
147<tr><td class="mon">25</td><td class="tue">26</td><td class="wed">27</td><td class="thu">28</td><td class="fri">29</td><td class="sat">30</td><td class="sun">31</td></tr>
148</table>
149</td><td><table border="0" cellpadding="0" cellspacing="0" class="month">
150<tr><th colspan="7" class="month">November</th></tr>
151<tr><th class="mon">Mon</th><th class="tue">Tue</th><th class="wed">Wed</th><th class="thu">Thu</th><th class="fri">Fri</th><th class="sat">Sat</th><th class="sun">Sun</th></tr>
152<tr><td class="mon">1</td><td class="tue">2</td><td class="wed">3</td><td class="thu">4</td><td class="fri">5</td><td class="sat">6</td><td class="sun">7</td></tr>
153<tr><td class="mon">8</td><td class="tue">9</td><td class="wed">10</td><td class="thu">11</td><td class="fri">12</td><td class="sat">13</td><td class="sun">14</td></tr>
154<tr><td class="mon">15</td><td class="tue">16</td><td class="wed">17</td><td class="thu">18</td><td class="fri">19</td><td class="sat">20</td><td class="sun">21</td></tr>
155<tr><td class="mon">22</td><td class="tue">23</td><td class="wed">24</td><td class="thu">25</td><td class="fri">26</td><td class="sat">27</td><td class="sun">28</td></tr>
156<tr><td class="mon">29</td><td class="tue">30</td><td class="noday">&nbsp;</td><td class="noday">&nbsp;</td><td class="noday">&nbsp;</td><td class="noday">&nbsp;</td><td class="noday">&nbsp;</td></tr>
157</table>
158</td><td><table border="0" cellpadding="0" cellspacing="0" class="month">
159<tr><th colspan="7" class="month">December</th></tr>
160<tr><th class="mon">Mon</th><th class="tue">Tue</th><th class="wed">Wed</th><th class="thu">Thu</th><th class="fri">Fri</th><th class="sat">Sat</th><th class="sun">Sun</th></tr>
161<tr><td class="noday">&nbsp;</td><td class="noday">&nbsp;</td><td class="wed">1</td><td class="thu">2</td><td class="fri">3</td><td class="sat">4</td><td class="sun">5</td></tr>
162<tr><td class="mon">6</td><td class="tue">7</td><td class="wed">8</td><td class="thu">9</td><td class="fri">10</td><td class="sat">11</td><td class="sun">12</td></tr>
163<tr><td class="mon">13</td><td class="tue">14</td><td class="wed">15</td><td class="thu">16</td><td class="fri">17</td><td class="sat">18</td><td class="sun">19</td></tr>
164<tr><td class="mon">20</td><td class="tue">21</td><td class="wed">22</td><td class="thu">23</td><td class="fri">24</td><td class="sat">25</td><td class="sun">26</td></tr>
165<tr><td class="mon">27</td><td class="tue">28</td><td class="wed">29</td><td class="thu">30</td><td class="fri">31</td><td class="noday">&nbsp;</td><td class="noday">&nbsp;</td></tr>
166</table>
167</td></tr></table></body>
168</html>
169"""
170
Walter Dörwald58917a62006-03-31 15:26:22 +0000171
172class OutputTestCase(unittest.TestCase):
173 def normalize_calendar(self, s):
Mark Dickinson3e4caeb2009-02-21 20:27:01 +0000174 # Filters out locale dependent strings
Walter Dörwald58917a62006-03-31 15:26:22 +0000175 def neitherspacenordigit(c):
176 return not c.isspace() and not c.isdigit()
177
178 lines = []
179 for line in s.splitlines(False):
180 # Drop texts, as they are locale dependent
181 if line and not filter(neitherspacenordigit, line):
182 lines.append(line)
183 return lines
184
185 def test_output(self):
186 self.assertEqual(
187 self.normalize_calendar(calendar.calendar(2004)),
Walter Dörwaldbc966092006-04-12 10:09:16 +0000188 self.normalize_calendar(result_2004_text)
189 )
190
191 def test_output_textcalendar(self):
192 self.assertEqual(
193 calendar.TextCalendar().formatyear(2004).strip(),
194 result_2004_text.strip()
195 )
196
197 def test_output_htmlcalendar(self):
198 self.assertEqual(
199 calendar.HTMLCalendar().formatyearpage(2004).strip(),
200 result_2004_html.strip()
Walter Dörwald58917a62006-03-31 15:26:22 +0000201 )
202
203
Fred Draked077ca12001-12-12 05:38:08 +0000204class CalendarTestCase(unittest.TestCase):
205 def test_isleap(self):
206 # Make sure that the return is right for a few years, and
207 # ensure that the return values are 1 or 0, not just true or
208 # false (see SF bug #485794). Specific additional tests may
209 # be appropriate; this tests a single "cycle".
210 self.assertEqual(calendar.isleap(2000), 1)
211 self.assertEqual(calendar.isleap(2001), 0)
212 self.assertEqual(calendar.isleap(2002), 0)
213 self.assertEqual(calendar.isleap(2003), 0)
214
215 def test_setfirstweekday(self):
Florent Xicluna1f3b4e12010-03-07 12:14:25 +0000216 self.assertRaises(ValueError, calendar.setfirstweekday, 'flabber')
217 self.assertRaises(ValueError, calendar.setfirstweekday, -1)
218 self.assertRaises(ValueError, calendar.setfirstweekday, 200)
Fred Draked077ca12001-12-12 05:38:08 +0000219 orig = calendar.firstweekday()
220 calendar.setfirstweekday(calendar.SUNDAY)
221 self.assertEqual(calendar.firstweekday(), calendar.SUNDAY)
222 calendar.setfirstweekday(calendar.MONDAY)
223 self.assertEqual(calendar.firstweekday(), calendar.MONDAY)
224 calendar.setfirstweekday(orig)
225
Skip Montanaro693c6c42002-03-15 03:57:04 +0000226 def test_enumerateweekdays(self):
227 self.assertRaises(IndexError, calendar.day_abbr.__getitem__, -10)
228 self.assertRaises(IndexError, calendar.day_name.__getitem__, 10)
229 self.assertEqual(len([d for d in calendar.day_abbr]), 7)
Fred Draked077ca12001-12-12 05:38:08 +0000230
Tim Peters0c2c8e72002-03-23 03:26:53 +0000231 def test_days(self):
232 for attr in "day_name", "day_abbr":
233 value = getattr(calendar, attr)
234 self.assertEqual(len(value), 7)
235 self.assertEqual(len(value[:]), 7)
236 # ensure they're all unique
Tim Petersbbc0d442004-11-13 16:18:32 +0000237 self.assertEqual(len(set(value)), 7)
238 # verify it "acts like a sequence" in two forms of iteration
239 self.assertEqual(value[::-1], list(reversed(value)))
Tim Peters0c2c8e72002-03-23 03:26:53 +0000240
241 def test_months(self):
242 for attr in "month_name", "month_abbr":
243 value = getattr(calendar, attr)
244 self.assertEqual(len(value), 13)
245 self.assertEqual(len(value[:]), 13)
246 self.assertEqual(value[0], "")
247 # ensure they're all unique
Tim Petersbbc0d442004-11-13 16:18:32 +0000248 self.assertEqual(len(set(value)), 13)
249 # verify it "acts like a sequence" in two forms of iteration
250 self.assertEqual(value[::-1], list(reversed(value)))
Tim Peters0c2c8e72002-03-23 03:26:53 +0000251
Georg Brandl79f096a2010-11-26 07:57:57 +0000252 def test_localecalendars(self):
253 # ensure that Locale{Text,HTML}Calendar resets the locale properly
254 # (it is still not thread-safe though)
255 try:
256 def_locale = locale.getdefaultlocale()
257 except locale.Error:
258 # cannot determine a default locale -- skip test
259 return
260 old_october = calendar.TextCalendar().formatmonthname(2010, 10, 10)
261 calendar.LocaleTextCalendar(
262 locale=def_locale).formatmonthname(2010, 10, 10)
263 calendar.LocaleHTMLCalendar(
264 locale=def_locale).formatmonthname(2010, 10)
265 new_october = calendar.TextCalendar().formatmonthname(2010, 10, 10)
266 self.assertEquals(old_october, new_october)
267
Walter Dörwald59ad4562004-07-02 19:00:09 +0000268
269class MonthCalendarTestCase(unittest.TestCase):
270 def setUp(self):
271 self.oldfirstweekday = calendar.firstweekday()
272 calendar.setfirstweekday(self.firstweekday)
273
274 def tearDown(self):
275 calendar.setfirstweekday(self.oldfirstweekday)
276
277 def check_weeks(self, year, month, weeks):
278 cal = calendar.monthcalendar(year, month)
279 self.assertEqual(len(cal), len(weeks))
280 for i in xrange(len(weeks)):
281 self.assertEqual(weeks[i], sum(day != 0 for day in cal[i]))
282
283
284class MondayTestCase(MonthCalendarTestCase):
285 firstweekday = calendar.MONDAY
286
287 def test_february(self):
Walter Dörwald58917a62006-03-31 15:26:22 +0000288 # A 28-day february starting on monday (7+7+7+7 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000289 self.check_weeks(1999, 2, (7, 7, 7, 7))
290
Walter Dörwald58917a62006-03-31 15:26:22 +0000291 # A 28-day february starting on tuesday (6+7+7+7+1 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000292 self.check_weeks(2005, 2, (6, 7, 7, 7, 1))
293
Walter Dörwald58917a62006-03-31 15:26:22 +0000294 # A 28-day february starting on sunday (1+7+7+7+6 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000295 self.check_weeks(1987, 2, (1, 7, 7, 7, 6))
296
Walter Dörwald58917a62006-03-31 15:26:22 +0000297 # A 29-day february starting on monday (7+7+7+7+1 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000298 self.check_weeks(1988, 2, (7, 7, 7, 7, 1))
299
Walter Dörwald58917a62006-03-31 15:26:22 +0000300 # A 29-day february starting on tuesday (6+7+7+7+2 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000301 self.check_weeks(1972, 2, (6, 7, 7, 7, 2))
302
Walter Dörwald58917a62006-03-31 15:26:22 +0000303 # A 29-day february starting on sunday (1+7+7+7+7 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000304 self.check_weeks(2004, 2, (1, 7, 7, 7, 7))
305
306 def test_april(self):
Walter Dörwald58917a62006-03-31 15:26:22 +0000307 # A 30-day april starting on monday (7+7+7+7+2 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000308 self.check_weeks(1935, 4, (7, 7, 7, 7, 2))
309
Walter Dörwald58917a62006-03-31 15:26:22 +0000310 # A 30-day april starting on tuesday (6+7+7+7+3 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000311 self.check_weeks(1975, 4, (6, 7, 7, 7, 3))
312
Walter Dörwald58917a62006-03-31 15:26:22 +0000313 # A 30-day april starting on sunday (1+7+7+7+7+1 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000314 self.check_weeks(1945, 4, (1, 7, 7, 7, 7, 1))
315
Walter Dörwald58917a62006-03-31 15:26:22 +0000316 # A 30-day april starting on saturday (2+7+7+7+7 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000317 self.check_weeks(1995, 4, (2, 7, 7, 7, 7))
318
Walter Dörwald58917a62006-03-31 15:26:22 +0000319 # A 30-day april starting on friday (3+7+7+7+6 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000320 self.check_weeks(1994, 4, (3, 7, 7, 7, 6))
321
322 def test_december(self):
Walter Dörwald58917a62006-03-31 15:26:22 +0000323 # A 31-day december starting on monday (7+7+7+7+3 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000324 self.check_weeks(1980, 12, (7, 7, 7, 7, 3))
325
Walter Dörwald58917a62006-03-31 15:26:22 +0000326 # A 31-day december starting on tuesday (6+7+7+7+4 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000327 self.check_weeks(1987, 12, (6, 7, 7, 7, 4))
328
Walter Dörwald58917a62006-03-31 15:26:22 +0000329 # A 31-day december starting on sunday (1+7+7+7+7+2 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000330 self.check_weeks(1968, 12, (1, 7, 7, 7, 7, 2))
331
Walter Dörwald58917a62006-03-31 15:26:22 +0000332 # A 31-day december starting on thursday (4+7+7+7+6 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000333 self.check_weeks(1988, 12, (4, 7, 7, 7, 6))
334
Walter Dörwald58917a62006-03-31 15:26:22 +0000335 # A 31-day december starting on friday (3+7+7+7+7 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000336 self.check_weeks(2017, 12, (3, 7, 7, 7, 7))
337
Walter Dörwald58917a62006-03-31 15:26:22 +0000338 # A 31-day december starting on saturday (2+7+7+7+7+1 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000339 self.check_weeks(2068, 12, (2, 7, 7, 7, 7, 1))
340
341
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000342class SundayTestCase(MonthCalendarTestCase):
343 firstweekday = calendar.SUNDAY
344
345 def test_february(self):
Walter Dörwald58917a62006-03-31 15:26:22 +0000346 # A 28-day february starting on sunday (7+7+7+7 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000347 self.check_weeks(2009, 2, (7, 7, 7, 7))
348
Walter Dörwald58917a62006-03-31 15:26:22 +0000349 # A 28-day february starting on monday (6+7+7+7+1 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000350 self.check_weeks(1999, 2, (6, 7, 7, 7, 1))
351
Walter Dörwald58917a62006-03-31 15:26:22 +0000352 # A 28-day february starting on saturday (1+7+7+7+6 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000353 self.check_weeks(1997, 2, (1, 7, 7, 7, 6))
354
Walter Dörwald58917a62006-03-31 15:26:22 +0000355 # A 29-day february starting on sunday (7+7+7+7+1 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000356 self.check_weeks(2004, 2, (7, 7, 7, 7, 1))
357
Walter Dörwald58917a62006-03-31 15:26:22 +0000358 # A 29-day february starting on monday (6+7+7+7+2 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000359 self.check_weeks(1960, 2, (6, 7, 7, 7, 2))
360
Walter Dörwald58917a62006-03-31 15:26:22 +0000361 # A 29-day february starting on saturday (1+7+7+7+7 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000362 self.check_weeks(1964, 2, (1, 7, 7, 7, 7))
363
364 def test_april(self):
Walter Dörwald58917a62006-03-31 15:26:22 +0000365 # A 30-day april starting on sunday (7+7+7+7+2 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000366 self.check_weeks(1923, 4, (7, 7, 7, 7, 2))
367
Walter Dörwald58917a62006-03-31 15:26:22 +0000368 # A 30-day april starting on monday (6+7+7+7+3 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000369 self.check_weeks(1918, 4, (6, 7, 7, 7, 3))
370
Walter Dörwald58917a62006-03-31 15:26:22 +0000371 # A 30-day april starting on saturday (1+7+7+7+7+1 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000372 self.check_weeks(1950, 4, (1, 7, 7, 7, 7, 1))
373
Walter Dörwald58917a62006-03-31 15:26:22 +0000374 # A 30-day april starting on friday (2+7+7+7+7 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000375 self.check_weeks(1960, 4, (2, 7, 7, 7, 7))
376
Walter Dörwald58917a62006-03-31 15:26:22 +0000377 # A 30-day april starting on thursday (3+7+7+7+6 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000378 self.check_weeks(1909, 4, (3, 7, 7, 7, 6))
379
380 def test_december(self):
Walter Dörwald58917a62006-03-31 15:26:22 +0000381 # A 31-day december starting on sunday (7+7+7+7+3 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000382 self.check_weeks(2080, 12, (7, 7, 7, 7, 3))
383
Walter Dörwald58917a62006-03-31 15:26:22 +0000384 # A 31-day december starting on monday (6+7+7+7+4 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000385 self.check_weeks(1941, 12, (6, 7, 7, 7, 4))
386
Walter Dörwald58917a62006-03-31 15:26:22 +0000387 # A 31-day december starting on saturday (1+7+7+7+7+2 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000388 self.check_weeks(1923, 12, (1, 7, 7, 7, 7, 2))
389
Walter Dörwald58917a62006-03-31 15:26:22 +0000390 # A 31-day december starting on wednesday (4+7+7+7+6 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000391 self.check_weeks(1948, 12, (4, 7, 7, 7, 6))
392
Walter Dörwald58917a62006-03-31 15:26:22 +0000393 # A 31-day december starting on thursday (3+7+7+7+7 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000394 self.check_weeks(1927, 12, (3, 7, 7, 7, 7))
395
Walter Dörwald58917a62006-03-31 15:26:22 +0000396 # A 31-day december starting on friday (2+7+7+7+7+1 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000397 self.check_weeks(1995, 12, (2, 7, 7, 7, 7, 1))
398
399
Fred Draked077ca12001-12-12 05:38:08 +0000400def test_main():
Walter Dörwald59ad4562004-07-02 19:00:09 +0000401 test_support.run_unittest(
Walter Dörwald58917a62006-03-31 15:26:22 +0000402 OutputTestCase,
Walter Dörwald59ad4562004-07-02 19:00:09 +0000403 CalendarTestCase,
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000404 MondayTestCase,
405 SundayTestCase
Walter Dörwald59ad4562004-07-02 19:00:09 +0000406 )
407
Fred Draked077ca12001-12-12 05:38:08 +0000408
409if __name__ == "__main__":
410 test_main()