blob: f906bc39bd60e927a6f5ab1351e56c935957dddc [file] [log] [blame]
Fred Draked077ca12001-12-12 05:38:08 +00001import calendar
2import unittest
3
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004from test import support
Alexander Belopolsky43ca7102010-06-14 17:32:03 +00005import time
Georg Brandl7004bd12010-10-19 18:54:25 +00006import locale
Fred Draked077ca12001-12-12 05:38:08 +00007
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00008result_2004_text = """
9 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
46result_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" />
Thomas Wouters47b49bf2007-08-30 22:15:33 +000053<title>Calendar for 2004</title>
Thomas Wouters49fd7fa2006-04-21 10:40:58 +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
171
172class OutputTestCase(unittest.TestCase):
173 def normalize_calendar(self, s):
Mark Dickinson934896d2009-02-21 20:59:32 +0000174 # Filters out locale dependent strings
Thomas Wouters49fd7fa2006-04-21 10:40:58 +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)),
188 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):
Walter Dörwaldc49ebc02007-05-22 17:03:39 +0000198 encoding = 'ascii'
199 cal = calendar.HTMLCalendar()
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000200 self.assertEqual(
Walter Dörwaldc49ebc02007-05-22 17:03:39 +0000201 cal.formatyearpage(2004, encoding=encoding).strip(b' \t\n'),
202 result_2004_html.strip(' \t\n').encode(encoding)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000203 )
204
205
Fred Draked077ca12001-12-12 05:38:08 +0000206class CalendarTestCase(unittest.TestCase):
207 def test_isleap(self):
208 # Make sure that the return is right for a few years, and
209 # ensure that the return values are 1 or 0, not just true or
210 # false (see SF bug #485794). Specific additional tests may
211 # be appropriate; this tests a single "cycle".
212 self.assertEqual(calendar.isleap(2000), 1)
213 self.assertEqual(calendar.isleap(2001), 0)
214 self.assertEqual(calendar.isleap(2002), 0)
215 self.assertEqual(calendar.isleap(2003), 0)
216
217 def test_setfirstweekday(self):
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000218 self.assertRaises(TypeError, calendar.setfirstweekday, 'flabber')
Fred Draked077ca12001-12-12 05:38:08 +0000219 self.assertRaises(ValueError, calendar.setfirstweekday, -1)
220 self.assertRaises(ValueError, calendar.setfirstweekday, 200)
221 orig = calendar.firstweekday()
222 calendar.setfirstweekday(calendar.SUNDAY)
223 self.assertEqual(calendar.firstweekday(), calendar.SUNDAY)
224 calendar.setfirstweekday(calendar.MONDAY)
225 self.assertEqual(calendar.firstweekday(), calendar.MONDAY)
226 calendar.setfirstweekday(orig)
227
Skip Montanaro693c6c42002-03-15 03:57:04 +0000228 def test_enumerateweekdays(self):
229 self.assertRaises(IndexError, calendar.day_abbr.__getitem__, -10)
230 self.assertRaises(IndexError, calendar.day_name.__getitem__, 10)
231 self.assertEqual(len([d for d in calendar.day_abbr]), 7)
Fred Draked077ca12001-12-12 05:38:08 +0000232
Tim Peters0c2c8e72002-03-23 03:26:53 +0000233 def test_days(self):
234 for attr in "day_name", "day_abbr":
235 value = getattr(calendar, attr)
236 self.assertEqual(len(value), 7)
237 self.assertEqual(len(value[:]), 7)
238 # ensure they're all unique
Tim Petersbbc0d442004-11-13 16:18:32 +0000239 self.assertEqual(len(set(value)), 7)
240 # verify it "acts like a sequence" in two forms of iteration
241 self.assertEqual(value[::-1], list(reversed(value)))
Tim Peters0c2c8e72002-03-23 03:26:53 +0000242
243 def test_months(self):
244 for attr in "month_name", "month_abbr":
245 value = getattr(calendar, attr)
246 self.assertEqual(len(value), 13)
247 self.assertEqual(len(value[:]), 13)
248 self.assertEqual(value[0], "")
249 # ensure they're all unique
Tim Petersbbc0d442004-11-13 16:18:32 +0000250 self.assertEqual(len(set(value)), 13)
251 # verify it "acts like a sequence" in two forms of iteration
252 self.assertEqual(value[::-1], list(reversed(value)))
Tim Peters0c2c8e72002-03-23 03:26:53 +0000253
Georg Brandl7004bd12010-10-19 18:54:25 +0000254 def test_localecalendars(self):
255 # ensure that Locale{Text,HTML}Calendar resets the locale properly
256 # (it is still not thread-safe though)
257 try:
258 def_locale = locale.getdefaultlocale()
259 except locale.Error:
260 # cannot determine a default locale -- skip test
261 return
262 old_october = calendar.TextCalendar().formatmonthname(2010, 10, 10)
263 calendar.LocaleTextCalendar(
264 locale=def_locale).formatmonthname(2010, 10, 10)
265 calendar.LocaleHTMLCalendar(
266 locale=def_locale).formatmonthname(2010, 10)
267 new_october = calendar.TextCalendar().formatmonthname(2010, 10, 10)
268 self.assertEquals(old_october, new_october)
269
Walter Dörwald59ad4562004-07-02 19:00:09 +0000270
271class MonthCalendarTestCase(unittest.TestCase):
272 def setUp(self):
273 self.oldfirstweekday = calendar.firstweekday()
274 calendar.setfirstweekday(self.firstweekday)
275
276 def tearDown(self):
277 calendar.setfirstweekday(self.oldfirstweekday)
278
279 def check_weeks(self, year, month, weeks):
280 cal = calendar.monthcalendar(year, month)
281 self.assertEqual(len(cal), len(weeks))
Guido van Rossum805365e2007-05-07 22:24:25 +0000282 for i in range(len(weeks)):
Walter Dörwald59ad4562004-07-02 19:00:09 +0000283 self.assertEqual(weeks[i], sum(day != 0 for day in cal[i]))
284
285
286class MondayTestCase(MonthCalendarTestCase):
287 firstweekday = calendar.MONDAY
288
289 def test_february(self):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000290 # A 28-day february starting on monday (7+7+7+7 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000291 self.check_weeks(1999, 2, (7, 7, 7, 7))
292
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000293 # A 28-day february starting on tuesday (6+7+7+7+1 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000294 self.check_weeks(2005, 2, (6, 7, 7, 7, 1))
295
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000296 # A 28-day february starting on sunday (1+7+7+7+6 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000297 self.check_weeks(1987, 2, (1, 7, 7, 7, 6))
298
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000299 # A 29-day february starting on monday (7+7+7+7+1 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000300 self.check_weeks(1988, 2, (7, 7, 7, 7, 1))
301
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000302 # A 29-day february starting on tuesday (6+7+7+7+2 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000303 self.check_weeks(1972, 2, (6, 7, 7, 7, 2))
304
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000305 # A 29-day february starting on sunday (1+7+7+7+7 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000306 self.check_weeks(2004, 2, (1, 7, 7, 7, 7))
307
308 def test_april(self):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000309 # A 30-day april starting on monday (7+7+7+7+2 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000310 self.check_weeks(1935, 4, (7, 7, 7, 7, 2))
311
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000312 # A 30-day april starting on tuesday (6+7+7+7+3 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000313 self.check_weeks(1975, 4, (6, 7, 7, 7, 3))
314
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000315 # A 30-day april starting on sunday (1+7+7+7+7+1 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000316 self.check_weeks(1945, 4, (1, 7, 7, 7, 7, 1))
317
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000318 # A 30-day april starting on saturday (2+7+7+7+7 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000319 self.check_weeks(1995, 4, (2, 7, 7, 7, 7))
320
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000321 # A 30-day april starting on friday (3+7+7+7+6 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000322 self.check_weeks(1994, 4, (3, 7, 7, 7, 6))
323
324 def test_december(self):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000325 # A 31-day december starting on monday (7+7+7+7+3 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000326 self.check_weeks(1980, 12, (7, 7, 7, 7, 3))
327
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000328 # A 31-day december starting on tuesday (6+7+7+7+4 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000329 self.check_weeks(1987, 12, (6, 7, 7, 7, 4))
330
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000331 # A 31-day december starting on sunday (1+7+7+7+7+2 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000332 self.check_weeks(1968, 12, (1, 7, 7, 7, 7, 2))
333
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000334 # A 31-day december starting on thursday (4+7+7+7+6 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000335 self.check_weeks(1988, 12, (4, 7, 7, 7, 6))
336
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000337 # A 31-day december starting on friday (3+7+7+7+7 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000338 self.check_weeks(2017, 12, (3, 7, 7, 7, 7))
339
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000340 # A 31-day december starting on saturday (2+7+7+7+7+1 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000341 self.check_weeks(2068, 12, (2, 7, 7, 7, 7, 1))
342
343
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000344class SundayTestCase(MonthCalendarTestCase):
345 firstweekday = calendar.SUNDAY
346
347 def test_february(self):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000348 # A 28-day february starting on sunday (7+7+7+7 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000349 self.check_weeks(2009, 2, (7, 7, 7, 7))
350
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000351 # A 28-day february starting on monday (6+7+7+7+1 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000352 self.check_weeks(1999, 2, (6, 7, 7, 7, 1))
353
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000354 # A 28-day february starting on saturday (1+7+7+7+6 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000355 self.check_weeks(1997, 2, (1, 7, 7, 7, 6))
356
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000357 # A 29-day february starting on sunday (7+7+7+7+1 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000358 self.check_weeks(2004, 2, (7, 7, 7, 7, 1))
359
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000360 # A 29-day february starting on monday (6+7+7+7+2 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000361 self.check_weeks(1960, 2, (6, 7, 7, 7, 2))
362
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000363 # A 29-day february starting on saturday (1+7+7+7+7 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000364 self.check_weeks(1964, 2, (1, 7, 7, 7, 7))
365
366 def test_april(self):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000367 # A 30-day april starting on sunday (7+7+7+7+2 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000368 self.check_weeks(1923, 4, (7, 7, 7, 7, 2))
369
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000370 # A 30-day april starting on monday (6+7+7+7+3 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000371 self.check_weeks(1918, 4, (6, 7, 7, 7, 3))
372
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000373 # A 30-day april starting on saturday (1+7+7+7+7+1 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000374 self.check_weeks(1950, 4, (1, 7, 7, 7, 7, 1))
375
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000376 # A 30-day april starting on friday (2+7+7+7+7 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000377 self.check_weeks(1960, 4, (2, 7, 7, 7, 7))
378
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000379 # A 30-day april starting on thursday (3+7+7+7+6 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000380 self.check_weeks(1909, 4, (3, 7, 7, 7, 6))
381
382 def test_december(self):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000383 # A 31-day december starting on sunday (7+7+7+7+3 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000384 self.check_weeks(2080, 12, (7, 7, 7, 7, 3))
385
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000386 # A 31-day december starting on monday (6+7+7+7+4 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000387 self.check_weeks(1941, 12, (6, 7, 7, 7, 4))
388
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000389 # A 31-day december starting on saturday (1+7+7+7+7+2 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000390 self.check_weeks(1923, 12, (1, 7, 7, 7, 7, 2))
391
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000392 # A 31-day december starting on wednesday (4+7+7+7+6 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000393 self.check_weeks(1948, 12, (4, 7, 7, 7, 6))
394
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000395 # A 31-day december starting on thursday (3+7+7+7+7 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000396 self.check_weeks(1927, 12, (3, 7, 7, 7, 7))
397
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000398 # A 31-day december starting on friday (2+7+7+7+7+1 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000399 self.check_weeks(1995, 12, (2, 7, 7, 7, 7, 1))
400
Alexander Belopolsky43ca7102010-06-14 17:32:03 +0000401class TimegmTestCase(unittest.TestCase):
402 TIMESTAMPS = [0, 10, 100, 1000, 10000, 100000, 1000000,
403 1234567890, 1262304000, 1275785153,]
404 def test_timegm(self):
405 for secs in self.TIMESTAMPS:
406 tuple = time.gmtime(secs)
407 self.assertEqual(secs, calendar.timegm(tuple))
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000408
Brett Cannoncfae36f2010-07-23 13:54:14 +0000409class MonthRangeTestCase(unittest.TestCase):
410 def test_january(self):
411 # Tests valid lower boundary case.
412 self.assertEqual(calendar.monthrange(2004,1), (3,31))
413
414 def test_february_leap(self):
415 # Tests February during leap year.
416 self.assertEqual(calendar.monthrange(2004,2), (6,29))
417
418 def test_february_nonleap(self):
419 # Tests February in non-leap year.
420 self.assertEqual(calendar.monthrange(2010,2), (0,28))
421
422 def test_december(self):
423 # Tests valid upper boundary case.
424 self.assertEqual(calendar.monthrange(2004,12), (2,31))
425
426 def test_zeroth_month(self):
427 # Tests low invalid boundary case.
428 with self.assertRaises(calendar.IllegalMonthError):
429 calendar.monthrange(2004, 0)
430
431 def test_thirteenth_month(self):
432 # Tests high invalid boundary case.
433 with self.assertRaises(calendar.IllegalMonthError):
434 calendar.monthrange(2004, 13)
435
436
Fred Draked077ca12001-12-12 05:38:08 +0000437def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000438 support.run_unittest(
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000439 OutputTestCase,
Walter Dörwald59ad4562004-07-02 19:00:09 +0000440 CalendarTestCase,
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000441 MondayTestCase,
Alexander Belopolsky43ca7102010-06-14 17:32:03 +0000442 SundayTestCase,
443 TimegmTestCase,
Brett Cannoncfae36f2010-07-23 13:54:14 +0000444 MonthRangeTestCase,
Walter Dörwald59ad4562004-07-02 19:00:09 +0000445 )
446
Fred Draked077ca12001-12-12 05:38:08 +0000447
448if __name__ == "__main__":
449 test_main()