blob: e0f63997d5fb5b1779f1d54155e48cadcfffc3f4 [file] [log] [blame]
Fred Draked077ca12001-12-12 05:38:08 +00001import calendar
2import unittest
3
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004from test import support
Senthil Kumaran962fed92011-08-11 09:22:52 +08005from test.script_helper import assert_python_ok
Alexander Belopolsky43ca7102010-06-14 17:32:03 +00006import time
Georg Brandl7004bd12010-10-19 18:54:25 +00007import locale
R David Murrayd0c86952012-05-29 12:55:05 -04008import sys
9
10result_2004_01_text = """
11 January 2004
12Mo Tu We Th Fr Sa Su
13 1 2 3 4
14 5 6 7 8 9 10 11
1512 13 14 15 16 17 18
1619 20 21 22 23 24 25
1726 27 28 29 30 31
18"""
Fred Draked077ca12001-12-12 05:38:08 +000019
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000020result_2004_text = """
21 2004
22
23 January February March
24Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
25 1 2 3 4 1 1 2 3 4 5 6 7
26 5 6 7 8 9 10 11 2 3 4 5 6 7 8 8 9 10 11 12 13 14
2712 13 14 15 16 17 18 9 10 11 12 13 14 15 15 16 17 18 19 20 21
2819 20 21 22 23 24 25 16 17 18 19 20 21 22 22 23 24 25 26 27 28
2926 27 28 29 30 31 23 24 25 26 27 28 29 29 30 31
30
31 April May June
32Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
33 1 2 3 4 1 2 1 2 3 4 5 6
34 5 6 7 8 9 10 11 3 4 5 6 7 8 9 7 8 9 10 11 12 13
3512 13 14 15 16 17 18 10 11 12 13 14 15 16 14 15 16 17 18 19 20
3619 20 21 22 23 24 25 17 18 19 20 21 22 23 21 22 23 24 25 26 27
3726 27 28 29 30 24 25 26 27 28 29 30 28 29 30
38 31
39
40 July August September
41Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
42 1 2 3 4 1 1 2 3 4 5
43 5 6 7 8 9 10 11 2 3 4 5 6 7 8 6 7 8 9 10 11 12
4412 13 14 15 16 17 18 9 10 11 12 13 14 15 13 14 15 16 17 18 19
4519 20 21 22 23 24 25 16 17 18 19 20 21 22 20 21 22 23 24 25 26
4626 27 28 29 30 31 23 24 25 26 27 28 29 27 28 29 30
47 30 31
48
49 October November December
50Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
51 1 2 3 1 2 3 4 5 6 7 1 2 3 4 5
52 4 5 6 7 8 9 10 8 9 10 11 12 13 14 6 7 8 9 10 11 12
5311 12 13 14 15 16 17 15 16 17 18 19 20 21 13 14 15 16 17 18 19
5418 19 20 21 22 23 24 22 23 24 25 26 27 28 20 21 22 23 24 25 26
5525 26 27 28 29 30 31 29 30 27 28 29 30 31
56"""
57
58result_2004_html = """
R David Murrayd0c86952012-05-29 12:55:05 -040059<?xml version="1.0" encoding="%(e)s"?>
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000060<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
61<html>
62<head>
R David Murrayd0c86952012-05-29 12:55:05 -040063<meta http-equiv="Content-Type" content="text/html; charset=%(e)s" />
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000064<link rel="stylesheet" type="text/css" href="calendar.css" />
Thomas Wouters47b49bf2007-08-30 22:15:33 +000065<title>Calendar for 2004</title>
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000066</head>
67<body>
68<table border="0" cellpadding="0" cellspacing="0" class="year">
69<tr><th colspan="3" class="year">2004</th></tr><tr><td><table border="0" cellpadding="0" cellspacing="0" class="month">
70<tr><th colspan="7" class="month">January</th></tr>
71<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>
72<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>
73<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>
74<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>
75<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>
76<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>
77</table>
78</td><td><table border="0" cellpadding="0" cellspacing="0" class="month">
79<tr><th colspan="7" class="month">February</th></tr>
80<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>
81<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>
82<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>
83<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>
84<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>
85<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>
86</table>
87</td><td><table border="0" cellpadding="0" cellspacing="0" class="month">
88<tr><th colspan="7" class="month">March</th></tr>
89<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>
90<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>
91<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>
92<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>
93<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>
94<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>
95</table>
96</td></tr><tr><td><table border="0" cellpadding="0" cellspacing="0" class="month">
97<tr><th colspan="7" class="month">April</th></tr>
98<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>
99<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>
100<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>
101<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>
102<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>
103<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>
104</table>
105</td><td><table border="0" cellpadding="0" cellspacing="0" class="month">
106<tr><th colspan="7" class="month">May</th></tr>
107<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>
108<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>
109<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>
110<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>
111<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>
112<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>
113<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>
114</table>
115</td><td><table border="0" cellpadding="0" cellspacing="0" class="month">
116<tr><th colspan="7" class="month">June</th></tr>
117<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>
118<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>
119<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>
120<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>
121<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>
122<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>
123</table>
124</td></tr><tr><td><table border="0" cellpadding="0" cellspacing="0" class="month">
125<tr><th colspan="7" class="month">July</th></tr>
126<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>
127<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>
128<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>
129<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>
130<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>
131<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>
132</table>
133</td><td><table border="0" cellpadding="0" cellspacing="0" class="month">
134<tr><th colspan="7" class="month">August</th></tr>
135<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>
136<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>
137<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>
138<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>
139<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>
140<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>
141<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>
142</table>
143</td><td><table border="0" cellpadding="0" cellspacing="0" class="month">
144<tr><th colspan="7" class="month">September</th></tr>
145<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>
146<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>
147<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>
148<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>
149<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>
150<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>
151</table>
152</td></tr><tr><td><table border="0" cellpadding="0" cellspacing="0" class="month">
153<tr><th colspan="7" class="month">October</th></tr>
154<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>
155<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>
156<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>
157<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>
158<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>
159<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>
160</table>
161</td><td><table border="0" cellpadding="0" cellspacing="0" class="month">
162<tr><th colspan="7" class="month">November</th></tr>
163<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>
164<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>
165<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>
166<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>
167<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>
168<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>
169</table>
170</td><td><table border="0" cellpadding="0" cellspacing="0" class="month">
171<tr><th colspan="7" class="month">December</th></tr>
172<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>
173<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>
174<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>
175<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>
176<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>
177<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>
178</table>
179</td></tr></table></body>
180</html>
181"""
182
R David Murrayd0c86952012-05-29 12:55:05 -0400183result_2004_days = [
184 [[[0, 0, 0, 1, 2, 3, 4],
185 [5, 6, 7, 8, 9, 10, 11],
186 [12, 13, 14, 15, 16, 17, 18],
187 [19, 20, 21, 22, 23, 24, 25],
188 [26, 27, 28, 29, 30, 31, 0]],
189 [[0, 0, 0, 0, 0, 0, 1],
190 [2, 3, 4, 5, 6, 7, 8],
191 [9, 10, 11, 12, 13, 14, 15],
192 [16, 17, 18, 19, 20, 21, 22],
193 [23, 24, 25, 26, 27, 28, 29]],
194 [[1, 2, 3, 4, 5, 6, 7],
195 [8, 9, 10, 11, 12, 13, 14],
196 [15, 16, 17, 18, 19, 20, 21],
197 [22, 23, 24, 25, 26, 27, 28],
198 [29, 30, 31, 0, 0, 0, 0]]],
199 [[[0, 0, 0, 1, 2, 3, 4],
200 [5, 6, 7, 8, 9, 10, 11],
201 [12, 13, 14, 15, 16, 17, 18],
202 [19, 20, 21, 22, 23, 24, 25],
203 [26, 27, 28, 29, 30, 0, 0]],
204 [[0, 0, 0, 0, 0, 1, 2],
205 [3, 4, 5, 6, 7, 8, 9],
206 [10, 11, 12, 13, 14, 15, 16],
207 [17, 18, 19, 20, 21, 22, 23],
208 [24, 25, 26, 27, 28, 29, 30],
209 [31, 0, 0, 0, 0, 0, 0]],
210 [[0, 1, 2, 3, 4, 5, 6],
211 [7, 8, 9, 10, 11, 12, 13],
212 [14, 15, 16, 17, 18, 19, 20],
213 [21, 22, 23, 24, 25, 26, 27],
214 [28, 29, 30, 0, 0, 0, 0]]],
215 [[[0, 0, 0, 1, 2, 3, 4],
216 [5, 6, 7, 8, 9, 10, 11],
217 [12, 13, 14, 15, 16, 17, 18],
218 [19, 20, 21, 22, 23, 24, 25],
219 [26, 27, 28, 29, 30, 31, 0]],
220 [[0, 0, 0, 0, 0, 0, 1],
221 [2, 3, 4, 5, 6, 7, 8],
222 [9, 10, 11, 12, 13, 14, 15],
223 [16, 17, 18, 19, 20, 21, 22],
224 [23, 24, 25, 26, 27, 28, 29],
225 [30, 31, 0, 0, 0, 0, 0]],
226 [[0, 0, 1, 2, 3, 4, 5],
227 [6, 7, 8, 9, 10, 11, 12],
228 [13, 14, 15, 16, 17, 18, 19],
229 [20, 21, 22, 23, 24, 25, 26],
230 [27, 28, 29, 30, 0, 0, 0]]],
231 [[[0, 0, 0, 0, 1, 2, 3],
232 [4, 5, 6, 7, 8, 9, 10],
233 [11, 12, 13, 14, 15, 16, 17],
234 [18, 19, 20, 21, 22, 23, 24],
235 [25, 26, 27, 28, 29, 30, 31]],
236 [[1, 2, 3, 4, 5, 6, 7],
237 [8, 9, 10, 11, 12, 13, 14],
238 [15, 16, 17, 18, 19, 20, 21],
239 [22, 23, 24, 25, 26, 27, 28],
240 [29, 30, 0, 0, 0, 0, 0]],
241 [[0, 0, 1, 2, 3, 4, 5],
242 [6, 7, 8, 9, 10, 11, 12],
243 [13, 14, 15, 16, 17, 18, 19],
244 [20, 21, 22, 23, 24, 25, 26],
245 [27, 28, 29, 30, 31, 0, 0]]]
246]
247
248result_2004_dates = \
249 [[['12/29/03 12/30/03 12/31/03 01/01/04 01/02/04 01/03/04 01/04/04',
250 '01/05/04 01/06/04 01/07/04 01/08/04 01/09/04 01/10/04 01/11/04',
251 '01/12/04 01/13/04 01/14/04 01/15/04 01/16/04 01/17/04 01/18/04',
252 '01/19/04 01/20/04 01/21/04 01/22/04 01/23/04 01/24/04 01/25/04',
253 '01/26/04 01/27/04 01/28/04 01/29/04 01/30/04 01/31/04 02/01/04'],
254 ['01/26/04 01/27/04 01/28/04 01/29/04 01/30/04 01/31/04 02/01/04',
255 '02/02/04 02/03/04 02/04/04 02/05/04 02/06/04 02/07/04 02/08/04',
256 '02/09/04 02/10/04 02/11/04 02/12/04 02/13/04 02/14/04 02/15/04',
257 '02/16/04 02/17/04 02/18/04 02/19/04 02/20/04 02/21/04 02/22/04',
258 '02/23/04 02/24/04 02/25/04 02/26/04 02/27/04 02/28/04 02/29/04'],
259 ['03/01/04 03/02/04 03/03/04 03/04/04 03/05/04 03/06/04 03/07/04',
260 '03/08/04 03/09/04 03/10/04 03/11/04 03/12/04 03/13/04 03/14/04',
261 '03/15/04 03/16/04 03/17/04 03/18/04 03/19/04 03/20/04 03/21/04',
262 '03/22/04 03/23/04 03/24/04 03/25/04 03/26/04 03/27/04 03/28/04',
263 '03/29/04 03/30/04 03/31/04 04/01/04 04/02/04 04/03/04 04/04/04']],
264 [['03/29/04 03/30/04 03/31/04 04/01/04 04/02/04 04/03/04 04/04/04',
265 '04/05/04 04/06/04 04/07/04 04/08/04 04/09/04 04/10/04 04/11/04',
266 '04/12/04 04/13/04 04/14/04 04/15/04 04/16/04 04/17/04 04/18/04',
267 '04/19/04 04/20/04 04/21/04 04/22/04 04/23/04 04/24/04 04/25/04',
268 '04/26/04 04/27/04 04/28/04 04/29/04 04/30/04 05/01/04 05/02/04'],
269 ['04/26/04 04/27/04 04/28/04 04/29/04 04/30/04 05/01/04 05/02/04',
270 '05/03/04 05/04/04 05/05/04 05/06/04 05/07/04 05/08/04 05/09/04',
271 '05/10/04 05/11/04 05/12/04 05/13/04 05/14/04 05/15/04 05/16/04',
272 '05/17/04 05/18/04 05/19/04 05/20/04 05/21/04 05/22/04 05/23/04',
273 '05/24/04 05/25/04 05/26/04 05/27/04 05/28/04 05/29/04 05/30/04',
274 '05/31/04 06/01/04 06/02/04 06/03/04 06/04/04 06/05/04 06/06/04'],
275 ['05/31/04 06/01/04 06/02/04 06/03/04 06/04/04 06/05/04 06/06/04',
276 '06/07/04 06/08/04 06/09/04 06/10/04 06/11/04 06/12/04 06/13/04',
277 '06/14/04 06/15/04 06/16/04 06/17/04 06/18/04 06/19/04 06/20/04',
278 '06/21/04 06/22/04 06/23/04 06/24/04 06/25/04 06/26/04 06/27/04',
279 '06/28/04 06/29/04 06/30/04 07/01/04 07/02/04 07/03/04 07/04/04']],
280 [['06/28/04 06/29/04 06/30/04 07/01/04 07/02/04 07/03/04 07/04/04',
281 '07/05/04 07/06/04 07/07/04 07/08/04 07/09/04 07/10/04 07/11/04',
282 '07/12/04 07/13/04 07/14/04 07/15/04 07/16/04 07/17/04 07/18/04',
283 '07/19/04 07/20/04 07/21/04 07/22/04 07/23/04 07/24/04 07/25/04',
284 '07/26/04 07/27/04 07/28/04 07/29/04 07/30/04 07/31/04 08/01/04'],
285 ['07/26/04 07/27/04 07/28/04 07/29/04 07/30/04 07/31/04 08/01/04',
286 '08/02/04 08/03/04 08/04/04 08/05/04 08/06/04 08/07/04 08/08/04',
287 '08/09/04 08/10/04 08/11/04 08/12/04 08/13/04 08/14/04 08/15/04',
288 '08/16/04 08/17/04 08/18/04 08/19/04 08/20/04 08/21/04 08/22/04',
289 '08/23/04 08/24/04 08/25/04 08/26/04 08/27/04 08/28/04 08/29/04',
290 '08/30/04 08/31/04 09/01/04 09/02/04 09/03/04 09/04/04 09/05/04'],
291 ['08/30/04 08/31/04 09/01/04 09/02/04 09/03/04 09/04/04 09/05/04',
292 '09/06/04 09/07/04 09/08/04 09/09/04 09/10/04 09/11/04 09/12/04',
293 '09/13/04 09/14/04 09/15/04 09/16/04 09/17/04 09/18/04 09/19/04',
294 '09/20/04 09/21/04 09/22/04 09/23/04 09/24/04 09/25/04 09/26/04',
295 '09/27/04 09/28/04 09/29/04 09/30/04 10/01/04 10/02/04 10/03/04']],
296 [['09/27/04 09/28/04 09/29/04 09/30/04 10/01/04 10/02/04 10/03/04',
297 '10/04/04 10/05/04 10/06/04 10/07/04 10/08/04 10/09/04 10/10/04',
298 '10/11/04 10/12/04 10/13/04 10/14/04 10/15/04 10/16/04 10/17/04',
299 '10/18/04 10/19/04 10/20/04 10/21/04 10/22/04 10/23/04 10/24/04',
300 '10/25/04 10/26/04 10/27/04 10/28/04 10/29/04 10/30/04 10/31/04'],
301 ['11/01/04 11/02/04 11/03/04 11/04/04 11/05/04 11/06/04 11/07/04',
302 '11/08/04 11/09/04 11/10/04 11/11/04 11/12/04 11/13/04 11/14/04',
303 '11/15/04 11/16/04 11/17/04 11/18/04 11/19/04 11/20/04 11/21/04',
304 '11/22/04 11/23/04 11/24/04 11/25/04 11/26/04 11/27/04 11/28/04',
305 '11/29/04 11/30/04 12/01/04 12/02/04 12/03/04 12/04/04 12/05/04'],
306 ['11/29/04 11/30/04 12/01/04 12/02/04 12/03/04 12/04/04 12/05/04',
307 '12/06/04 12/07/04 12/08/04 12/09/04 12/10/04 12/11/04 12/12/04',
308 '12/13/04 12/14/04 12/15/04 12/16/04 12/17/04 12/18/04 12/19/04',
309 '12/20/04 12/21/04 12/22/04 12/23/04 12/24/04 12/25/04 12/26/04',
310 '12/27/04 12/28/04 12/29/04 12/30/04 12/31/04 01/01/05 01/02/05']]]
311
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000312
313class OutputTestCase(unittest.TestCase):
314 def normalize_calendar(self, s):
Mark Dickinson934896d2009-02-21 20:59:32 +0000315 # Filters out locale dependent strings
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000316 def neitherspacenordigit(c):
317 return not c.isspace() and not c.isdigit()
318
319 lines = []
Ezio Melottid8b509b2011-09-28 17:37:55 +0300320 for line in s.splitlines(keepends=False):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000321 # Drop texts, as they are locale dependent
322 if line and not filter(neitherspacenordigit, line):
323 lines.append(line)
324 return lines
325
R David Murrayd0c86952012-05-29 12:55:05 -0400326 def check_htmlcalendar_encoding(self, req, res):
327 cal = calendar.HTMLCalendar()
328 self.assertEqual(
329 cal.formatyearpage(2004, encoding=req).strip(b' \t\n'),
330 (result_2004_html % {'e': res}).strip(' \t\n').encode(res)
331 )
332
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000333 def test_output(self):
334 self.assertEqual(
335 self.normalize_calendar(calendar.calendar(2004)),
336 self.normalize_calendar(result_2004_text)
337 )
338
339 def test_output_textcalendar(self):
340 self.assertEqual(
341 calendar.TextCalendar().formatyear(2004).strip(),
342 result_2004_text.strip()
343 )
344
R David Murrayd0c86952012-05-29 12:55:05 -0400345 def test_output_htmlcalendar_encoding_ascii(self):
346 self.check_htmlcalendar_encoding('ascii', 'ascii')
347
348 def test_output_htmlcalendar_encoding_utf8(self):
349 self.check_htmlcalendar_encoding('utf-8', 'utf-8')
350
351 def test_output_htmlcalendar_encoding_default(self):
352 self.check_htmlcalendar_encoding(None, sys.getdefaultencoding())
353
354 def test_yeardatescalendar(self):
355 def shrink(cal):
R David Murraybb756782012-05-30 08:10:54 -0400356 return [[[' '.join('{:02d}/{:02d}/{}'.format(
357 d.month, d.day, str(d.year)[-2:]) for d in z)
358 for z in y] for y in x] for x in cal]
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000359 self.assertEqual(
R David Murrayd0c86952012-05-29 12:55:05 -0400360 shrink(calendar.Calendar().yeardatescalendar(2004)),
361 result_2004_dates
362 )
363
364 def test_yeardayscalendar(self):
365 self.assertEqual(
366 calendar.Calendar().yeardayscalendar(2004),
367 result_2004_days
368 )
369
370 def test_formatweekheader_short(self):
371 self.assertEqual(
372 calendar.TextCalendar().formatweekheader(2),
373 'Mo Tu We Th Fr Sa Su'
374 )
375
376 def test_formatweekheader_long(self):
377 self.assertEqual(
378 calendar.TextCalendar().formatweekheader(9),
379 ' Monday Tuesday Wednesday Thursday '
380 ' Friday Saturday Sunday '
381 )
382
383 def test_formatmonth(self):
384 self.assertEqual(
385 calendar.TextCalendar().formatmonth(2004, 1).strip(),
386 result_2004_01_text.strip()
387 )
388
389 def test_formatmonthname_with_year(self):
390 self.assertEqual(
391 calendar.HTMLCalendar().formatmonthname(2004, 1, withyear=True),
392 '<tr><th colspan="7" class="month">January 2004</th></tr>'
393 )
394
395 def test_formatmonthname_without_year(self):
396 self.assertEqual(
397 calendar.HTMLCalendar().formatmonthname(2004, 1, withyear=False),
398 '<tr><th colspan="7" class="month">January</th></tr>'
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000399 )
400
401
Fred Draked077ca12001-12-12 05:38:08 +0000402class CalendarTestCase(unittest.TestCase):
403 def test_isleap(self):
404 # Make sure that the return is right for a few years, and
405 # ensure that the return values are 1 or 0, not just true or
406 # false (see SF bug #485794). Specific additional tests may
407 # be appropriate; this tests a single "cycle".
408 self.assertEqual(calendar.isleap(2000), 1)
409 self.assertEqual(calendar.isleap(2001), 0)
410 self.assertEqual(calendar.isleap(2002), 0)
411 self.assertEqual(calendar.isleap(2003), 0)
412
413 def test_setfirstweekday(self):
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000414 self.assertRaises(TypeError, calendar.setfirstweekday, 'flabber')
Fred Draked077ca12001-12-12 05:38:08 +0000415 self.assertRaises(ValueError, calendar.setfirstweekday, -1)
416 self.assertRaises(ValueError, calendar.setfirstweekday, 200)
417 orig = calendar.firstweekday()
418 calendar.setfirstweekday(calendar.SUNDAY)
419 self.assertEqual(calendar.firstweekday(), calendar.SUNDAY)
420 calendar.setfirstweekday(calendar.MONDAY)
421 self.assertEqual(calendar.firstweekday(), calendar.MONDAY)
422 calendar.setfirstweekday(orig)
423
R David Murrayd0c86952012-05-29 12:55:05 -0400424 def test_illegal_weekday_reported(self):
425 with self.assertRaisesRegex(calendar.IllegalWeekdayError, '123'):
426 calendar.setfirstweekday(123)
427
428 def test_enumerate_weekdays(self):
Skip Montanaro693c6c42002-03-15 03:57:04 +0000429 self.assertRaises(IndexError, calendar.day_abbr.__getitem__, -10)
430 self.assertRaises(IndexError, calendar.day_name.__getitem__, 10)
431 self.assertEqual(len([d for d in calendar.day_abbr]), 7)
Fred Draked077ca12001-12-12 05:38:08 +0000432
Tim Peters0c2c8e72002-03-23 03:26:53 +0000433 def test_days(self):
434 for attr in "day_name", "day_abbr":
435 value = getattr(calendar, attr)
436 self.assertEqual(len(value), 7)
437 self.assertEqual(len(value[:]), 7)
438 # ensure they're all unique
Tim Petersbbc0d442004-11-13 16:18:32 +0000439 self.assertEqual(len(set(value)), 7)
440 # verify it "acts like a sequence" in two forms of iteration
441 self.assertEqual(value[::-1], list(reversed(value)))
Tim Peters0c2c8e72002-03-23 03:26:53 +0000442
443 def test_months(self):
444 for attr in "month_name", "month_abbr":
445 value = getattr(calendar, attr)
446 self.assertEqual(len(value), 13)
447 self.assertEqual(len(value[:]), 13)
448 self.assertEqual(value[0], "")
449 # ensure they're all unique
Tim Petersbbc0d442004-11-13 16:18:32 +0000450 self.assertEqual(len(set(value)), 13)
451 # verify it "acts like a sequence" in two forms of iteration
452 self.assertEqual(value[::-1], list(reversed(value)))
Tim Peters0c2c8e72002-03-23 03:26:53 +0000453
R David Murrayd0c86952012-05-29 12:55:05 -0400454 def test_locale_calendars(self):
Georg Brandl7004bd12010-10-19 18:54:25 +0000455 # ensure that Locale{Text,HTML}Calendar resets the locale properly
456 # (it is still not thread-safe though)
Georg Brandl7004bd12010-10-19 18:54:25 +0000457 old_october = calendar.TextCalendar().formatmonthname(2010, 10, 10)
Georg Brandl9450cc02010-10-20 06:50:19 +0000458 try:
459 calendar.LocaleTextCalendar(locale='').formatmonthname(2010, 10, 10)
460 except locale.Error:
461 # cannot set the system default locale -- skip rest of test
462 return
463 calendar.LocaleHTMLCalendar(locale='').formatmonthname(2010, 10)
Georg Brandl7004bd12010-10-19 18:54:25 +0000464 new_october = calendar.TextCalendar().formatmonthname(2010, 10, 10)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000465 self.assertEqual(old_october, new_october)
Georg Brandl7004bd12010-10-19 18:54:25 +0000466
Walter Dörwald59ad4562004-07-02 19:00:09 +0000467
468class MonthCalendarTestCase(unittest.TestCase):
469 def setUp(self):
470 self.oldfirstweekday = calendar.firstweekday()
471 calendar.setfirstweekday(self.firstweekday)
472
473 def tearDown(self):
474 calendar.setfirstweekday(self.oldfirstweekday)
475
476 def check_weeks(self, year, month, weeks):
477 cal = calendar.monthcalendar(year, month)
478 self.assertEqual(len(cal), len(weeks))
Guido van Rossum805365e2007-05-07 22:24:25 +0000479 for i in range(len(weeks)):
Walter Dörwald59ad4562004-07-02 19:00:09 +0000480 self.assertEqual(weeks[i], sum(day != 0 for day in cal[i]))
481
482
483class MondayTestCase(MonthCalendarTestCase):
484 firstweekday = calendar.MONDAY
485
486 def test_february(self):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000487 # A 28-day february starting on monday (7+7+7+7 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000488 self.check_weeks(1999, 2, (7, 7, 7, 7))
489
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000490 # A 28-day february starting on tuesday (6+7+7+7+1 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000491 self.check_weeks(2005, 2, (6, 7, 7, 7, 1))
492
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000493 # A 28-day february starting on sunday (1+7+7+7+6 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000494 self.check_weeks(1987, 2, (1, 7, 7, 7, 6))
495
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000496 # A 29-day february starting on monday (7+7+7+7+1 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000497 self.check_weeks(1988, 2, (7, 7, 7, 7, 1))
498
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000499 # A 29-day february starting on tuesday (6+7+7+7+2 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000500 self.check_weeks(1972, 2, (6, 7, 7, 7, 2))
501
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000502 # A 29-day february starting on sunday (1+7+7+7+7 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000503 self.check_weeks(2004, 2, (1, 7, 7, 7, 7))
504
505 def test_april(self):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000506 # A 30-day april starting on monday (7+7+7+7+2 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000507 self.check_weeks(1935, 4, (7, 7, 7, 7, 2))
508
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000509 # A 30-day april starting on tuesday (6+7+7+7+3 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000510 self.check_weeks(1975, 4, (6, 7, 7, 7, 3))
511
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000512 # A 30-day april starting on sunday (1+7+7+7+7+1 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000513 self.check_weeks(1945, 4, (1, 7, 7, 7, 7, 1))
514
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000515 # A 30-day april starting on saturday (2+7+7+7+7 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000516 self.check_weeks(1995, 4, (2, 7, 7, 7, 7))
517
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000518 # A 30-day april starting on friday (3+7+7+7+6 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000519 self.check_weeks(1994, 4, (3, 7, 7, 7, 6))
520
521 def test_december(self):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000522 # A 31-day december starting on monday (7+7+7+7+3 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000523 self.check_weeks(1980, 12, (7, 7, 7, 7, 3))
524
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000525 # A 31-day december starting on tuesday (6+7+7+7+4 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000526 self.check_weeks(1987, 12, (6, 7, 7, 7, 4))
527
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000528 # A 31-day december starting on sunday (1+7+7+7+7+2 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000529 self.check_weeks(1968, 12, (1, 7, 7, 7, 7, 2))
530
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000531 # A 31-day december starting on thursday (4+7+7+7+6 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000532 self.check_weeks(1988, 12, (4, 7, 7, 7, 6))
533
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000534 # A 31-day december starting on friday (3+7+7+7+7 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000535 self.check_weeks(2017, 12, (3, 7, 7, 7, 7))
536
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000537 # A 31-day december starting on saturday (2+7+7+7+7+1 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000538 self.check_weeks(2068, 12, (2, 7, 7, 7, 7, 1))
539
540
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000541class SundayTestCase(MonthCalendarTestCase):
542 firstweekday = calendar.SUNDAY
543
544 def test_february(self):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000545 # A 28-day february starting on sunday (7+7+7+7 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000546 self.check_weeks(2009, 2, (7, 7, 7, 7))
547
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000548 # A 28-day february starting on monday (6+7+7+7+1 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000549 self.check_weeks(1999, 2, (6, 7, 7, 7, 1))
550
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000551 # A 28-day february starting on saturday (1+7+7+7+6 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000552 self.check_weeks(1997, 2, (1, 7, 7, 7, 6))
553
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000554 # A 29-day february starting on sunday (7+7+7+7+1 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000555 self.check_weeks(2004, 2, (7, 7, 7, 7, 1))
556
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000557 # A 29-day february starting on monday (6+7+7+7+2 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000558 self.check_weeks(1960, 2, (6, 7, 7, 7, 2))
559
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000560 # A 29-day february starting on saturday (1+7+7+7+7 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000561 self.check_weeks(1964, 2, (1, 7, 7, 7, 7))
562
563 def test_april(self):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000564 # A 30-day april starting on sunday (7+7+7+7+2 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000565 self.check_weeks(1923, 4, (7, 7, 7, 7, 2))
566
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000567 # A 30-day april starting on monday (6+7+7+7+3 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000568 self.check_weeks(1918, 4, (6, 7, 7, 7, 3))
569
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000570 # A 30-day april starting on saturday (1+7+7+7+7+1 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000571 self.check_weeks(1950, 4, (1, 7, 7, 7, 7, 1))
572
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000573 # A 30-day april starting on friday (2+7+7+7+7 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000574 self.check_weeks(1960, 4, (2, 7, 7, 7, 7))
575
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000576 # A 30-day april starting on thursday (3+7+7+7+6 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000577 self.check_weeks(1909, 4, (3, 7, 7, 7, 6))
578
579 def test_december(self):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000580 # A 31-day december starting on sunday (7+7+7+7+3 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000581 self.check_weeks(2080, 12, (7, 7, 7, 7, 3))
582
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000583 # A 31-day december starting on monday (6+7+7+7+4 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000584 self.check_weeks(1941, 12, (6, 7, 7, 7, 4))
585
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000586 # A 31-day december starting on saturday (1+7+7+7+7+2 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000587 self.check_weeks(1923, 12, (1, 7, 7, 7, 7, 2))
588
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000589 # A 31-day december starting on wednesday (4+7+7+7+6 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000590 self.check_weeks(1948, 12, (4, 7, 7, 7, 6))
591
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000592 # A 31-day december starting on thursday (3+7+7+7+7 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000593 self.check_weeks(1927, 12, (3, 7, 7, 7, 7))
594
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000595 # A 31-day december starting on friday (2+7+7+7+7+1 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000596 self.check_weeks(1995, 12, (2, 7, 7, 7, 7, 1))
597
Alexander Belopolsky43ca7102010-06-14 17:32:03 +0000598class TimegmTestCase(unittest.TestCase):
599 TIMESTAMPS = [0, 10, 100, 1000, 10000, 100000, 1000000,
600 1234567890, 1262304000, 1275785153,]
601 def test_timegm(self):
602 for secs in self.TIMESTAMPS:
603 tuple = time.gmtime(secs)
604 self.assertEqual(secs, calendar.timegm(tuple))
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000605
Brett Cannoncfae36f2010-07-23 13:54:14 +0000606class MonthRangeTestCase(unittest.TestCase):
607 def test_january(self):
608 # Tests valid lower boundary case.
609 self.assertEqual(calendar.monthrange(2004,1), (3,31))
610
611 def test_february_leap(self):
612 # Tests February during leap year.
613 self.assertEqual(calendar.monthrange(2004,2), (6,29))
614
615 def test_february_nonleap(self):
616 # Tests February in non-leap year.
617 self.assertEqual(calendar.monthrange(2010,2), (0,28))
618
619 def test_december(self):
620 # Tests valid upper boundary case.
621 self.assertEqual(calendar.monthrange(2004,12), (2,31))
622
623 def test_zeroth_month(self):
624 # Tests low invalid boundary case.
625 with self.assertRaises(calendar.IllegalMonthError):
626 calendar.monthrange(2004, 0)
627
628 def test_thirteenth_month(self):
629 # Tests high invalid boundary case.
630 with self.assertRaises(calendar.IllegalMonthError):
631 calendar.monthrange(2004, 13)
632
R David Murrayd0c86952012-05-29 12:55:05 -0400633 def test_illegal_month_reported(self):
634 with self.assertRaisesRegex(calendar.IllegalMonthError, '65'):
635 calendar.monthrange(2004, 65)
636
R. David Murray1daaf9e2010-12-31 19:21:14 +0000637class LeapdaysTestCase(unittest.TestCase):
638 def test_no_range(self):
639 # test when no range i.e. two identical years as args
640 self.assertEqual(calendar.leapdays(2010,2010), 0)
641
642 def test_no_leapdays(self):
643 # test when no leap years in range
644 self.assertEqual(calendar.leapdays(2010,2011), 0)
645
646 def test_no_leapdays_upper_boundary(self):
647 # test no leap years in range, when upper boundary is a leap year
648 self.assertEqual(calendar.leapdays(2010,2012), 0)
649
650 def test_one_leapday_lower_boundary(self):
651 # test when one leap year in range, lower boundary is leap year
652 self.assertEqual(calendar.leapdays(2012,2013), 1)
653
654 def test_several_leapyears_in_range(self):
655 self.assertEqual(calendar.leapdays(1997,2020), 5)
656
Brett Cannoncfae36f2010-07-23 13:54:14 +0000657
Senthil Kumaran962fed92011-08-11 09:22:52 +0800658class ConsoleOutputTestCase(unittest.TestCase):
659 def test_outputs_bytes(self):
660 (return_code, stdout, stderr) = assert_python_ok('-m', 'calendar', '--type=html', '2010')
661 self.assertEqual(stdout[:6], b'<?xml ')
662
Fred Draked077ca12001-12-12 05:38:08 +0000663def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000664 support.run_unittest(
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000665 OutputTestCase,
Walter Dörwald59ad4562004-07-02 19:00:09 +0000666 CalendarTestCase,
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000667 MondayTestCase,
Alexander Belopolsky43ca7102010-06-14 17:32:03 +0000668 SundayTestCase,
669 TimegmTestCase,
Brett Cannoncfae36f2010-07-23 13:54:14 +0000670 MonthRangeTestCase,
R. David Murray1daaf9e2010-12-31 19:21:14 +0000671 LeapdaysTestCase,
Senthil Kumaran962fed92011-08-11 09:22:52 +0800672 ConsoleOutputTestCase
Walter Dörwald59ad4562004-07-02 19:00:09 +0000673 )
674
Fred Draked077ca12001-12-12 05:38:08 +0000675
676if __name__ == "__main__":
677 test_main()