blob: d00adde7e4302aefe7be8ff71c80f085c7cc838c [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):
356 return [[[' '.join((d.strftime('%D')
357 for d in z)) for z in y] for y in x] for x in cal]
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000358 self.assertEqual(
R David Murrayd0c86952012-05-29 12:55:05 -0400359 shrink(calendar.Calendar().yeardatescalendar(2004)),
360 result_2004_dates
361 )
362
363 def test_yeardayscalendar(self):
364 self.assertEqual(
365 calendar.Calendar().yeardayscalendar(2004),
366 result_2004_days
367 )
368
369 def test_formatweekheader_short(self):
370 self.assertEqual(
371 calendar.TextCalendar().formatweekheader(2),
372 'Mo Tu We Th Fr Sa Su'
373 )
374
375 def test_formatweekheader_long(self):
376 self.assertEqual(
377 calendar.TextCalendar().formatweekheader(9),
378 ' Monday Tuesday Wednesday Thursday '
379 ' Friday Saturday Sunday '
380 )
381
382 def test_formatmonth(self):
383 self.assertEqual(
384 calendar.TextCalendar().formatmonth(2004, 1).strip(),
385 result_2004_01_text.strip()
386 )
387
388 def test_formatmonthname_with_year(self):
389 self.assertEqual(
390 calendar.HTMLCalendar().formatmonthname(2004, 1, withyear=True),
391 '<tr><th colspan="7" class="month">January 2004</th></tr>'
392 )
393
394 def test_formatmonthname_without_year(self):
395 self.assertEqual(
396 calendar.HTMLCalendar().formatmonthname(2004, 1, withyear=False),
397 '<tr><th colspan="7" class="month">January</th></tr>'
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000398 )
399
400
Fred Draked077ca12001-12-12 05:38:08 +0000401class CalendarTestCase(unittest.TestCase):
402 def test_isleap(self):
403 # Make sure that the return is right for a few years, and
404 # ensure that the return values are 1 or 0, not just true or
405 # false (see SF bug #485794). Specific additional tests may
406 # be appropriate; this tests a single "cycle".
407 self.assertEqual(calendar.isleap(2000), 1)
408 self.assertEqual(calendar.isleap(2001), 0)
409 self.assertEqual(calendar.isleap(2002), 0)
410 self.assertEqual(calendar.isleap(2003), 0)
411
412 def test_setfirstweekday(self):
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000413 self.assertRaises(TypeError, calendar.setfirstweekday, 'flabber')
Fred Draked077ca12001-12-12 05:38:08 +0000414 self.assertRaises(ValueError, calendar.setfirstweekday, -1)
415 self.assertRaises(ValueError, calendar.setfirstweekday, 200)
416 orig = calendar.firstweekday()
417 calendar.setfirstweekday(calendar.SUNDAY)
418 self.assertEqual(calendar.firstweekday(), calendar.SUNDAY)
419 calendar.setfirstweekday(calendar.MONDAY)
420 self.assertEqual(calendar.firstweekday(), calendar.MONDAY)
421 calendar.setfirstweekday(orig)
422
R David Murrayd0c86952012-05-29 12:55:05 -0400423 def test_illegal_weekday_reported(self):
424 with self.assertRaisesRegex(calendar.IllegalWeekdayError, '123'):
425 calendar.setfirstweekday(123)
426
427 def test_enumerate_weekdays(self):
Skip Montanaro693c6c42002-03-15 03:57:04 +0000428 self.assertRaises(IndexError, calendar.day_abbr.__getitem__, -10)
429 self.assertRaises(IndexError, calendar.day_name.__getitem__, 10)
430 self.assertEqual(len([d for d in calendar.day_abbr]), 7)
Fred Draked077ca12001-12-12 05:38:08 +0000431
Tim Peters0c2c8e72002-03-23 03:26:53 +0000432 def test_days(self):
433 for attr in "day_name", "day_abbr":
434 value = getattr(calendar, attr)
435 self.assertEqual(len(value), 7)
436 self.assertEqual(len(value[:]), 7)
437 # ensure they're all unique
Tim Petersbbc0d442004-11-13 16:18:32 +0000438 self.assertEqual(len(set(value)), 7)
439 # verify it "acts like a sequence" in two forms of iteration
440 self.assertEqual(value[::-1], list(reversed(value)))
Tim Peters0c2c8e72002-03-23 03:26:53 +0000441
442 def test_months(self):
443 for attr in "month_name", "month_abbr":
444 value = getattr(calendar, attr)
445 self.assertEqual(len(value), 13)
446 self.assertEqual(len(value[:]), 13)
447 self.assertEqual(value[0], "")
448 # ensure they're all unique
Tim Petersbbc0d442004-11-13 16:18:32 +0000449 self.assertEqual(len(set(value)), 13)
450 # verify it "acts like a sequence" in two forms of iteration
451 self.assertEqual(value[::-1], list(reversed(value)))
Tim Peters0c2c8e72002-03-23 03:26:53 +0000452
R David Murrayd0c86952012-05-29 12:55:05 -0400453 def test_locale_calendars(self):
Georg Brandl7004bd12010-10-19 18:54:25 +0000454 # ensure that Locale{Text,HTML}Calendar resets the locale properly
455 # (it is still not thread-safe though)
Georg Brandl7004bd12010-10-19 18:54:25 +0000456 old_october = calendar.TextCalendar().formatmonthname(2010, 10, 10)
Georg Brandl9450cc02010-10-20 06:50:19 +0000457 try:
458 calendar.LocaleTextCalendar(locale='').formatmonthname(2010, 10, 10)
459 except locale.Error:
460 # cannot set the system default locale -- skip rest of test
461 return
462 calendar.LocaleHTMLCalendar(locale='').formatmonthname(2010, 10)
Georg Brandl7004bd12010-10-19 18:54:25 +0000463 new_october = calendar.TextCalendar().formatmonthname(2010, 10, 10)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000464 self.assertEqual(old_october, new_october)
Georg Brandl7004bd12010-10-19 18:54:25 +0000465
Walter Dörwald59ad4562004-07-02 19:00:09 +0000466
467class MonthCalendarTestCase(unittest.TestCase):
468 def setUp(self):
469 self.oldfirstweekday = calendar.firstweekday()
470 calendar.setfirstweekday(self.firstweekday)
471
472 def tearDown(self):
473 calendar.setfirstweekday(self.oldfirstweekday)
474
475 def check_weeks(self, year, month, weeks):
476 cal = calendar.monthcalendar(year, month)
477 self.assertEqual(len(cal), len(weeks))
Guido van Rossum805365e2007-05-07 22:24:25 +0000478 for i in range(len(weeks)):
Walter Dörwald59ad4562004-07-02 19:00:09 +0000479 self.assertEqual(weeks[i], sum(day != 0 for day in cal[i]))
480
481
482class MondayTestCase(MonthCalendarTestCase):
483 firstweekday = calendar.MONDAY
484
485 def test_february(self):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000486 # A 28-day february starting on monday (7+7+7+7 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000487 self.check_weeks(1999, 2, (7, 7, 7, 7))
488
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000489 # A 28-day february starting on tuesday (6+7+7+7+1 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000490 self.check_weeks(2005, 2, (6, 7, 7, 7, 1))
491
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000492 # A 28-day february starting on sunday (1+7+7+7+6 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000493 self.check_weeks(1987, 2, (1, 7, 7, 7, 6))
494
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000495 # A 29-day february starting on monday (7+7+7+7+1 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000496 self.check_weeks(1988, 2, (7, 7, 7, 7, 1))
497
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000498 # A 29-day february starting on tuesday (6+7+7+7+2 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000499 self.check_weeks(1972, 2, (6, 7, 7, 7, 2))
500
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000501 # A 29-day february starting on sunday (1+7+7+7+7 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000502 self.check_weeks(2004, 2, (1, 7, 7, 7, 7))
503
504 def test_april(self):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000505 # A 30-day april starting on monday (7+7+7+7+2 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000506 self.check_weeks(1935, 4, (7, 7, 7, 7, 2))
507
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000508 # A 30-day april starting on tuesday (6+7+7+7+3 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000509 self.check_weeks(1975, 4, (6, 7, 7, 7, 3))
510
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000511 # A 30-day april starting on sunday (1+7+7+7+7+1 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000512 self.check_weeks(1945, 4, (1, 7, 7, 7, 7, 1))
513
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000514 # A 30-day april starting on saturday (2+7+7+7+7 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000515 self.check_weeks(1995, 4, (2, 7, 7, 7, 7))
516
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000517 # A 30-day april starting on friday (3+7+7+7+6 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000518 self.check_weeks(1994, 4, (3, 7, 7, 7, 6))
519
520 def test_december(self):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000521 # A 31-day december starting on monday (7+7+7+7+3 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000522 self.check_weeks(1980, 12, (7, 7, 7, 7, 3))
523
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000524 # A 31-day december starting on tuesday (6+7+7+7+4 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000525 self.check_weeks(1987, 12, (6, 7, 7, 7, 4))
526
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000527 # A 31-day december starting on sunday (1+7+7+7+7+2 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000528 self.check_weeks(1968, 12, (1, 7, 7, 7, 7, 2))
529
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000530 # A 31-day december starting on thursday (4+7+7+7+6 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000531 self.check_weeks(1988, 12, (4, 7, 7, 7, 6))
532
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000533 # A 31-day december starting on friday (3+7+7+7+7 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000534 self.check_weeks(2017, 12, (3, 7, 7, 7, 7))
535
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000536 # A 31-day december starting on saturday (2+7+7+7+7+1 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000537 self.check_weeks(2068, 12, (2, 7, 7, 7, 7, 1))
538
539
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000540class SundayTestCase(MonthCalendarTestCase):
541 firstweekday = calendar.SUNDAY
542
543 def test_february(self):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000544 # A 28-day february starting on sunday (7+7+7+7 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000545 self.check_weeks(2009, 2, (7, 7, 7, 7))
546
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000547 # A 28-day february starting on monday (6+7+7+7+1 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000548 self.check_weeks(1999, 2, (6, 7, 7, 7, 1))
549
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000550 # A 28-day february starting on saturday (1+7+7+7+6 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000551 self.check_weeks(1997, 2, (1, 7, 7, 7, 6))
552
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000553 # A 29-day february starting on sunday (7+7+7+7+1 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000554 self.check_weeks(2004, 2, (7, 7, 7, 7, 1))
555
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000556 # A 29-day february starting on monday (6+7+7+7+2 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000557 self.check_weeks(1960, 2, (6, 7, 7, 7, 2))
558
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000559 # A 29-day february starting on saturday (1+7+7+7+7 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000560 self.check_weeks(1964, 2, (1, 7, 7, 7, 7))
561
562 def test_april(self):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000563 # A 30-day april starting on sunday (7+7+7+7+2 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000564 self.check_weeks(1923, 4, (7, 7, 7, 7, 2))
565
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000566 # A 30-day april starting on monday (6+7+7+7+3 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000567 self.check_weeks(1918, 4, (6, 7, 7, 7, 3))
568
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000569 # A 30-day april starting on saturday (1+7+7+7+7+1 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000570 self.check_weeks(1950, 4, (1, 7, 7, 7, 7, 1))
571
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000572 # A 30-day april starting on friday (2+7+7+7+7 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000573 self.check_weeks(1960, 4, (2, 7, 7, 7, 7))
574
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000575 # A 30-day april starting on thursday (3+7+7+7+6 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000576 self.check_weeks(1909, 4, (3, 7, 7, 7, 6))
577
578 def test_december(self):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000579 # A 31-day december starting on sunday (7+7+7+7+3 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000580 self.check_weeks(2080, 12, (7, 7, 7, 7, 3))
581
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000582 # A 31-day december starting on monday (6+7+7+7+4 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000583 self.check_weeks(1941, 12, (6, 7, 7, 7, 4))
584
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000585 # A 31-day december starting on saturday (1+7+7+7+7+2 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000586 self.check_weeks(1923, 12, (1, 7, 7, 7, 7, 2))
587
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000588 # A 31-day december starting on wednesday (4+7+7+7+6 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000589 self.check_weeks(1948, 12, (4, 7, 7, 7, 6))
590
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000591 # A 31-day december starting on thursday (3+7+7+7+7 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000592 self.check_weeks(1927, 12, (3, 7, 7, 7, 7))
593
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000594 # A 31-day december starting on friday (2+7+7+7+7+1 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000595 self.check_weeks(1995, 12, (2, 7, 7, 7, 7, 1))
596
Alexander Belopolsky43ca7102010-06-14 17:32:03 +0000597class TimegmTestCase(unittest.TestCase):
598 TIMESTAMPS = [0, 10, 100, 1000, 10000, 100000, 1000000,
599 1234567890, 1262304000, 1275785153,]
600 def test_timegm(self):
601 for secs in self.TIMESTAMPS:
602 tuple = time.gmtime(secs)
603 self.assertEqual(secs, calendar.timegm(tuple))
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000604
Brett Cannoncfae36f2010-07-23 13:54:14 +0000605class MonthRangeTestCase(unittest.TestCase):
606 def test_january(self):
607 # Tests valid lower boundary case.
608 self.assertEqual(calendar.monthrange(2004,1), (3,31))
609
610 def test_february_leap(self):
611 # Tests February during leap year.
612 self.assertEqual(calendar.monthrange(2004,2), (6,29))
613
614 def test_february_nonleap(self):
615 # Tests February in non-leap year.
616 self.assertEqual(calendar.monthrange(2010,2), (0,28))
617
618 def test_december(self):
619 # Tests valid upper boundary case.
620 self.assertEqual(calendar.monthrange(2004,12), (2,31))
621
622 def test_zeroth_month(self):
623 # Tests low invalid boundary case.
624 with self.assertRaises(calendar.IllegalMonthError):
625 calendar.monthrange(2004, 0)
626
627 def test_thirteenth_month(self):
628 # Tests high invalid boundary case.
629 with self.assertRaises(calendar.IllegalMonthError):
630 calendar.monthrange(2004, 13)
631
R David Murrayd0c86952012-05-29 12:55:05 -0400632 def test_illegal_month_reported(self):
633 with self.assertRaisesRegex(calendar.IllegalMonthError, '65'):
634 calendar.monthrange(2004, 65)
635
R. David Murray1daaf9e2010-12-31 19:21:14 +0000636class LeapdaysTestCase(unittest.TestCase):
637 def test_no_range(self):
638 # test when no range i.e. two identical years as args
639 self.assertEqual(calendar.leapdays(2010,2010), 0)
640
641 def test_no_leapdays(self):
642 # test when no leap years in range
643 self.assertEqual(calendar.leapdays(2010,2011), 0)
644
645 def test_no_leapdays_upper_boundary(self):
646 # test no leap years in range, when upper boundary is a leap year
647 self.assertEqual(calendar.leapdays(2010,2012), 0)
648
649 def test_one_leapday_lower_boundary(self):
650 # test when one leap year in range, lower boundary is leap year
651 self.assertEqual(calendar.leapdays(2012,2013), 1)
652
653 def test_several_leapyears_in_range(self):
654 self.assertEqual(calendar.leapdays(1997,2020), 5)
655
Brett Cannoncfae36f2010-07-23 13:54:14 +0000656
Senthil Kumaran962fed92011-08-11 09:22:52 +0800657class ConsoleOutputTestCase(unittest.TestCase):
658 def test_outputs_bytes(self):
659 (return_code, stdout, stderr) = assert_python_ok('-m', 'calendar', '--type=html', '2010')
660 self.assertEqual(stdout[:6], b'<?xml ')
661
Fred Draked077ca12001-12-12 05:38:08 +0000662def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000663 support.run_unittest(
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000664 OutputTestCase,
Walter Dörwald59ad4562004-07-02 19:00:09 +0000665 CalendarTestCase,
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000666 MondayTestCase,
Alexander Belopolsky43ca7102010-06-14 17:32:03 +0000667 SundayTestCase,
668 TimegmTestCase,
Brett Cannoncfae36f2010-07-23 13:54:14 +0000669 MonthRangeTestCase,
R. David Murray1daaf9e2010-12-31 19:21:14 +0000670 LeapdaysTestCase,
Senthil Kumaran962fed92011-08-11 09:22:52 +0800671 ConsoleOutputTestCase
Walter Dörwald59ad4562004-07-02 19:00:09 +0000672 )
673
Fred Draked077ca12001-12-12 05:38:08 +0000674
675if __name__ == "__main__":
676 test_main()