blob: 5d6549c6cd8fda222cb48437a508b05362dc9144 [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:
258 calendar.LocaleTextCalendar(locale='').formatmonthname(2010, 10, 10)
259 except locale.Error:
260 # cannot set the system default locale -- skip rest of test
261 return
262 calendar.LocaleHTMLCalendar(locale='').formatmonthname(2010, 10)
Georg Brandl79f096a2010-11-26 07:57:57 +0000263 new_october = calendar.TextCalendar().formatmonthname(2010, 10, 10)
264 self.assertEquals(old_october, new_october)
265
Ezio Melotticadff702012-09-21 17:26:35 +0300266 def test_itermonthdates(self):
267 # ensure itermonthdates doesn't overflow after datetime.MAXYEAR
268 # see #15421
269 list(calendar.Calendar().itermonthdates(datetime.MAXYEAR, 12))
270
Walter Dörwald59ad4562004-07-02 19:00:09 +0000271
272class MonthCalendarTestCase(unittest.TestCase):
273 def setUp(self):
274 self.oldfirstweekday = calendar.firstweekday()
275 calendar.setfirstweekday(self.firstweekday)
276
277 def tearDown(self):
278 calendar.setfirstweekday(self.oldfirstweekday)
279
280 def check_weeks(self, year, month, weeks):
281 cal = calendar.monthcalendar(year, month)
282 self.assertEqual(len(cal), len(weeks))
283 for i in xrange(len(weeks)):
284 self.assertEqual(weeks[i], sum(day != 0 for day in cal[i]))
285
286
287class MondayTestCase(MonthCalendarTestCase):
288 firstweekday = calendar.MONDAY
289
290 def test_february(self):
Walter Dörwald58917a62006-03-31 15:26:22 +0000291 # A 28-day february starting on monday (7+7+7+7 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000292 self.check_weeks(1999, 2, (7, 7, 7, 7))
293
Walter Dörwald58917a62006-03-31 15:26:22 +0000294 # A 28-day february starting on tuesday (6+7+7+7+1 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000295 self.check_weeks(2005, 2, (6, 7, 7, 7, 1))
296
Walter Dörwald58917a62006-03-31 15:26:22 +0000297 # A 28-day february starting on sunday (1+7+7+7+6 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000298 self.check_weeks(1987, 2, (1, 7, 7, 7, 6))
299
Walter Dörwald58917a62006-03-31 15:26:22 +0000300 # A 29-day february starting on monday (7+7+7+7+1 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000301 self.check_weeks(1988, 2, (7, 7, 7, 7, 1))
302
Walter Dörwald58917a62006-03-31 15:26:22 +0000303 # A 29-day february starting on tuesday (6+7+7+7+2 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000304 self.check_weeks(1972, 2, (6, 7, 7, 7, 2))
305
Walter Dörwald58917a62006-03-31 15:26:22 +0000306 # A 29-day february starting on sunday (1+7+7+7+7 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000307 self.check_weeks(2004, 2, (1, 7, 7, 7, 7))
308
309 def test_april(self):
Walter Dörwald58917a62006-03-31 15:26:22 +0000310 # A 30-day april starting on monday (7+7+7+7+2 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000311 self.check_weeks(1935, 4, (7, 7, 7, 7, 2))
312
Walter Dörwald58917a62006-03-31 15:26:22 +0000313 # A 30-day april starting on tuesday (6+7+7+7+3 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000314 self.check_weeks(1975, 4, (6, 7, 7, 7, 3))
315
Walter Dörwald58917a62006-03-31 15:26:22 +0000316 # A 30-day april starting on sunday (1+7+7+7+7+1 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000317 self.check_weeks(1945, 4, (1, 7, 7, 7, 7, 1))
318
Walter Dörwald58917a62006-03-31 15:26:22 +0000319 # A 30-day april starting on saturday (2+7+7+7+7 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000320 self.check_weeks(1995, 4, (2, 7, 7, 7, 7))
321
Walter Dörwald58917a62006-03-31 15:26:22 +0000322 # A 30-day april starting on friday (3+7+7+7+6 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000323 self.check_weeks(1994, 4, (3, 7, 7, 7, 6))
324
325 def test_december(self):
Walter Dörwald58917a62006-03-31 15:26:22 +0000326 # A 31-day december starting on monday (7+7+7+7+3 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000327 self.check_weeks(1980, 12, (7, 7, 7, 7, 3))
328
Walter Dörwald58917a62006-03-31 15:26:22 +0000329 # A 31-day december starting on tuesday (6+7+7+7+4 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000330 self.check_weeks(1987, 12, (6, 7, 7, 7, 4))
331
Walter Dörwald58917a62006-03-31 15:26:22 +0000332 # A 31-day december starting on sunday (1+7+7+7+7+2 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000333 self.check_weeks(1968, 12, (1, 7, 7, 7, 7, 2))
334
Walter Dörwald58917a62006-03-31 15:26:22 +0000335 # A 31-day december starting on thursday (4+7+7+7+6 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000336 self.check_weeks(1988, 12, (4, 7, 7, 7, 6))
337
Walter Dörwald58917a62006-03-31 15:26:22 +0000338 # A 31-day december starting on friday (3+7+7+7+7 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000339 self.check_weeks(2017, 12, (3, 7, 7, 7, 7))
340
Walter Dörwald58917a62006-03-31 15:26:22 +0000341 # A 31-day december starting on saturday (2+7+7+7+7+1 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000342 self.check_weeks(2068, 12, (2, 7, 7, 7, 7, 1))
343
344
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000345class SundayTestCase(MonthCalendarTestCase):
346 firstweekday = calendar.SUNDAY
347
348 def test_february(self):
Walter Dörwald58917a62006-03-31 15:26:22 +0000349 # A 28-day february starting on sunday (7+7+7+7 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000350 self.check_weeks(2009, 2, (7, 7, 7, 7))
351
Walter Dörwald58917a62006-03-31 15:26:22 +0000352 # A 28-day february starting on monday (6+7+7+7+1 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000353 self.check_weeks(1999, 2, (6, 7, 7, 7, 1))
354
Walter Dörwald58917a62006-03-31 15:26:22 +0000355 # A 28-day february starting on saturday (1+7+7+7+6 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000356 self.check_weeks(1997, 2, (1, 7, 7, 7, 6))
357
Walter Dörwald58917a62006-03-31 15:26:22 +0000358 # A 29-day february starting on sunday (7+7+7+7+1 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000359 self.check_weeks(2004, 2, (7, 7, 7, 7, 1))
360
Walter Dörwald58917a62006-03-31 15:26:22 +0000361 # A 29-day february starting on monday (6+7+7+7+2 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000362 self.check_weeks(1960, 2, (6, 7, 7, 7, 2))
363
Walter Dörwald58917a62006-03-31 15:26:22 +0000364 # A 29-day february starting on saturday (1+7+7+7+7 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000365 self.check_weeks(1964, 2, (1, 7, 7, 7, 7))
366
367 def test_april(self):
Walter Dörwald58917a62006-03-31 15:26:22 +0000368 # A 30-day april starting on sunday (7+7+7+7+2 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000369 self.check_weeks(1923, 4, (7, 7, 7, 7, 2))
370
Walter Dörwald58917a62006-03-31 15:26:22 +0000371 # A 30-day april starting on monday (6+7+7+7+3 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000372 self.check_weeks(1918, 4, (6, 7, 7, 7, 3))
373
Walter Dörwald58917a62006-03-31 15:26:22 +0000374 # A 30-day april starting on saturday (1+7+7+7+7+1 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000375 self.check_weeks(1950, 4, (1, 7, 7, 7, 7, 1))
376
Walter Dörwald58917a62006-03-31 15:26:22 +0000377 # A 30-day april starting on friday (2+7+7+7+7 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000378 self.check_weeks(1960, 4, (2, 7, 7, 7, 7))
379
Walter Dörwald58917a62006-03-31 15:26:22 +0000380 # A 30-day april starting on thursday (3+7+7+7+6 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000381 self.check_weeks(1909, 4, (3, 7, 7, 7, 6))
382
383 def test_december(self):
Walter Dörwald58917a62006-03-31 15:26:22 +0000384 # A 31-day december starting on sunday (7+7+7+7+3 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000385 self.check_weeks(2080, 12, (7, 7, 7, 7, 3))
386
Walter Dörwald58917a62006-03-31 15:26:22 +0000387 # A 31-day december starting on monday (6+7+7+7+4 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000388 self.check_weeks(1941, 12, (6, 7, 7, 7, 4))
389
Walter Dörwald58917a62006-03-31 15:26:22 +0000390 # A 31-day december starting on saturday (1+7+7+7+7+2 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000391 self.check_weeks(1923, 12, (1, 7, 7, 7, 7, 2))
392
Walter Dörwald58917a62006-03-31 15:26:22 +0000393 # A 31-day december starting on wednesday (4+7+7+7+6 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000394 self.check_weeks(1948, 12, (4, 7, 7, 7, 6))
395
Walter Dörwald58917a62006-03-31 15:26:22 +0000396 # A 31-day december starting on thursday (3+7+7+7+7 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000397 self.check_weeks(1927, 12, (3, 7, 7, 7, 7))
398
Walter Dörwald58917a62006-03-31 15:26:22 +0000399 # A 31-day december starting on friday (2+7+7+7+7+1 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000400 self.check_weeks(1995, 12, (2, 7, 7, 7, 7, 1))
401
402
R. David Murrayc45d7992010-12-31 19:31:48 +0000403class MonthRangeTestCase(unittest.TestCase):
404 def test_january(self):
405 # Tests valid lower boundary case.
406 self.assertEqual(calendar.monthrange(2004,1), (3,31))
407
408 def test_february_leap(self):
409 # Tests February during leap year.
410 self.assertEqual(calendar.monthrange(2004,2), (6,29))
411
412 def test_february_nonleap(self):
413 # Tests February in non-leap year.
414 self.assertEqual(calendar.monthrange(2010,2), (0,28))
415
416 def test_december(self):
417 # Tests valid upper boundary case.
418 self.assertEqual(calendar.monthrange(2004,12), (2,31))
419
420 def test_zeroth_month(self):
421 # Tests low invalid boundary case.
422 with self.assertRaises(calendar.IllegalMonthError):
423 calendar.monthrange(2004, 0)
424
425 def test_thirteenth_month(self):
426 # Tests high invalid boundary case.
427 with self.assertRaises(calendar.IllegalMonthError):
428 calendar.monthrange(2004, 13)
429
430class LeapdaysTestCase(unittest.TestCase):
431 def test_no_range(self):
432 # test when no range i.e. two identical years as args
433 self.assertEqual(calendar.leapdays(2010,2010), 0)
434
435 def test_no_leapdays(self):
436 # test when no leap years in range
437 self.assertEqual(calendar.leapdays(2010,2011), 0)
438
439 def test_no_leapdays_upper_boundary(self):
440 # test no leap years in range, when upper boundary is a leap year
441 self.assertEqual(calendar.leapdays(2010,2012), 0)
442
443 def test_one_leapday_lower_boundary(self):
444 # test when one leap year in range, lower boundary is leap year
445 self.assertEqual(calendar.leapdays(2012,2013), 1)
446
447 def test_several_leapyears_in_range(self):
448 self.assertEqual(calendar.leapdays(1997,2020), 5)
449
450
Fred Draked077ca12001-12-12 05:38:08 +0000451def test_main():
Walter Dörwald59ad4562004-07-02 19:00:09 +0000452 test_support.run_unittest(
Walter Dörwald58917a62006-03-31 15:26:22 +0000453 OutputTestCase,
Walter Dörwald59ad4562004-07-02 19:00:09 +0000454 CalendarTestCase,
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000455 MondayTestCase,
R. David Murrayc45d7992010-12-31 19:31:48 +0000456 SundayTestCase,
457 MonthRangeTestCase,
458 LeapdaysTestCase,
Walter Dörwald59ad4562004-07-02 19:00:09 +0000459 )
460
Fred Draked077ca12001-12-12 05:38:08 +0000461
462if __name__ == "__main__":
463 test_main()