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