blob: 7180afe7663b403dd552ebe8d8ba3dcc13edbfd2 [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
Senthil Kumaran962fed92011-08-11 09:22:52 +08005from test.script_helper import assert_python_ok
Alexander Belopolsky43ca7102010-06-14 17:32:03 +00006import time
Georg Brandl7004bd12010-10-19 18:54:25 +00007import locale
Fred Draked077ca12001-12-12 05:38:08 +00008
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00009result_2004_text = """
10 2004
11
12 January February March
13Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
14 1 2 3 4 1 1 2 3 4 5 6 7
15 5 6 7 8 9 10 11 2 3 4 5 6 7 8 8 9 10 11 12 13 14
1612 13 14 15 16 17 18 9 10 11 12 13 14 15 15 16 17 18 19 20 21
1719 20 21 22 23 24 25 16 17 18 19 20 21 22 22 23 24 25 26 27 28
1826 27 28 29 30 31 23 24 25 26 27 28 29 29 30 31
19
20 April May June
21Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
22 1 2 3 4 1 2 1 2 3 4 5 6
23 5 6 7 8 9 10 11 3 4 5 6 7 8 9 7 8 9 10 11 12 13
2412 13 14 15 16 17 18 10 11 12 13 14 15 16 14 15 16 17 18 19 20
2519 20 21 22 23 24 25 17 18 19 20 21 22 23 21 22 23 24 25 26 27
2626 27 28 29 30 24 25 26 27 28 29 30 28 29 30
27 31
28
29 July August September
30Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
31 1 2 3 4 1 1 2 3 4 5
32 5 6 7 8 9 10 11 2 3 4 5 6 7 8 6 7 8 9 10 11 12
3312 13 14 15 16 17 18 9 10 11 12 13 14 15 13 14 15 16 17 18 19
3419 20 21 22 23 24 25 16 17 18 19 20 21 22 20 21 22 23 24 25 26
3526 27 28 29 30 31 23 24 25 26 27 28 29 27 28 29 30
36 30 31
37
38 October November December
39Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
40 1 2 3 1 2 3 4 5 6 7 1 2 3 4 5
41 4 5 6 7 8 9 10 8 9 10 11 12 13 14 6 7 8 9 10 11 12
4211 12 13 14 15 16 17 15 16 17 18 19 20 21 13 14 15 16 17 18 19
4318 19 20 21 22 23 24 22 23 24 25 26 27 28 20 21 22 23 24 25 26
4425 26 27 28 29 30 31 29 30 27 28 29 30 31
45"""
46
47result_2004_html = """
48<?xml version="1.0" encoding="ascii"?>
49<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
50<html>
51<head>
52<meta http-equiv="Content-Type" content="text/html; charset=ascii" />
53<link rel="stylesheet" type="text/css" href="calendar.css" />
Thomas Wouters47b49bf2007-08-30 22:15:33 +000054<title>Calendar for 2004</title>
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000055</head>
56<body>
57<table border="0" cellpadding="0" cellspacing="0" class="year">
58<tr><th colspan="3" class="year">2004</th></tr><tr><td><table border="0" cellpadding="0" cellspacing="0" class="month">
59<tr><th colspan="7" class="month">January</th></tr>
60<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>
61<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>
62<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>
63<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>
64<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>
65<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>
66</table>
67</td><td><table border="0" cellpadding="0" cellspacing="0" class="month">
68<tr><th colspan="7" class="month">February</th></tr>
69<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>
70<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>
71<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>
72<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>
73<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>
74<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>
75</table>
76</td><td><table border="0" cellpadding="0" cellspacing="0" class="month">
77<tr><th colspan="7" class="month">March</th></tr>
78<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>
79<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>
80<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>
81<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>
82<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>
83<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>
84</table>
85</td></tr><tr><td><table border="0" cellpadding="0" cellspacing="0" class="month">
86<tr><th colspan="7" class="month">April</th></tr>
87<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>
88<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>
89<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>
90<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>
91<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>
92<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>
93</table>
94</td><td><table border="0" cellpadding="0" cellspacing="0" class="month">
95<tr><th colspan="7" class="month">May</th></tr>
96<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>
97<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>
98<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>
99<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>
100<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>
101<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>
102<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>
103</table>
104</td><td><table border="0" cellpadding="0" cellspacing="0" class="month">
105<tr><th colspan="7" class="month">June</th></tr>
106<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>
107<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>
108<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>
109<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>
110<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>
111<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>
112</table>
113</td></tr><tr><td><table border="0" cellpadding="0" cellspacing="0" class="month">
114<tr><th colspan="7" class="month">July</th></tr>
115<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>
116<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>
117<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>
118<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>
119<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>
120<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>
121</table>
122</td><td><table border="0" cellpadding="0" cellspacing="0" class="month">
123<tr><th colspan="7" class="month">August</th></tr>
124<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>
125<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>
126<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>
127<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>
128<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>
129<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>
130<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>
131</table>
132</td><td><table border="0" cellpadding="0" cellspacing="0" class="month">
133<tr><th colspan="7" class="month">September</th></tr>
134<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>
135<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>
136<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>
137<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>
138<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>
139<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>
140</table>
141</td></tr><tr><td><table border="0" cellpadding="0" cellspacing="0" class="month">
142<tr><th colspan="7" class="month">October</th></tr>
143<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>
144<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>
145<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>
146<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>
147<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>
148<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>
149</table>
150</td><td><table border="0" cellpadding="0" cellspacing="0" class="month">
151<tr><th colspan="7" class="month">November</th></tr>
152<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>
153<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>
154<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>
155<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>
156<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>
157<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>
158</table>
159</td><td><table border="0" cellpadding="0" cellspacing="0" class="month">
160<tr><th colspan="7" class="month">December</th></tr>
161<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>
162<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>
163<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>
164<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>
165<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>
166<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>
167</table>
168</td></tr></table></body>
169</html>
170"""
171
172
173class OutputTestCase(unittest.TestCase):
174 def normalize_calendar(self, s):
Mark Dickinson934896d2009-02-21 20:59:32 +0000175 # Filters out locale dependent strings
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000176 def neitherspacenordigit(c):
177 return not c.isspace() and not c.isdigit()
178
179 lines = []
Ezio Melottid8b509b2011-09-28 17:37:55 +0300180 for line in s.splitlines(keepends=False):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000181 # Drop texts, as they are locale dependent
182 if line and not filter(neitherspacenordigit, line):
183 lines.append(line)
184 return lines
185
186 def test_output(self):
187 self.assertEqual(
188 self.normalize_calendar(calendar.calendar(2004)),
189 self.normalize_calendar(result_2004_text)
190 )
191
192 def test_output_textcalendar(self):
193 self.assertEqual(
194 calendar.TextCalendar().formatyear(2004).strip(),
195 result_2004_text.strip()
196 )
197
198 def test_output_htmlcalendar(self):
Walter Dörwaldc49ebc02007-05-22 17:03:39 +0000199 encoding = 'ascii'
200 cal = calendar.HTMLCalendar()
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000201 self.assertEqual(
Walter Dörwaldc49ebc02007-05-22 17:03:39 +0000202 cal.formatyearpage(2004, encoding=encoding).strip(b' \t\n'),
203 result_2004_html.strip(' \t\n').encode(encoding)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000204 )
205
206
Fred Draked077ca12001-12-12 05:38:08 +0000207class CalendarTestCase(unittest.TestCase):
208 def test_isleap(self):
209 # Make sure that the return is right for a few years, and
210 # ensure that the return values are 1 or 0, not just true or
211 # false (see SF bug #485794). Specific additional tests may
212 # be appropriate; this tests a single "cycle".
213 self.assertEqual(calendar.isleap(2000), 1)
214 self.assertEqual(calendar.isleap(2001), 0)
215 self.assertEqual(calendar.isleap(2002), 0)
216 self.assertEqual(calendar.isleap(2003), 0)
217
218 def test_setfirstweekday(self):
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000219 self.assertRaises(TypeError, calendar.setfirstweekday, 'flabber')
Fred Draked077ca12001-12-12 05:38:08 +0000220 self.assertRaises(ValueError, calendar.setfirstweekday, -1)
221 self.assertRaises(ValueError, calendar.setfirstweekday, 200)
222 orig = calendar.firstweekday()
223 calendar.setfirstweekday(calendar.SUNDAY)
224 self.assertEqual(calendar.firstweekday(), calendar.SUNDAY)
225 calendar.setfirstweekday(calendar.MONDAY)
226 self.assertEqual(calendar.firstweekday(), calendar.MONDAY)
227 calendar.setfirstweekday(orig)
228
Skip Montanaro693c6c42002-03-15 03:57:04 +0000229 def test_enumerateweekdays(self):
230 self.assertRaises(IndexError, calendar.day_abbr.__getitem__, -10)
231 self.assertRaises(IndexError, calendar.day_name.__getitem__, 10)
232 self.assertEqual(len([d for d in calendar.day_abbr]), 7)
Fred Draked077ca12001-12-12 05:38:08 +0000233
Tim Peters0c2c8e72002-03-23 03:26:53 +0000234 def test_days(self):
235 for attr in "day_name", "day_abbr":
236 value = getattr(calendar, attr)
237 self.assertEqual(len(value), 7)
238 self.assertEqual(len(value[:]), 7)
239 # ensure they're all unique
Tim Petersbbc0d442004-11-13 16:18:32 +0000240 self.assertEqual(len(set(value)), 7)
241 # verify it "acts like a sequence" in two forms of iteration
242 self.assertEqual(value[::-1], list(reversed(value)))
Tim Peters0c2c8e72002-03-23 03:26:53 +0000243
244 def test_months(self):
245 for attr in "month_name", "month_abbr":
246 value = getattr(calendar, attr)
247 self.assertEqual(len(value), 13)
248 self.assertEqual(len(value[:]), 13)
249 self.assertEqual(value[0], "")
250 # ensure they're all unique
Tim Petersbbc0d442004-11-13 16:18:32 +0000251 self.assertEqual(len(set(value)), 13)
252 # verify it "acts like a sequence" in two forms of iteration
253 self.assertEqual(value[::-1], list(reversed(value)))
Tim Peters0c2c8e72002-03-23 03:26:53 +0000254
Georg Brandl7004bd12010-10-19 18:54:25 +0000255 def test_localecalendars(self):
256 # ensure that Locale{Text,HTML}Calendar resets the locale properly
257 # (it is still not thread-safe though)
Georg Brandl7004bd12010-10-19 18:54:25 +0000258 old_october = calendar.TextCalendar().formatmonthname(2010, 10, 10)
Georg Brandl9450cc02010-10-20 06:50:19 +0000259 try:
260 calendar.LocaleTextCalendar(locale='').formatmonthname(2010, 10, 10)
261 except locale.Error:
262 # cannot set the system default locale -- skip rest of test
263 return
264 calendar.LocaleHTMLCalendar(locale='').formatmonthname(2010, 10)
Georg Brandl7004bd12010-10-19 18:54:25 +0000265 new_october = calendar.TextCalendar().formatmonthname(2010, 10, 10)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000266 self.assertEqual(old_october, new_october)
Georg Brandl7004bd12010-10-19 18:54:25 +0000267
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))
Guido van Rossum805365e2007-05-07 22:24:25 +0000280 for i in range(len(weeks)):
Walter Dörwald59ad4562004-07-02 19:00:09 +0000281 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):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +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
Thomas Wouters49fd7fa2006-04-21 10:40:58 +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
Thomas Wouters49fd7fa2006-04-21 10:40:58 +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
Thomas Wouters49fd7fa2006-04-21 10:40:58 +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
Thomas Wouters49fd7fa2006-04-21 10:40:58 +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
Thomas Wouters49fd7fa2006-04-21 10:40:58 +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):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +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
Thomas Wouters49fd7fa2006-04-21 10:40:58 +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
Thomas Wouters49fd7fa2006-04-21 10:40:58 +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
Thomas Wouters49fd7fa2006-04-21 10:40:58 +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
Thomas Wouters49fd7fa2006-04-21 10:40:58 +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):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +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
Thomas Wouters49fd7fa2006-04-21 10:40:58 +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
Thomas Wouters49fd7fa2006-04-21 10:40:58 +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
Thomas Wouters49fd7fa2006-04-21 10:40:58 +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
Thomas Wouters49fd7fa2006-04-21 10:40:58 +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
Thomas Wouters49fd7fa2006-04-21 10:40:58 +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):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +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
Thomas Wouters49fd7fa2006-04-21 10:40:58 +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
Thomas Wouters49fd7fa2006-04-21 10:40:58 +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
Thomas Wouters49fd7fa2006-04-21 10:40:58 +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
Thomas Wouters49fd7fa2006-04-21 10:40:58 +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
Thomas Wouters49fd7fa2006-04-21 10:40:58 +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):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +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
Thomas Wouters49fd7fa2006-04-21 10:40:58 +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
Thomas Wouters49fd7fa2006-04-21 10:40:58 +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
Thomas Wouters49fd7fa2006-04-21 10:40:58 +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
Thomas Wouters49fd7fa2006-04-21 10:40:58 +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):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +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
Thomas Wouters49fd7fa2006-04-21 10:40:58 +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
Thomas Wouters49fd7fa2006-04-21 10:40:58 +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
Thomas Wouters49fd7fa2006-04-21 10:40:58 +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
Thomas Wouters49fd7fa2006-04-21 10:40:58 +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
Thomas Wouters49fd7fa2006-04-21 10:40:58 +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
Alexander Belopolsky43ca7102010-06-14 17:32:03 +0000399class TimegmTestCase(unittest.TestCase):
400 TIMESTAMPS = [0, 10, 100, 1000, 10000, 100000, 1000000,
401 1234567890, 1262304000, 1275785153,]
402 def test_timegm(self):
403 for secs in self.TIMESTAMPS:
404 tuple = time.gmtime(secs)
405 self.assertEqual(secs, calendar.timegm(tuple))
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000406
Brett Cannoncfae36f2010-07-23 13:54:14 +0000407class MonthRangeTestCase(unittest.TestCase):
408 def test_january(self):
409 # Tests valid lower boundary case.
410 self.assertEqual(calendar.monthrange(2004,1), (3,31))
411
412 def test_february_leap(self):
413 # Tests February during leap year.
414 self.assertEqual(calendar.monthrange(2004,2), (6,29))
415
416 def test_february_nonleap(self):
417 # Tests February in non-leap year.
418 self.assertEqual(calendar.monthrange(2010,2), (0,28))
419
420 def test_december(self):
421 # Tests valid upper boundary case.
422 self.assertEqual(calendar.monthrange(2004,12), (2,31))
423
424 def test_zeroth_month(self):
425 # Tests low invalid boundary case.
426 with self.assertRaises(calendar.IllegalMonthError):
427 calendar.monthrange(2004, 0)
428
429 def test_thirteenth_month(self):
430 # Tests high invalid boundary case.
431 with self.assertRaises(calendar.IllegalMonthError):
432 calendar.monthrange(2004, 13)
433
R. David Murray1daaf9e2010-12-31 19:21:14 +0000434class LeapdaysTestCase(unittest.TestCase):
435 def test_no_range(self):
436 # test when no range i.e. two identical years as args
437 self.assertEqual(calendar.leapdays(2010,2010), 0)
438
439 def test_no_leapdays(self):
440 # test when no leap years in range
441 self.assertEqual(calendar.leapdays(2010,2011), 0)
442
443 def test_no_leapdays_upper_boundary(self):
444 # test no leap years in range, when upper boundary is a leap year
445 self.assertEqual(calendar.leapdays(2010,2012), 0)
446
447 def test_one_leapday_lower_boundary(self):
448 # test when one leap year in range, lower boundary is leap year
449 self.assertEqual(calendar.leapdays(2012,2013), 1)
450
451 def test_several_leapyears_in_range(self):
452 self.assertEqual(calendar.leapdays(1997,2020), 5)
453
Brett Cannoncfae36f2010-07-23 13:54:14 +0000454
Senthil Kumaran962fed92011-08-11 09:22:52 +0800455class ConsoleOutputTestCase(unittest.TestCase):
456 def test_outputs_bytes(self):
457 (return_code, stdout, stderr) = assert_python_ok('-m', 'calendar', '--type=html', '2010')
458 self.assertEqual(stdout[:6], b'<?xml ')
459
Fred Draked077ca12001-12-12 05:38:08 +0000460def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000461 support.run_unittest(
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000462 OutputTestCase,
Walter Dörwald59ad4562004-07-02 19:00:09 +0000463 CalendarTestCase,
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000464 MondayTestCase,
Alexander Belopolsky43ca7102010-06-14 17:32:03 +0000465 SundayTestCase,
466 TimegmTestCase,
Brett Cannoncfae36f2010-07-23 13:54:14 +0000467 MonthRangeTestCase,
R. David Murray1daaf9e2010-12-31 19:21:14 +0000468 LeapdaysTestCase,
Senthil Kumaran962fed92011-08-11 09:22:52 +0800469 ConsoleOutputTestCase
Walter Dörwald59ad4562004-07-02 19:00:09 +0000470 )
471
Fred Draked077ca12001-12-12 05:38:08 +0000472
473if __name__ == "__main__":
474 test_main()