blob: 8adf5bd14bc0ccad8ae89e08aa21ad89b20b845f [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
Ezio Melotti85710a42012-09-21 17:26:35 +03009import datetime
R David Murrayd0c86952012-05-29 12:55:05 -040010
11result_2004_01_text = """
12 January 2004
13Mo Tu We Th Fr Sa Su
14 1 2 3 4
15 5 6 7 8 9 10 11
1612 13 14 15 16 17 18
1719 20 21 22 23 24 25
1826 27 28 29 30 31
19"""
Fred Draked077ca12001-12-12 05:38:08 +000020
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000021result_2004_text = """
22 2004
23
24 January February March
25Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
26 1 2 3 4 1 1 2 3 4 5 6 7
27 5 6 7 8 9 10 11 2 3 4 5 6 7 8 8 9 10 11 12 13 14
2812 13 14 15 16 17 18 9 10 11 12 13 14 15 15 16 17 18 19 20 21
2919 20 21 22 23 24 25 16 17 18 19 20 21 22 22 23 24 25 26 27 28
3026 27 28 29 30 31 23 24 25 26 27 28 29 29 30 31
31
32 April May June
33Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
34 1 2 3 4 1 2 1 2 3 4 5 6
35 5 6 7 8 9 10 11 3 4 5 6 7 8 9 7 8 9 10 11 12 13
3612 13 14 15 16 17 18 10 11 12 13 14 15 16 14 15 16 17 18 19 20
3719 20 21 22 23 24 25 17 18 19 20 21 22 23 21 22 23 24 25 26 27
3826 27 28 29 30 24 25 26 27 28 29 30 28 29 30
39 31
40
41 July August September
42Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
43 1 2 3 4 1 1 2 3 4 5
44 5 6 7 8 9 10 11 2 3 4 5 6 7 8 6 7 8 9 10 11 12
4512 13 14 15 16 17 18 9 10 11 12 13 14 15 13 14 15 16 17 18 19
4619 20 21 22 23 24 25 16 17 18 19 20 21 22 20 21 22 23 24 25 26
4726 27 28 29 30 31 23 24 25 26 27 28 29 27 28 29 30
48 30 31
49
50 October November December
51Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
52 1 2 3 1 2 3 4 5 6 7 1 2 3 4 5
53 4 5 6 7 8 9 10 8 9 10 11 12 13 14 6 7 8 9 10 11 12
5411 12 13 14 15 16 17 15 16 17 18 19 20 21 13 14 15 16 17 18 19
5518 19 20 21 22 23 24 22 23 24 25 26 27 28 20 21 22 23 24 25 26
5625 26 27 28 29 30 31 29 30 27 28 29 30 31
57"""
58
59result_2004_html = """
R David Murrayd0c86952012-05-29 12:55:05 -040060<?xml version="1.0" encoding="%(e)s"?>
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000061<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
62<html>
63<head>
R David Murrayd0c86952012-05-29 12:55:05 -040064<meta http-equiv="Content-Type" content="text/html; charset=%(e)s" />
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000065<link rel="stylesheet" type="text/css" href="calendar.css" />
Thomas Wouters47b49bf2007-08-30 22:15:33 +000066<title>Calendar for 2004</title>
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000067</head>
68<body>
69<table border="0" cellpadding="0" cellspacing="0" class="year">
70<tr><th colspan="3" class="year">2004</th></tr><tr><td><table border="0" cellpadding="0" cellspacing="0" class="month">
71<tr><th colspan="7" class="month">January</th></tr>
72<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>
73<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>
74<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>
75<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>
76<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>
77<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>
78</table>
79</td><td><table border="0" cellpadding="0" cellspacing="0" class="month">
80<tr><th colspan="7" class="month">February</th></tr>
81<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>
82<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>
83<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>
84<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>
85<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>
86<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>
87</table>
88</td><td><table border="0" cellpadding="0" cellspacing="0" class="month">
89<tr><th colspan="7" class="month">March</th></tr>
90<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>
91<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>
92<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>
93<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>
94<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>
95<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>
96</table>
97</td></tr><tr><td><table border="0" cellpadding="0" cellspacing="0" class="month">
98<tr><th colspan="7" class="month">April</th></tr>
99<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>
100<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>
101<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>
102<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>
103<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>
104<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>
105</table>
106</td><td><table border="0" cellpadding="0" cellspacing="0" class="month">
107<tr><th colspan="7" class="month">May</th></tr>
108<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>
109<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>
110<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>
111<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>
112<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>
113<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>
114<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>
115</table>
116</td><td><table border="0" cellpadding="0" cellspacing="0" class="month">
117<tr><th colspan="7" class="month">June</th></tr>
118<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>
119<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>
120<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>
121<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>
122<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>
123<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>
124</table>
125</td></tr><tr><td><table border="0" cellpadding="0" cellspacing="0" class="month">
126<tr><th colspan="7" class="month">July</th></tr>
127<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>
128<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>
129<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>
130<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>
131<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>
132<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>
133</table>
134</td><td><table border="0" cellpadding="0" cellspacing="0" class="month">
135<tr><th colspan="7" class="month">August</th></tr>
136<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>
137<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>
138<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>
139<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>
140<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>
141<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>
142<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>
143</table>
144</td><td><table border="0" cellpadding="0" cellspacing="0" class="month">
145<tr><th colspan="7" class="month">September</th></tr>
146<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>
147<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>
148<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>
149<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>
150<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>
151<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>
152</table>
153</td></tr><tr><td><table border="0" cellpadding="0" cellspacing="0" class="month">
154<tr><th colspan="7" class="month">October</th></tr>
155<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>
156<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>
157<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>
158<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>
159<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>
160<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>
161</table>
162</td><td><table border="0" cellpadding="0" cellspacing="0" class="month">
163<tr><th colspan="7" class="month">November</th></tr>
164<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>
165<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>
166<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>
167<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>
168<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>
169<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>
170</table>
171</td><td><table border="0" cellpadding="0" cellspacing="0" class="month">
172<tr><th colspan="7" class="month">December</th></tr>
173<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>
174<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>
175<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>
176<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>
177<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>
178<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>
179</table>
180</td></tr></table></body>
181</html>
182"""
183
R David Murrayd0c86952012-05-29 12:55:05 -0400184result_2004_days = [
185 [[[0, 0, 0, 1, 2, 3, 4],
186 [5, 6, 7, 8, 9, 10, 11],
187 [12, 13, 14, 15, 16, 17, 18],
188 [19, 20, 21, 22, 23, 24, 25],
189 [26, 27, 28, 29, 30, 31, 0]],
190 [[0, 0, 0, 0, 0, 0, 1],
191 [2, 3, 4, 5, 6, 7, 8],
192 [9, 10, 11, 12, 13, 14, 15],
193 [16, 17, 18, 19, 20, 21, 22],
194 [23, 24, 25, 26, 27, 28, 29]],
195 [[1, 2, 3, 4, 5, 6, 7],
196 [8, 9, 10, 11, 12, 13, 14],
197 [15, 16, 17, 18, 19, 20, 21],
198 [22, 23, 24, 25, 26, 27, 28],
199 [29, 30, 31, 0, 0, 0, 0]]],
200 [[[0, 0, 0, 1, 2, 3, 4],
201 [5, 6, 7, 8, 9, 10, 11],
202 [12, 13, 14, 15, 16, 17, 18],
203 [19, 20, 21, 22, 23, 24, 25],
204 [26, 27, 28, 29, 30, 0, 0]],
205 [[0, 0, 0, 0, 0, 1, 2],
206 [3, 4, 5, 6, 7, 8, 9],
207 [10, 11, 12, 13, 14, 15, 16],
208 [17, 18, 19, 20, 21, 22, 23],
209 [24, 25, 26, 27, 28, 29, 30],
210 [31, 0, 0, 0, 0, 0, 0]],
211 [[0, 1, 2, 3, 4, 5, 6],
212 [7, 8, 9, 10, 11, 12, 13],
213 [14, 15, 16, 17, 18, 19, 20],
214 [21, 22, 23, 24, 25, 26, 27],
215 [28, 29, 30, 0, 0, 0, 0]]],
216 [[[0, 0, 0, 1, 2, 3, 4],
217 [5, 6, 7, 8, 9, 10, 11],
218 [12, 13, 14, 15, 16, 17, 18],
219 [19, 20, 21, 22, 23, 24, 25],
220 [26, 27, 28, 29, 30, 31, 0]],
221 [[0, 0, 0, 0, 0, 0, 1],
222 [2, 3, 4, 5, 6, 7, 8],
223 [9, 10, 11, 12, 13, 14, 15],
224 [16, 17, 18, 19, 20, 21, 22],
225 [23, 24, 25, 26, 27, 28, 29],
226 [30, 31, 0, 0, 0, 0, 0]],
227 [[0, 0, 1, 2, 3, 4, 5],
228 [6, 7, 8, 9, 10, 11, 12],
229 [13, 14, 15, 16, 17, 18, 19],
230 [20, 21, 22, 23, 24, 25, 26],
231 [27, 28, 29, 30, 0, 0, 0]]],
232 [[[0, 0, 0, 0, 1, 2, 3],
233 [4, 5, 6, 7, 8, 9, 10],
234 [11, 12, 13, 14, 15, 16, 17],
235 [18, 19, 20, 21, 22, 23, 24],
236 [25, 26, 27, 28, 29, 30, 31]],
237 [[1, 2, 3, 4, 5, 6, 7],
238 [8, 9, 10, 11, 12, 13, 14],
239 [15, 16, 17, 18, 19, 20, 21],
240 [22, 23, 24, 25, 26, 27, 28],
241 [29, 30, 0, 0, 0, 0, 0]],
242 [[0, 0, 1, 2, 3, 4, 5],
243 [6, 7, 8, 9, 10, 11, 12],
244 [13, 14, 15, 16, 17, 18, 19],
245 [20, 21, 22, 23, 24, 25, 26],
246 [27, 28, 29, 30, 31, 0, 0]]]
247]
248
249result_2004_dates = \
250 [[['12/29/03 12/30/03 12/31/03 01/01/04 01/02/04 01/03/04 01/04/04',
251 '01/05/04 01/06/04 01/07/04 01/08/04 01/09/04 01/10/04 01/11/04',
252 '01/12/04 01/13/04 01/14/04 01/15/04 01/16/04 01/17/04 01/18/04',
253 '01/19/04 01/20/04 01/21/04 01/22/04 01/23/04 01/24/04 01/25/04',
254 '01/26/04 01/27/04 01/28/04 01/29/04 01/30/04 01/31/04 02/01/04'],
255 ['01/26/04 01/27/04 01/28/04 01/29/04 01/30/04 01/31/04 02/01/04',
256 '02/02/04 02/03/04 02/04/04 02/05/04 02/06/04 02/07/04 02/08/04',
257 '02/09/04 02/10/04 02/11/04 02/12/04 02/13/04 02/14/04 02/15/04',
258 '02/16/04 02/17/04 02/18/04 02/19/04 02/20/04 02/21/04 02/22/04',
259 '02/23/04 02/24/04 02/25/04 02/26/04 02/27/04 02/28/04 02/29/04'],
260 ['03/01/04 03/02/04 03/03/04 03/04/04 03/05/04 03/06/04 03/07/04',
261 '03/08/04 03/09/04 03/10/04 03/11/04 03/12/04 03/13/04 03/14/04',
262 '03/15/04 03/16/04 03/17/04 03/18/04 03/19/04 03/20/04 03/21/04',
263 '03/22/04 03/23/04 03/24/04 03/25/04 03/26/04 03/27/04 03/28/04',
264 '03/29/04 03/30/04 03/31/04 04/01/04 04/02/04 04/03/04 04/04/04']],
265 [['03/29/04 03/30/04 03/31/04 04/01/04 04/02/04 04/03/04 04/04/04',
266 '04/05/04 04/06/04 04/07/04 04/08/04 04/09/04 04/10/04 04/11/04',
267 '04/12/04 04/13/04 04/14/04 04/15/04 04/16/04 04/17/04 04/18/04',
268 '04/19/04 04/20/04 04/21/04 04/22/04 04/23/04 04/24/04 04/25/04',
269 '04/26/04 04/27/04 04/28/04 04/29/04 04/30/04 05/01/04 05/02/04'],
270 ['04/26/04 04/27/04 04/28/04 04/29/04 04/30/04 05/01/04 05/02/04',
271 '05/03/04 05/04/04 05/05/04 05/06/04 05/07/04 05/08/04 05/09/04',
272 '05/10/04 05/11/04 05/12/04 05/13/04 05/14/04 05/15/04 05/16/04',
273 '05/17/04 05/18/04 05/19/04 05/20/04 05/21/04 05/22/04 05/23/04',
274 '05/24/04 05/25/04 05/26/04 05/27/04 05/28/04 05/29/04 05/30/04',
275 '05/31/04 06/01/04 06/02/04 06/03/04 06/04/04 06/05/04 06/06/04'],
276 ['05/31/04 06/01/04 06/02/04 06/03/04 06/04/04 06/05/04 06/06/04',
277 '06/07/04 06/08/04 06/09/04 06/10/04 06/11/04 06/12/04 06/13/04',
278 '06/14/04 06/15/04 06/16/04 06/17/04 06/18/04 06/19/04 06/20/04',
279 '06/21/04 06/22/04 06/23/04 06/24/04 06/25/04 06/26/04 06/27/04',
280 '06/28/04 06/29/04 06/30/04 07/01/04 07/02/04 07/03/04 07/04/04']],
281 [['06/28/04 06/29/04 06/30/04 07/01/04 07/02/04 07/03/04 07/04/04',
282 '07/05/04 07/06/04 07/07/04 07/08/04 07/09/04 07/10/04 07/11/04',
283 '07/12/04 07/13/04 07/14/04 07/15/04 07/16/04 07/17/04 07/18/04',
284 '07/19/04 07/20/04 07/21/04 07/22/04 07/23/04 07/24/04 07/25/04',
285 '07/26/04 07/27/04 07/28/04 07/29/04 07/30/04 07/31/04 08/01/04'],
286 ['07/26/04 07/27/04 07/28/04 07/29/04 07/30/04 07/31/04 08/01/04',
287 '08/02/04 08/03/04 08/04/04 08/05/04 08/06/04 08/07/04 08/08/04',
288 '08/09/04 08/10/04 08/11/04 08/12/04 08/13/04 08/14/04 08/15/04',
289 '08/16/04 08/17/04 08/18/04 08/19/04 08/20/04 08/21/04 08/22/04',
290 '08/23/04 08/24/04 08/25/04 08/26/04 08/27/04 08/28/04 08/29/04',
291 '08/30/04 08/31/04 09/01/04 09/02/04 09/03/04 09/04/04 09/05/04'],
292 ['08/30/04 08/31/04 09/01/04 09/02/04 09/03/04 09/04/04 09/05/04',
293 '09/06/04 09/07/04 09/08/04 09/09/04 09/10/04 09/11/04 09/12/04',
294 '09/13/04 09/14/04 09/15/04 09/16/04 09/17/04 09/18/04 09/19/04',
295 '09/20/04 09/21/04 09/22/04 09/23/04 09/24/04 09/25/04 09/26/04',
296 '09/27/04 09/28/04 09/29/04 09/30/04 10/01/04 10/02/04 10/03/04']],
297 [['09/27/04 09/28/04 09/29/04 09/30/04 10/01/04 10/02/04 10/03/04',
298 '10/04/04 10/05/04 10/06/04 10/07/04 10/08/04 10/09/04 10/10/04',
299 '10/11/04 10/12/04 10/13/04 10/14/04 10/15/04 10/16/04 10/17/04',
300 '10/18/04 10/19/04 10/20/04 10/21/04 10/22/04 10/23/04 10/24/04',
301 '10/25/04 10/26/04 10/27/04 10/28/04 10/29/04 10/30/04 10/31/04'],
302 ['11/01/04 11/02/04 11/03/04 11/04/04 11/05/04 11/06/04 11/07/04',
303 '11/08/04 11/09/04 11/10/04 11/11/04 11/12/04 11/13/04 11/14/04',
304 '11/15/04 11/16/04 11/17/04 11/18/04 11/19/04 11/20/04 11/21/04',
305 '11/22/04 11/23/04 11/24/04 11/25/04 11/26/04 11/27/04 11/28/04',
306 '11/29/04 11/30/04 12/01/04 12/02/04 12/03/04 12/04/04 12/05/04'],
307 ['11/29/04 11/30/04 12/01/04 12/02/04 12/03/04 12/04/04 12/05/04',
308 '12/06/04 12/07/04 12/08/04 12/09/04 12/10/04 12/11/04 12/12/04',
309 '12/13/04 12/14/04 12/15/04 12/16/04 12/17/04 12/18/04 12/19/04',
310 '12/20/04 12/21/04 12/22/04 12/23/04 12/24/04 12/25/04 12/26/04',
311 '12/27/04 12/28/04 12/29/04 12/30/04 12/31/04 01/01/05 01/02/05']]]
312
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000313
314class OutputTestCase(unittest.TestCase):
315 def normalize_calendar(self, s):
Mark Dickinson934896d2009-02-21 20:59:32 +0000316 # Filters out locale dependent strings
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000317 def neitherspacenordigit(c):
318 return not c.isspace() and not c.isdigit()
319
320 lines = []
Ezio Melottid8b509b2011-09-28 17:37:55 +0300321 for line in s.splitlines(keepends=False):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000322 # Drop texts, as they are locale dependent
323 if line and not filter(neitherspacenordigit, line):
324 lines.append(line)
325 return lines
326
R David Murrayd0c86952012-05-29 12:55:05 -0400327 def check_htmlcalendar_encoding(self, req, res):
328 cal = calendar.HTMLCalendar()
329 self.assertEqual(
330 cal.formatyearpage(2004, encoding=req).strip(b' \t\n'),
331 (result_2004_html % {'e': res}).strip(' \t\n').encode(res)
332 )
333
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000334 def test_output(self):
335 self.assertEqual(
336 self.normalize_calendar(calendar.calendar(2004)),
337 self.normalize_calendar(result_2004_text)
338 )
339
340 def test_output_textcalendar(self):
341 self.assertEqual(
342 calendar.TextCalendar().formatyear(2004).strip(),
343 result_2004_text.strip()
344 )
345
R David Murrayd0c86952012-05-29 12:55:05 -0400346 def test_output_htmlcalendar_encoding_ascii(self):
347 self.check_htmlcalendar_encoding('ascii', 'ascii')
348
349 def test_output_htmlcalendar_encoding_utf8(self):
350 self.check_htmlcalendar_encoding('utf-8', 'utf-8')
351
352 def test_output_htmlcalendar_encoding_default(self):
353 self.check_htmlcalendar_encoding(None, sys.getdefaultencoding())
354
355 def test_yeardatescalendar(self):
356 def shrink(cal):
R David Murraybb756782012-05-30 08:10:54 -0400357 return [[[' '.join('{:02d}/{:02d}/{}'.format(
358 d.month, d.day, str(d.year)[-2:]) for d in z)
359 for z in y] for y in x] for x in cal]
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000360 self.assertEqual(
R David Murrayd0c86952012-05-29 12:55:05 -0400361 shrink(calendar.Calendar().yeardatescalendar(2004)),
362 result_2004_dates
363 )
364
365 def test_yeardayscalendar(self):
366 self.assertEqual(
367 calendar.Calendar().yeardayscalendar(2004),
368 result_2004_days
369 )
370
371 def test_formatweekheader_short(self):
372 self.assertEqual(
373 calendar.TextCalendar().formatweekheader(2),
374 'Mo Tu We Th Fr Sa Su'
375 )
376
377 def test_formatweekheader_long(self):
378 self.assertEqual(
379 calendar.TextCalendar().formatweekheader(9),
380 ' Monday Tuesday Wednesday Thursday '
381 ' Friday Saturday Sunday '
382 )
383
384 def test_formatmonth(self):
385 self.assertEqual(
386 calendar.TextCalendar().formatmonth(2004, 1).strip(),
387 result_2004_01_text.strip()
388 )
389
390 def test_formatmonthname_with_year(self):
391 self.assertEqual(
392 calendar.HTMLCalendar().formatmonthname(2004, 1, withyear=True),
393 '<tr><th colspan="7" class="month">January 2004</th></tr>'
394 )
395
396 def test_formatmonthname_without_year(self):
397 self.assertEqual(
398 calendar.HTMLCalendar().formatmonthname(2004, 1, withyear=False),
399 '<tr><th colspan="7" class="month">January</th></tr>'
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000400 )
401
402
Fred Draked077ca12001-12-12 05:38:08 +0000403class CalendarTestCase(unittest.TestCase):
404 def test_isleap(self):
405 # Make sure that the return is right for a few years, and
406 # ensure that the return values are 1 or 0, not just true or
407 # false (see SF bug #485794). Specific additional tests may
408 # be appropriate; this tests a single "cycle".
409 self.assertEqual(calendar.isleap(2000), 1)
410 self.assertEqual(calendar.isleap(2001), 0)
411 self.assertEqual(calendar.isleap(2002), 0)
412 self.assertEqual(calendar.isleap(2003), 0)
413
414 def test_setfirstweekday(self):
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000415 self.assertRaises(TypeError, calendar.setfirstweekday, 'flabber')
Fred Draked077ca12001-12-12 05:38:08 +0000416 self.assertRaises(ValueError, calendar.setfirstweekday, -1)
417 self.assertRaises(ValueError, calendar.setfirstweekday, 200)
418 orig = calendar.firstweekday()
419 calendar.setfirstweekday(calendar.SUNDAY)
420 self.assertEqual(calendar.firstweekday(), calendar.SUNDAY)
421 calendar.setfirstweekday(calendar.MONDAY)
422 self.assertEqual(calendar.firstweekday(), calendar.MONDAY)
423 calendar.setfirstweekday(orig)
424
R David Murrayd0c86952012-05-29 12:55:05 -0400425 def test_illegal_weekday_reported(self):
426 with self.assertRaisesRegex(calendar.IllegalWeekdayError, '123'):
427 calendar.setfirstweekday(123)
428
429 def test_enumerate_weekdays(self):
Skip Montanaro693c6c42002-03-15 03:57:04 +0000430 self.assertRaises(IndexError, calendar.day_abbr.__getitem__, -10)
431 self.assertRaises(IndexError, calendar.day_name.__getitem__, 10)
432 self.assertEqual(len([d for d in calendar.day_abbr]), 7)
Fred Draked077ca12001-12-12 05:38:08 +0000433
Tim Peters0c2c8e72002-03-23 03:26:53 +0000434 def test_days(self):
435 for attr in "day_name", "day_abbr":
436 value = getattr(calendar, attr)
437 self.assertEqual(len(value), 7)
438 self.assertEqual(len(value[:]), 7)
439 # ensure they're all unique
Tim Petersbbc0d442004-11-13 16:18:32 +0000440 self.assertEqual(len(set(value)), 7)
441 # verify it "acts like a sequence" in two forms of iteration
442 self.assertEqual(value[::-1], list(reversed(value)))
Tim Peters0c2c8e72002-03-23 03:26:53 +0000443
444 def test_months(self):
445 for attr in "month_name", "month_abbr":
446 value = getattr(calendar, attr)
447 self.assertEqual(len(value), 13)
448 self.assertEqual(len(value[:]), 13)
449 self.assertEqual(value[0], "")
450 # ensure they're all unique
Tim Petersbbc0d442004-11-13 16:18:32 +0000451 self.assertEqual(len(set(value)), 13)
452 # verify it "acts like a sequence" in two forms of iteration
453 self.assertEqual(value[::-1], list(reversed(value)))
Tim Peters0c2c8e72002-03-23 03:26:53 +0000454
R David Murrayd0c86952012-05-29 12:55:05 -0400455 def test_locale_calendars(self):
Georg Brandl7004bd12010-10-19 18:54:25 +0000456 # ensure that Locale{Text,HTML}Calendar resets the locale properly
457 # (it is still not thread-safe though)
Georg Brandl7004bd12010-10-19 18:54:25 +0000458 old_october = calendar.TextCalendar().formatmonthname(2010, 10, 10)
Georg Brandl9450cc02010-10-20 06:50:19 +0000459 try:
Serhiy Storchakaf9fcdb72013-01-31 16:00:42 +0200460 cal = calendar.LocaleTextCalendar(locale='')
461 local_weekday = cal.formatweekday(1, 10)
462 local_month = cal.formatmonthname(2010, 10, 10)
Georg Brandl9450cc02010-10-20 06:50:19 +0000463 except locale.Error:
464 # cannot set the system default locale -- skip rest of test
Serhiy Storchakaf9fcdb72013-01-31 16:00:42 +0200465 raise unittest.SkipTest('cannot set the system default locale')
466 self.assertIsInstance(local_weekday, str)
467 self.assertIsInstance(local_month, str)
468 self.assertEqual(len(local_weekday), 10)
469 self.assertGreaterEqual(len(local_month), 10)
470 cal = calendar.LocaleHTMLCalendar(locale='')
471 local_weekday = cal.formatweekday(1)
472 local_month = cal.formatmonthname(2010, 10)
473 self.assertIsInstance(local_weekday, str)
474 self.assertIsInstance(local_month, str)
Georg Brandl7004bd12010-10-19 18:54:25 +0000475 new_october = calendar.TextCalendar().formatmonthname(2010, 10, 10)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000476 self.assertEqual(old_october, new_october)
Georg Brandl7004bd12010-10-19 18:54:25 +0000477
Ezio Melotti85710a42012-09-21 17:26:35 +0300478 def test_itermonthdates(self):
479 # ensure itermonthdates doesn't overflow after datetime.MAXYEAR
480 # see #15421
481 list(calendar.Calendar().itermonthdates(datetime.MAXYEAR, 12))
482
Walter Dörwald59ad4562004-07-02 19:00:09 +0000483
484class MonthCalendarTestCase(unittest.TestCase):
485 def setUp(self):
486 self.oldfirstweekday = calendar.firstweekday()
487 calendar.setfirstweekday(self.firstweekday)
488
489 def tearDown(self):
490 calendar.setfirstweekday(self.oldfirstweekday)
491
492 def check_weeks(self, year, month, weeks):
493 cal = calendar.monthcalendar(year, month)
494 self.assertEqual(len(cal), len(weeks))
Guido van Rossum805365e2007-05-07 22:24:25 +0000495 for i in range(len(weeks)):
Walter Dörwald59ad4562004-07-02 19:00:09 +0000496 self.assertEqual(weeks[i], sum(day != 0 for day in cal[i]))
497
498
499class MondayTestCase(MonthCalendarTestCase):
500 firstweekday = calendar.MONDAY
501
502 def test_february(self):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000503 # A 28-day february starting on monday (7+7+7+7 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000504 self.check_weeks(1999, 2, (7, 7, 7, 7))
505
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000506 # A 28-day february starting on tuesday (6+7+7+7+1 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000507 self.check_weeks(2005, 2, (6, 7, 7, 7, 1))
508
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000509 # A 28-day february starting on sunday (1+7+7+7+6 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000510 self.check_weeks(1987, 2, (1, 7, 7, 7, 6))
511
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000512 # A 29-day february starting on monday (7+7+7+7+1 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000513 self.check_weeks(1988, 2, (7, 7, 7, 7, 1))
514
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000515 # A 29-day february starting on tuesday (6+7+7+7+2 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000516 self.check_weeks(1972, 2, (6, 7, 7, 7, 2))
517
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000518 # A 29-day february starting on sunday (1+7+7+7+7 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000519 self.check_weeks(2004, 2, (1, 7, 7, 7, 7))
520
521 def test_april(self):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000522 # A 30-day april starting on monday (7+7+7+7+2 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000523 self.check_weeks(1935, 4, (7, 7, 7, 7, 2))
524
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000525 # A 30-day april starting on tuesday (6+7+7+7+3 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000526 self.check_weeks(1975, 4, (6, 7, 7, 7, 3))
527
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000528 # A 30-day april starting on sunday (1+7+7+7+7+1 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000529 self.check_weeks(1945, 4, (1, 7, 7, 7, 7, 1))
530
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000531 # A 30-day april starting on saturday (2+7+7+7+7 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000532 self.check_weeks(1995, 4, (2, 7, 7, 7, 7))
533
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000534 # A 30-day april starting on friday (3+7+7+7+6 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000535 self.check_weeks(1994, 4, (3, 7, 7, 7, 6))
536
537 def test_december(self):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000538 # A 31-day december starting on monday (7+7+7+7+3 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000539 self.check_weeks(1980, 12, (7, 7, 7, 7, 3))
540
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000541 # A 31-day december starting on tuesday (6+7+7+7+4 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000542 self.check_weeks(1987, 12, (6, 7, 7, 7, 4))
543
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000544 # A 31-day december starting on sunday (1+7+7+7+7+2 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000545 self.check_weeks(1968, 12, (1, 7, 7, 7, 7, 2))
546
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000547 # A 31-day december starting on thursday (4+7+7+7+6 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000548 self.check_weeks(1988, 12, (4, 7, 7, 7, 6))
549
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000550 # A 31-day december starting on friday (3+7+7+7+7 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000551 self.check_weeks(2017, 12, (3, 7, 7, 7, 7))
552
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000553 # A 31-day december starting on saturday (2+7+7+7+7+1 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000554 self.check_weeks(2068, 12, (2, 7, 7, 7, 7, 1))
555
556
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000557class SundayTestCase(MonthCalendarTestCase):
558 firstweekday = calendar.SUNDAY
559
560 def test_february(self):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000561 # A 28-day february starting on sunday (7+7+7+7 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000562 self.check_weeks(2009, 2, (7, 7, 7, 7))
563
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000564 # A 28-day february starting on monday (6+7+7+7+1 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000565 self.check_weeks(1999, 2, (6, 7, 7, 7, 1))
566
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000567 # A 28-day february starting on saturday (1+7+7+7+6 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000568 self.check_weeks(1997, 2, (1, 7, 7, 7, 6))
569
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000570 # A 29-day february starting on sunday (7+7+7+7+1 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000571 self.check_weeks(2004, 2, (7, 7, 7, 7, 1))
572
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000573 # A 29-day february starting on monday (6+7+7+7+2 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000574 self.check_weeks(1960, 2, (6, 7, 7, 7, 2))
575
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000576 # A 29-day february starting on saturday (1+7+7+7+7 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000577 self.check_weeks(1964, 2, (1, 7, 7, 7, 7))
578
579 def test_april(self):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000580 # A 30-day april starting on sunday (7+7+7+7+2 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000581 self.check_weeks(1923, 4, (7, 7, 7, 7, 2))
582
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000583 # A 30-day april starting on monday (6+7+7+7+3 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000584 self.check_weeks(1918, 4, (6, 7, 7, 7, 3))
585
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000586 # A 30-day april starting on saturday (1+7+7+7+7+1 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000587 self.check_weeks(1950, 4, (1, 7, 7, 7, 7, 1))
588
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000589 # A 30-day april starting on friday (2+7+7+7+7 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000590 self.check_weeks(1960, 4, (2, 7, 7, 7, 7))
591
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000592 # A 30-day april starting on thursday (3+7+7+7+6 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000593 self.check_weeks(1909, 4, (3, 7, 7, 7, 6))
594
595 def test_december(self):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000596 # A 31-day december starting on sunday (7+7+7+7+3 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000597 self.check_weeks(2080, 12, (7, 7, 7, 7, 3))
598
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000599 # A 31-day december starting on monday (6+7+7+7+4 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000600 self.check_weeks(1941, 12, (6, 7, 7, 7, 4))
601
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000602 # A 31-day december starting on saturday (1+7+7+7+7+2 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000603 self.check_weeks(1923, 12, (1, 7, 7, 7, 7, 2))
604
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000605 # A 31-day december starting on wednesday (4+7+7+7+6 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000606 self.check_weeks(1948, 12, (4, 7, 7, 7, 6))
607
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000608 # A 31-day december starting on thursday (3+7+7+7+7 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000609 self.check_weeks(1927, 12, (3, 7, 7, 7, 7))
610
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000611 # A 31-day december starting on friday (2+7+7+7+7+1 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000612 self.check_weeks(1995, 12, (2, 7, 7, 7, 7, 1))
613
Alexander Belopolsky43ca7102010-06-14 17:32:03 +0000614class TimegmTestCase(unittest.TestCase):
615 TIMESTAMPS = [0, 10, 100, 1000, 10000, 100000, 1000000,
616 1234567890, 1262304000, 1275785153,]
617 def test_timegm(self):
618 for secs in self.TIMESTAMPS:
619 tuple = time.gmtime(secs)
620 self.assertEqual(secs, calendar.timegm(tuple))
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000621
Brett Cannoncfae36f2010-07-23 13:54:14 +0000622class MonthRangeTestCase(unittest.TestCase):
623 def test_january(self):
624 # Tests valid lower boundary case.
625 self.assertEqual(calendar.monthrange(2004,1), (3,31))
626
627 def test_february_leap(self):
628 # Tests February during leap year.
629 self.assertEqual(calendar.monthrange(2004,2), (6,29))
630
631 def test_february_nonleap(self):
632 # Tests February in non-leap year.
633 self.assertEqual(calendar.monthrange(2010,2), (0,28))
634
635 def test_december(self):
636 # Tests valid upper boundary case.
637 self.assertEqual(calendar.monthrange(2004,12), (2,31))
638
639 def test_zeroth_month(self):
640 # Tests low invalid boundary case.
641 with self.assertRaises(calendar.IllegalMonthError):
642 calendar.monthrange(2004, 0)
643
644 def test_thirteenth_month(self):
645 # Tests high invalid boundary case.
646 with self.assertRaises(calendar.IllegalMonthError):
647 calendar.monthrange(2004, 13)
648
R David Murrayd0c86952012-05-29 12:55:05 -0400649 def test_illegal_month_reported(self):
650 with self.assertRaisesRegex(calendar.IllegalMonthError, '65'):
651 calendar.monthrange(2004, 65)
652
R. David Murray1daaf9e2010-12-31 19:21:14 +0000653class LeapdaysTestCase(unittest.TestCase):
654 def test_no_range(self):
655 # test when no range i.e. two identical years as args
656 self.assertEqual(calendar.leapdays(2010,2010), 0)
657
658 def test_no_leapdays(self):
659 # test when no leap years in range
660 self.assertEqual(calendar.leapdays(2010,2011), 0)
661
662 def test_no_leapdays_upper_boundary(self):
663 # test no leap years in range, when upper boundary is a leap year
664 self.assertEqual(calendar.leapdays(2010,2012), 0)
665
666 def test_one_leapday_lower_boundary(self):
667 # test when one leap year in range, lower boundary is leap year
668 self.assertEqual(calendar.leapdays(2012,2013), 1)
669
670 def test_several_leapyears_in_range(self):
671 self.assertEqual(calendar.leapdays(1997,2020), 5)
672
Brett Cannoncfae36f2010-07-23 13:54:14 +0000673
Senthil Kumaran962fed92011-08-11 09:22:52 +0800674class ConsoleOutputTestCase(unittest.TestCase):
675 def test_outputs_bytes(self):
676 (return_code, stdout, stderr) = assert_python_ok('-m', 'calendar', '--type=html', '2010')
677 self.assertEqual(stdout[:6], b'<?xml ')
678
Fred Draked077ca12001-12-12 05:38:08 +0000679def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000680 support.run_unittest(
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000681 OutputTestCase,
Walter Dörwald59ad4562004-07-02 19:00:09 +0000682 CalendarTestCase,
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000683 MondayTestCase,
Alexander Belopolsky43ca7102010-06-14 17:32:03 +0000684 SundayTestCase,
685 TimegmTestCase,
Brett Cannoncfae36f2010-07-23 13:54:14 +0000686 MonthRangeTestCase,
R. David Murray1daaf9e2010-12-31 19:21:14 +0000687 LeapdaysTestCase,
Senthil Kumaran962fed92011-08-11 09:22:52 +0800688 ConsoleOutputTestCase
Walter Dörwald59ad4562004-07-02 19:00:09 +0000689 )
690
Fred Draked077ca12001-12-12 05:38:08 +0000691
692if __name__ == "__main__":
693 test_main()