blob: 40fb76ddd61974e37f3eadfe6d47a0bbcf4e71f1 [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
Ezio Melotticadff702012-09-21 17:26:35 +03006import datetime
Fred Draked077ca12001-12-12 05:38:08 +00007
8
Walter Dörwaldbc966092006-04-12 10:09:16 +00009result_2004_text = """
Walter Dörwald58917a62006-03-31 15:26:22 +000010 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
Walter Dörwaldbc966092006-04-12 10:09:16 +000047result_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" />
Walter Dörwald6d20b702007-08-28 23:35:33 +000054<title>Calendar for 2004</title>
Walter Dörwaldbc966092006-04-12 10:09:16 +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
Walter Dörwald58917a62006-03-31 15:26:22 +0000172
173class OutputTestCase(unittest.TestCase):
174 def normalize_calendar(self, s):
Mark Dickinson3e4caeb2009-02-21 20:27:01 +0000175 # Filters out locale dependent strings
Walter Dörwald58917a62006-03-31 15:26:22 +0000176 def neitherspacenordigit(c):
177 return not c.isspace() and not c.isdigit()
178
179 lines = []
180 for line in s.splitlines(False):
181 # 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)),
Walter Dörwaldbc966092006-04-12 10:09:16 +0000189 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):
199 self.assertEqual(
200 calendar.HTMLCalendar().formatyearpage(2004).strip(),
201 result_2004_html.strip()
Walter Dörwald58917a62006-03-31 15:26:22 +0000202 )
203
204
Fred Draked077ca12001-12-12 05:38:08 +0000205class CalendarTestCase(unittest.TestCase):
206 def test_isleap(self):
207 # Make sure that the return is right for a few years, and
208 # ensure that the return values are 1 or 0, not just true or
209 # false (see SF bug #485794). Specific additional tests may
210 # be appropriate; this tests a single "cycle".
211 self.assertEqual(calendar.isleap(2000), 1)
212 self.assertEqual(calendar.isleap(2001), 0)
213 self.assertEqual(calendar.isleap(2002), 0)
214 self.assertEqual(calendar.isleap(2003), 0)
215
216 def test_setfirstweekday(self):
Florent Xicluna1f3b4e12010-03-07 12:14:25 +0000217 self.assertRaises(ValueError, calendar.setfirstweekday, 'flabber')
218 self.assertRaises(ValueError, calendar.setfirstweekday, -1)
219 self.assertRaises(ValueError, calendar.setfirstweekday, 200)
Fred Draked077ca12001-12-12 05:38:08 +0000220 orig = calendar.firstweekday()
221 calendar.setfirstweekday(calendar.SUNDAY)
222 self.assertEqual(calendar.firstweekday(), calendar.SUNDAY)
223 calendar.setfirstweekday(calendar.MONDAY)
224 self.assertEqual(calendar.firstweekday(), calendar.MONDAY)
225 calendar.setfirstweekday(orig)
226
Skip Montanaro693c6c42002-03-15 03:57:04 +0000227 def test_enumerateweekdays(self):
228 self.assertRaises(IndexError, calendar.day_abbr.__getitem__, -10)
229 self.assertRaises(IndexError, calendar.day_name.__getitem__, 10)
230 self.assertEqual(len([d for d in calendar.day_abbr]), 7)
Fred Draked077ca12001-12-12 05:38:08 +0000231
Tim Peters0c2c8e72002-03-23 03:26:53 +0000232 def test_days(self):
233 for attr in "day_name", "day_abbr":
234 value = getattr(calendar, attr)
235 self.assertEqual(len(value), 7)
236 self.assertEqual(len(value[:]), 7)
237 # ensure they're all unique
Tim Petersbbc0d442004-11-13 16:18:32 +0000238 self.assertEqual(len(set(value)), 7)
239 # verify it "acts like a sequence" in two forms of iteration
240 self.assertEqual(value[::-1], list(reversed(value)))
Tim Peters0c2c8e72002-03-23 03:26:53 +0000241
242 def test_months(self):
243 for attr in "month_name", "month_abbr":
244 value = getattr(calendar, attr)
245 self.assertEqual(len(value), 13)
246 self.assertEqual(len(value[:]), 13)
247 self.assertEqual(value[0], "")
248 # ensure they're all unique
Tim Petersbbc0d442004-11-13 16:18:32 +0000249 self.assertEqual(len(set(value)), 13)
250 # verify it "acts like a sequence" in two forms of iteration
251 self.assertEqual(value[::-1], list(reversed(value)))
Tim Peters0c2c8e72002-03-23 03:26:53 +0000252
Georg Brandl79f096a2010-11-26 07:57:57 +0000253 def test_localecalendars(self):
254 # ensure that Locale{Text,HTML}Calendar resets the locale properly
255 # (it is still not thread-safe though)
Georg Brandl79f096a2010-11-26 07:57:57 +0000256 old_october = calendar.TextCalendar().formatmonthname(2010, 10, 10)
Georg Brandl837fbb02010-11-26 07:58:55 +0000257 try:
Serhiy Storchaka8d510cd2013-01-31 15:57:51 +0200258 cal = calendar.LocaleTextCalendar(locale='')
259 local_weekday = cal.formatweekday(1, 10)
260 local_month = cal.formatmonthname(2010, 10, 10)
Georg Brandl837fbb02010-11-26 07:58:55 +0000261 except locale.Error:
262 # cannot set the system default locale -- skip rest of test
Serhiy Storchaka8d510cd2013-01-31 15:57:51 +0200263 raise unittest.SkipTest('cannot set the system default locale')
264 # should be encodable
265 local_weekday.encode('utf-8')
266 local_month.encode('utf-8')
267 self.assertEqual(len(local_weekday), 10)
268 self.assertGreaterEqual(len(local_month), 10)
269 cal = calendar.LocaleHTMLCalendar(locale='')
270 local_weekday = cal.formatweekday(1)
271 local_month = cal.formatmonthname(2010, 10)
272 # should be encodable
273 local_weekday.encode('utf-8')
274 local_month.encode('utf-8')
Georg Brandl79f096a2010-11-26 07:57:57 +0000275 new_october = calendar.TextCalendar().formatmonthname(2010, 10, 10)
Serhiy Storchaka88761452012-12-28 00:32:19 +0200276 self.assertEqual(old_october, new_october)
Georg Brandl79f096a2010-11-26 07:57:57 +0000277
Ezio Melotticadff702012-09-21 17:26:35 +0300278 def test_itermonthdates(self):
279 # ensure itermonthdates doesn't overflow after datetime.MAXYEAR
280 # see #15421
281 list(calendar.Calendar().itermonthdates(datetime.MAXYEAR, 12))
282
Walter Dörwald59ad4562004-07-02 19:00:09 +0000283
284class MonthCalendarTestCase(unittest.TestCase):
285 def setUp(self):
286 self.oldfirstweekday = calendar.firstweekday()
287 calendar.setfirstweekday(self.firstweekday)
288
289 def tearDown(self):
290 calendar.setfirstweekday(self.oldfirstweekday)
291
292 def check_weeks(self, year, month, weeks):
293 cal = calendar.monthcalendar(year, month)
294 self.assertEqual(len(cal), len(weeks))
295 for i in xrange(len(weeks)):
296 self.assertEqual(weeks[i], sum(day != 0 for day in cal[i]))
297
298
299class MondayTestCase(MonthCalendarTestCase):
300 firstweekday = calendar.MONDAY
301
302 def test_february(self):
Walter Dörwald58917a62006-03-31 15:26:22 +0000303 # A 28-day february starting on monday (7+7+7+7 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000304 self.check_weeks(1999, 2, (7, 7, 7, 7))
305
Walter Dörwald58917a62006-03-31 15:26:22 +0000306 # A 28-day february starting on tuesday (6+7+7+7+1 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000307 self.check_weeks(2005, 2, (6, 7, 7, 7, 1))
308
Walter Dörwald58917a62006-03-31 15:26:22 +0000309 # A 28-day february starting on sunday (1+7+7+7+6 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000310 self.check_weeks(1987, 2, (1, 7, 7, 7, 6))
311
Walter Dörwald58917a62006-03-31 15:26:22 +0000312 # A 29-day february starting on monday (7+7+7+7+1 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000313 self.check_weeks(1988, 2, (7, 7, 7, 7, 1))
314
Walter Dörwald58917a62006-03-31 15:26:22 +0000315 # A 29-day february starting on tuesday (6+7+7+7+2 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000316 self.check_weeks(1972, 2, (6, 7, 7, 7, 2))
317
Walter Dörwald58917a62006-03-31 15:26:22 +0000318 # A 29-day february starting on sunday (1+7+7+7+7 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000319 self.check_weeks(2004, 2, (1, 7, 7, 7, 7))
320
321 def test_april(self):
Walter Dörwald58917a62006-03-31 15:26:22 +0000322 # A 30-day april starting on monday (7+7+7+7+2 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000323 self.check_weeks(1935, 4, (7, 7, 7, 7, 2))
324
Walter Dörwald58917a62006-03-31 15:26:22 +0000325 # A 30-day april starting on tuesday (6+7+7+7+3 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000326 self.check_weeks(1975, 4, (6, 7, 7, 7, 3))
327
Walter Dörwald58917a62006-03-31 15:26:22 +0000328 # A 30-day april starting on sunday (1+7+7+7+7+1 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000329 self.check_weeks(1945, 4, (1, 7, 7, 7, 7, 1))
330
Walter Dörwald58917a62006-03-31 15:26:22 +0000331 # A 30-day april starting on saturday (2+7+7+7+7 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000332 self.check_weeks(1995, 4, (2, 7, 7, 7, 7))
333
Walter Dörwald58917a62006-03-31 15:26:22 +0000334 # A 30-day april starting on friday (3+7+7+7+6 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000335 self.check_weeks(1994, 4, (3, 7, 7, 7, 6))
336
337 def test_december(self):
Walter Dörwald58917a62006-03-31 15:26:22 +0000338 # A 31-day december starting on monday (7+7+7+7+3 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000339 self.check_weeks(1980, 12, (7, 7, 7, 7, 3))
340
Walter Dörwald58917a62006-03-31 15:26:22 +0000341 # A 31-day december starting on tuesday (6+7+7+7+4 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000342 self.check_weeks(1987, 12, (6, 7, 7, 7, 4))
343
Walter Dörwald58917a62006-03-31 15:26:22 +0000344 # A 31-day december starting on sunday (1+7+7+7+7+2 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000345 self.check_weeks(1968, 12, (1, 7, 7, 7, 7, 2))
346
Walter Dörwald58917a62006-03-31 15:26:22 +0000347 # A 31-day december starting on thursday (4+7+7+7+6 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000348 self.check_weeks(1988, 12, (4, 7, 7, 7, 6))
349
Walter Dörwald58917a62006-03-31 15:26:22 +0000350 # A 31-day december starting on friday (3+7+7+7+7 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000351 self.check_weeks(2017, 12, (3, 7, 7, 7, 7))
352
Walter Dörwald58917a62006-03-31 15:26:22 +0000353 # A 31-day december starting on saturday (2+7+7+7+7+1 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000354 self.check_weeks(2068, 12, (2, 7, 7, 7, 7, 1))
355
356
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000357class SundayTestCase(MonthCalendarTestCase):
358 firstweekday = calendar.SUNDAY
359
360 def test_february(self):
Walter Dörwald58917a62006-03-31 15:26:22 +0000361 # A 28-day february starting on sunday (7+7+7+7 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000362 self.check_weeks(2009, 2, (7, 7, 7, 7))
363
Walter Dörwald58917a62006-03-31 15:26:22 +0000364 # A 28-day february starting on monday (6+7+7+7+1 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000365 self.check_weeks(1999, 2, (6, 7, 7, 7, 1))
366
Walter Dörwald58917a62006-03-31 15:26:22 +0000367 # A 28-day february starting on saturday (1+7+7+7+6 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000368 self.check_weeks(1997, 2, (1, 7, 7, 7, 6))
369
Walter Dörwald58917a62006-03-31 15:26:22 +0000370 # A 29-day february starting on sunday (7+7+7+7+1 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000371 self.check_weeks(2004, 2, (7, 7, 7, 7, 1))
372
Walter Dörwald58917a62006-03-31 15:26:22 +0000373 # A 29-day february starting on monday (6+7+7+7+2 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000374 self.check_weeks(1960, 2, (6, 7, 7, 7, 2))
375
Walter Dörwald58917a62006-03-31 15:26:22 +0000376 # A 29-day february starting on saturday (1+7+7+7+7 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000377 self.check_weeks(1964, 2, (1, 7, 7, 7, 7))
378
379 def test_april(self):
Walter Dörwald58917a62006-03-31 15:26:22 +0000380 # A 30-day april starting on sunday (7+7+7+7+2 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000381 self.check_weeks(1923, 4, (7, 7, 7, 7, 2))
382
Walter Dörwald58917a62006-03-31 15:26:22 +0000383 # A 30-day april starting on monday (6+7+7+7+3 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000384 self.check_weeks(1918, 4, (6, 7, 7, 7, 3))
385
Walter Dörwald58917a62006-03-31 15:26:22 +0000386 # A 30-day april starting on saturday (1+7+7+7+7+1 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000387 self.check_weeks(1950, 4, (1, 7, 7, 7, 7, 1))
388
Walter Dörwald58917a62006-03-31 15:26:22 +0000389 # A 30-day april starting on friday (2+7+7+7+7 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000390 self.check_weeks(1960, 4, (2, 7, 7, 7, 7))
391
Walter Dörwald58917a62006-03-31 15:26:22 +0000392 # A 30-day april starting on thursday (3+7+7+7+6 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000393 self.check_weeks(1909, 4, (3, 7, 7, 7, 6))
394
395 def test_december(self):
Walter Dörwald58917a62006-03-31 15:26:22 +0000396 # A 31-day december starting on sunday (7+7+7+7+3 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000397 self.check_weeks(2080, 12, (7, 7, 7, 7, 3))
398
Walter Dörwald58917a62006-03-31 15:26:22 +0000399 # A 31-day december starting on monday (6+7+7+7+4 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000400 self.check_weeks(1941, 12, (6, 7, 7, 7, 4))
401
Walter Dörwald58917a62006-03-31 15:26:22 +0000402 # A 31-day december starting on saturday (1+7+7+7+7+2 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000403 self.check_weeks(1923, 12, (1, 7, 7, 7, 7, 2))
404
Walter Dörwald58917a62006-03-31 15:26:22 +0000405 # A 31-day december starting on wednesday (4+7+7+7+6 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000406 self.check_weeks(1948, 12, (4, 7, 7, 7, 6))
407
Walter Dörwald58917a62006-03-31 15:26:22 +0000408 # A 31-day december starting on thursday (3+7+7+7+7 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000409 self.check_weeks(1927, 12, (3, 7, 7, 7, 7))
410
Walter Dörwald58917a62006-03-31 15:26:22 +0000411 # A 31-day december starting on friday (2+7+7+7+7+1 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000412 self.check_weeks(1995, 12, (2, 7, 7, 7, 7, 1))
413
414
R. David Murrayc45d7992010-12-31 19:31:48 +0000415class MonthRangeTestCase(unittest.TestCase):
416 def test_january(self):
417 # Tests valid lower boundary case.
418 self.assertEqual(calendar.monthrange(2004,1), (3,31))
419
420 def test_february_leap(self):
421 # Tests February during leap year.
422 self.assertEqual(calendar.monthrange(2004,2), (6,29))
423
424 def test_february_nonleap(self):
425 # Tests February in non-leap year.
426 self.assertEqual(calendar.monthrange(2010,2), (0,28))
427
428 def test_december(self):
429 # Tests valid upper boundary case.
430 self.assertEqual(calendar.monthrange(2004,12), (2,31))
431
432 def test_zeroth_month(self):
433 # Tests low invalid boundary case.
434 with self.assertRaises(calendar.IllegalMonthError):
435 calendar.monthrange(2004, 0)
436
437 def test_thirteenth_month(self):
438 # Tests high invalid boundary case.
439 with self.assertRaises(calendar.IllegalMonthError):
440 calendar.monthrange(2004, 13)
441
442class LeapdaysTestCase(unittest.TestCase):
443 def test_no_range(self):
444 # test when no range i.e. two identical years as args
445 self.assertEqual(calendar.leapdays(2010,2010), 0)
446
447 def test_no_leapdays(self):
448 # test when no leap years in range
449 self.assertEqual(calendar.leapdays(2010,2011), 0)
450
451 def test_no_leapdays_upper_boundary(self):
452 # test no leap years in range, when upper boundary is a leap year
453 self.assertEqual(calendar.leapdays(2010,2012), 0)
454
455 def test_one_leapday_lower_boundary(self):
456 # test when one leap year in range, lower boundary is leap year
457 self.assertEqual(calendar.leapdays(2012,2013), 1)
458
459 def test_several_leapyears_in_range(self):
460 self.assertEqual(calendar.leapdays(1997,2020), 5)
461
462
Fred Draked077ca12001-12-12 05:38:08 +0000463def test_main():
Walter Dörwald59ad4562004-07-02 19:00:09 +0000464 test_support.run_unittest(
Walter Dörwald58917a62006-03-31 15:26:22 +0000465 OutputTestCase,
Walter Dörwald59ad4562004-07-02 19:00:09 +0000466 CalendarTestCase,
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000467 MondayTestCase,
R. David Murrayc45d7992010-12-31 19:31:48 +0000468 SundayTestCase,
469 MonthRangeTestCase,
470 LeapdaysTestCase,
Walter Dörwald59ad4562004-07-02 19:00:09 +0000471 )
472
Fred Draked077ca12001-12-12 05:38:08 +0000473
474if __name__ == "__main__":
475 test_main()