blob: 9193857197b4b64ac17ddd9cc3bea70441510992 [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
Serhiy Storchakaaef859c2015-02-05 15:14:35 +02005from test.script_helper import assert_python_ok, assert_python_failure
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
Serhiy Storchakaaef859c2015-02-05 15:14:35 +020010import os
R David Murrayd0c86952012-05-29 12:55:05 -040011
Serhiy Storchakaaef859c2015-02-05 15:14:35 +020012result_2004_01_text = """\
R David Murrayd0c86952012-05-29 12:55:05 -040013 January 2004
14Mo Tu We Th Fr Sa Su
15 1 2 3 4
16 5 6 7 8 9 10 11
1712 13 14 15 16 17 18
1819 20 21 22 23 24 25
1926 27 28 29 30 31
20"""
Fred Draked077ca12001-12-12 05:38:08 +000021
Serhiy Storchakaaef859c2015-02-05 15:14:35 +020022result_2004_text = """\
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000023 2004
24
25 January February March
26Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
27 1 2 3 4 1 1 2 3 4 5 6 7
28 5 6 7 8 9 10 11 2 3 4 5 6 7 8 8 9 10 11 12 13 14
2912 13 14 15 16 17 18 9 10 11 12 13 14 15 15 16 17 18 19 20 21
3019 20 21 22 23 24 25 16 17 18 19 20 21 22 22 23 24 25 26 27 28
3126 27 28 29 30 31 23 24 25 26 27 28 29 29 30 31
32
33 April May June
34Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
35 1 2 3 4 1 2 1 2 3 4 5 6
36 5 6 7 8 9 10 11 3 4 5 6 7 8 9 7 8 9 10 11 12 13
3712 13 14 15 16 17 18 10 11 12 13 14 15 16 14 15 16 17 18 19 20
3819 20 21 22 23 24 25 17 18 19 20 21 22 23 21 22 23 24 25 26 27
3926 27 28 29 30 24 25 26 27 28 29 30 28 29 30
40 31
41
42 July August September
43Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
44 1 2 3 4 1 1 2 3 4 5
45 5 6 7 8 9 10 11 2 3 4 5 6 7 8 6 7 8 9 10 11 12
4612 13 14 15 16 17 18 9 10 11 12 13 14 15 13 14 15 16 17 18 19
4719 20 21 22 23 24 25 16 17 18 19 20 21 22 20 21 22 23 24 25 26
4826 27 28 29 30 31 23 24 25 26 27 28 29 27 28 29 30
49 30 31
50
51 October November December
52Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
53 1 2 3 1 2 3 4 5 6 7 1 2 3 4 5
54 4 5 6 7 8 9 10 8 9 10 11 12 13 14 6 7 8 9 10 11 12
5511 12 13 14 15 16 17 15 16 17 18 19 20 21 13 14 15 16 17 18 19
5618 19 20 21 22 23 24 22 23 24 25 26 27 28 20 21 22 23 24 25 26
5725 26 27 28 29 30 31 29 30 27 28 29 30 31
58"""
59
Serhiy Storchakaaef859c2015-02-05 15:14:35 +020060result_2004_html = """\
R David Murrayd0c86952012-05-29 12:55:05 -040061<?xml version="1.0" encoding="%(e)s"?>
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000062<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
63<html>
64<head>
R David Murrayd0c86952012-05-29 12:55:05 -040065<meta http-equiv="Content-Type" content="text/html; charset=%(e)s" />
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000066<link rel="stylesheet" type="text/css" href="calendar.css" />
Thomas Wouters47b49bf2007-08-30 22:15:33 +000067<title>Calendar for 2004</title>
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000068</head>
69<body>
70<table border="0" cellpadding="0" cellspacing="0" class="year">
71<tr><th colspan="3" class="year">2004</th></tr><tr><td><table border="0" cellpadding="0" cellspacing="0" class="month">
72<tr><th colspan="7" class="month">January</th></tr>
73<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>
74<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>
75<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>
76<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>
77<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>
78<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>
79</table>
80</td><td><table border="0" cellpadding="0" cellspacing="0" class="month">
81<tr><th colspan="7" class="month">February</th></tr>
82<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>
83<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>
84<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>
85<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>
86<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>
87<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>
88</table>
89</td><td><table border="0" cellpadding="0" cellspacing="0" class="month">
90<tr><th colspan="7" class="month">March</th></tr>
91<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>
92<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>
93<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>
94<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>
95<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>
96<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>
97</table>
98</td></tr><tr><td><table border="0" cellpadding="0" cellspacing="0" class="month">
99<tr><th colspan="7" class="month">April</th></tr>
100<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>
101<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>
102<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>
103<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>
104<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>
105<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>
106</table>
107</td><td><table border="0" cellpadding="0" cellspacing="0" class="month">
108<tr><th colspan="7" class="month">May</th></tr>
109<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>
110<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>
111<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>
112<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>
113<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>
114<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>
115<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>
116</table>
117</td><td><table border="0" cellpadding="0" cellspacing="0" class="month">
118<tr><th colspan="7" class="month">June</th></tr>
119<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>
120<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>
121<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>
122<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>
123<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>
124<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>
125</table>
126</td></tr><tr><td><table border="0" cellpadding="0" cellspacing="0" class="month">
127<tr><th colspan="7" class="month">July</th></tr>
128<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>
129<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>
130<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>
131<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>
132<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>
133<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>
134</table>
135</td><td><table border="0" cellpadding="0" cellspacing="0" class="month">
136<tr><th colspan="7" class="month">August</th></tr>
137<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>
138<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>
139<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>
140<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>
141<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>
142<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>
143<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>
144</table>
145</td><td><table border="0" cellpadding="0" cellspacing="0" class="month">
146<tr><th colspan="7" class="month">September</th></tr>
147<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>
148<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>
149<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>
150<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>
151<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>
152<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>
153</table>
154</td></tr><tr><td><table border="0" cellpadding="0" cellspacing="0" class="month">
155<tr><th colspan="7" class="month">October</th></tr>
156<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>
157<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>
158<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>
159<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>
160<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>
161<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>
162</table>
163</td><td><table border="0" cellpadding="0" cellspacing="0" class="month">
164<tr><th colspan="7" class="month">November</th></tr>
165<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>
166<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>
167<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>
168<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>
169<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>
170<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>
171</table>
172</td><td><table border="0" cellpadding="0" cellspacing="0" class="month">
173<tr><th colspan="7" class="month">December</th></tr>
174<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>
175<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>
176<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>
177<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>
178<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>
179<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>
180</table>
181</td></tr></table></body>
182</html>
183"""
184
R David Murrayd0c86952012-05-29 12:55:05 -0400185result_2004_days = [
186 [[[0, 0, 0, 1, 2, 3, 4],
187 [5, 6, 7, 8, 9, 10, 11],
188 [12, 13, 14, 15, 16, 17, 18],
189 [19, 20, 21, 22, 23, 24, 25],
190 [26, 27, 28, 29, 30, 31, 0]],
191 [[0, 0, 0, 0, 0, 0, 1],
192 [2, 3, 4, 5, 6, 7, 8],
193 [9, 10, 11, 12, 13, 14, 15],
194 [16, 17, 18, 19, 20, 21, 22],
195 [23, 24, 25, 26, 27, 28, 29]],
196 [[1, 2, 3, 4, 5, 6, 7],
197 [8, 9, 10, 11, 12, 13, 14],
198 [15, 16, 17, 18, 19, 20, 21],
199 [22, 23, 24, 25, 26, 27, 28],
200 [29, 30, 31, 0, 0, 0, 0]]],
201 [[[0, 0, 0, 1, 2, 3, 4],
202 [5, 6, 7, 8, 9, 10, 11],
203 [12, 13, 14, 15, 16, 17, 18],
204 [19, 20, 21, 22, 23, 24, 25],
205 [26, 27, 28, 29, 30, 0, 0]],
206 [[0, 0, 0, 0, 0, 1, 2],
207 [3, 4, 5, 6, 7, 8, 9],
208 [10, 11, 12, 13, 14, 15, 16],
209 [17, 18, 19, 20, 21, 22, 23],
210 [24, 25, 26, 27, 28, 29, 30],
211 [31, 0, 0, 0, 0, 0, 0]],
212 [[0, 1, 2, 3, 4, 5, 6],
213 [7, 8, 9, 10, 11, 12, 13],
214 [14, 15, 16, 17, 18, 19, 20],
215 [21, 22, 23, 24, 25, 26, 27],
216 [28, 29, 30, 0, 0, 0, 0]]],
217 [[[0, 0, 0, 1, 2, 3, 4],
218 [5, 6, 7, 8, 9, 10, 11],
219 [12, 13, 14, 15, 16, 17, 18],
220 [19, 20, 21, 22, 23, 24, 25],
221 [26, 27, 28, 29, 30, 31, 0]],
222 [[0, 0, 0, 0, 0, 0, 1],
223 [2, 3, 4, 5, 6, 7, 8],
224 [9, 10, 11, 12, 13, 14, 15],
225 [16, 17, 18, 19, 20, 21, 22],
226 [23, 24, 25, 26, 27, 28, 29],
227 [30, 31, 0, 0, 0, 0, 0]],
228 [[0, 0, 1, 2, 3, 4, 5],
229 [6, 7, 8, 9, 10, 11, 12],
230 [13, 14, 15, 16, 17, 18, 19],
231 [20, 21, 22, 23, 24, 25, 26],
232 [27, 28, 29, 30, 0, 0, 0]]],
233 [[[0, 0, 0, 0, 1, 2, 3],
234 [4, 5, 6, 7, 8, 9, 10],
235 [11, 12, 13, 14, 15, 16, 17],
236 [18, 19, 20, 21, 22, 23, 24],
237 [25, 26, 27, 28, 29, 30, 31]],
238 [[1, 2, 3, 4, 5, 6, 7],
239 [8, 9, 10, 11, 12, 13, 14],
240 [15, 16, 17, 18, 19, 20, 21],
241 [22, 23, 24, 25, 26, 27, 28],
242 [29, 30, 0, 0, 0, 0, 0]],
243 [[0, 0, 1, 2, 3, 4, 5],
244 [6, 7, 8, 9, 10, 11, 12],
245 [13, 14, 15, 16, 17, 18, 19],
246 [20, 21, 22, 23, 24, 25, 26],
247 [27, 28, 29, 30, 31, 0, 0]]]
248]
249
250result_2004_dates = \
251 [[['12/29/03 12/30/03 12/31/03 01/01/04 01/02/04 01/03/04 01/04/04',
252 '01/05/04 01/06/04 01/07/04 01/08/04 01/09/04 01/10/04 01/11/04',
253 '01/12/04 01/13/04 01/14/04 01/15/04 01/16/04 01/17/04 01/18/04',
254 '01/19/04 01/20/04 01/21/04 01/22/04 01/23/04 01/24/04 01/25/04',
255 '01/26/04 01/27/04 01/28/04 01/29/04 01/30/04 01/31/04 02/01/04'],
256 ['01/26/04 01/27/04 01/28/04 01/29/04 01/30/04 01/31/04 02/01/04',
257 '02/02/04 02/03/04 02/04/04 02/05/04 02/06/04 02/07/04 02/08/04',
258 '02/09/04 02/10/04 02/11/04 02/12/04 02/13/04 02/14/04 02/15/04',
259 '02/16/04 02/17/04 02/18/04 02/19/04 02/20/04 02/21/04 02/22/04',
260 '02/23/04 02/24/04 02/25/04 02/26/04 02/27/04 02/28/04 02/29/04'],
261 ['03/01/04 03/02/04 03/03/04 03/04/04 03/05/04 03/06/04 03/07/04',
262 '03/08/04 03/09/04 03/10/04 03/11/04 03/12/04 03/13/04 03/14/04',
263 '03/15/04 03/16/04 03/17/04 03/18/04 03/19/04 03/20/04 03/21/04',
264 '03/22/04 03/23/04 03/24/04 03/25/04 03/26/04 03/27/04 03/28/04',
265 '03/29/04 03/30/04 03/31/04 04/01/04 04/02/04 04/03/04 04/04/04']],
266 [['03/29/04 03/30/04 03/31/04 04/01/04 04/02/04 04/03/04 04/04/04',
267 '04/05/04 04/06/04 04/07/04 04/08/04 04/09/04 04/10/04 04/11/04',
268 '04/12/04 04/13/04 04/14/04 04/15/04 04/16/04 04/17/04 04/18/04',
269 '04/19/04 04/20/04 04/21/04 04/22/04 04/23/04 04/24/04 04/25/04',
270 '04/26/04 04/27/04 04/28/04 04/29/04 04/30/04 05/01/04 05/02/04'],
271 ['04/26/04 04/27/04 04/28/04 04/29/04 04/30/04 05/01/04 05/02/04',
272 '05/03/04 05/04/04 05/05/04 05/06/04 05/07/04 05/08/04 05/09/04',
273 '05/10/04 05/11/04 05/12/04 05/13/04 05/14/04 05/15/04 05/16/04',
274 '05/17/04 05/18/04 05/19/04 05/20/04 05/21/04 05/22/04 05/23/04',
275 '05/24/04 05/25/04 05/26/04 05/27/04 05/28/04 05/29/04 05/30/04',
276 '05/31/04 06/01/04 06/02/04 06/03/04 06/04/04 06/05/04 06/06/04'],
277 ['05/31/04 06/01/04 06/02/04 06/03/04 06/04/04 06/05/04 06/06/04',
278 '06/07/04 06/08/04 06/09/04 06/10/04 06/11/04 06/12/04 06/13/04',
279 '06/14/04 06/15/04 06/16/04 06/17/04 06/18/04 06/19/04 06/20/04',
280 '06/21/04 06/22/04 06/23/04 06/24/04 06/25/04 06/26/04 06/27/04',
281 '06/28/04 06/29/04 06/30/04 07/01/04 07/02/04 07/03/04 07/04/04']],
282 [['06/28/04 06/29/04 06/30/04 07/01/04 07/02/04 07/03/04 07/04/04',
283 '07/05/04 07/06/04 07/07/04 07/08/04 07/09/04 07/10/04 07/11/04',
284 '07/12/04 07/13/04 07/14/04 07/15/04 07/16/04 07/17/04 07/18/04',
285 '07/19/04 07/20/04 07/21/04 07/22/04 07/23/04 07/24/04 07/25/04',
286 '07/26/04 07/27/04 07/28/04 07/29/04 07/30/04 07/31/04 08/01/04'],
287 ['07/26/04 07/27/04 07/28/04 07/29/04 07/30/04 07/31/04 08/01/04',
288 '08/02/04 08/03/04 08/04/04 08/05/04 08/06/04 08/07/04 08/08/04',
289 '08/09/04 08/10/04 08/11/04 08/12/04 08/13/04 08/14/04 08/15/04',
290 '08/16/04 08/17/04 08/18/04 08/19/04 08/20/04 08/21/04 08/22/04',
291 '08/23/04 08/24/04 08/25/04 08/26/04 08/27/04 08/28/04 08/29/04',
292 '08/30/04 08/31/04 09/01/04 09/02/04 09/03/04 09/04/04 09/05/04'],
293 ['08/30/04 08/31/04 09/01/04 09/02/04 09/03/04 09/04/04 09/05/04',
294 '09/06/04 09/07/04 09/08/04 09/09/04 09/10/04 09/11/04 09/12/04',
295 '09/13/04 09/14/04 09/15/04 09/16/04 09/17/04 09/18/04 09/19/04',
296 '09/20/04 09/21/04 09/22/04 09/23/04 09/24/04 09/25/04 09/26/04',
297 '09/27/04 09/28/04 09/29/04 09/30/04 10/01/04 10/02/04 10/03/04']],
298 [['09/27/04 09/28/04 09/29/04 09/30/04 10/01/04 10/02/04 10/03/04',
299 '10/04/04 10/05/04 10/06/04 10/07/04 10/08/04 10/09/04 10/10/04',
300 '10/11/04 10/12/04 10/13/04 10/14/04 10/15/04 10/16/04 10/17/04',
301 '10/18/04 10/19/04 10/20/04 10/21/04 10/22/04 10/23/04 10/24/04',
302 '10/25/04 10/26/04 10/27/04 10/28/04 10/29/04 10/30/04 10/31/04'],
303 ['11/01/04 11/02/04 11/03/04 11/04/04 11/05/04 11/06/04 11/07/04',
304 '11/08/04 11/09/04 11/10/04 11/11/04 11/12/04 11/13/04 11/14/04',
305 '11/15/04 11/16/04 11/17/04 11/18/04 11/19/04 11/20/04 11/21/04',
306 '11/22/04 11/23/04 11/24/04 11/25/04 11/26/04 11/27/04 11/28/04',
307 '11/29/04 11/30/04 12/01/04 12/02/04 12/03/04 12/04/04 12/05/04'],
308 ['11/29/04 11/30/04 12/01/04 12/02/04 12/03/04 12/04/04 12/05/04',
309 '12/06/04 12/07/04 12/08/04 12/09/04 12/10/04 12/11/04 12/12/04',
310 '12/13/04 12/14/04 12/15/04 12/16/04 12/17/04 12/18/04 12/19/04',
311 '12/20/04 12/21/04 12/22/04 12/23/04 12/24/04 12/25/04 12/26/04',
312 '12/27/04 12/28/04 12/29/04 12/30/04 12/31/04 01/01/05 01/02/05']]]
313
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000314
315class OutputTestCase(unittest.TestCase):
316 def normalize_calendar(self, s):
Mark Dickinson934896d2009-02-21 20:59:32 +0000317 # Filters out locale dependent strings
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000318 def neitherspacenordigit(c):
319 return not c.isspace() and not c.isdigit()
320
321 lines = []
Ezio Melottid8b509b2011-09-28 17:37:55 +0300322 for line in s.splitlines(keepends=False):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000323 # Drop texts, as they are locale dependent
324 if line and not filter(neitherspacenordigit, line):
325 lines.append(line)
326 return lines
327
R David Murrayd0c86952012-05-29 12:55:05 -0400328 def check_htmlcalendar_encoding(self, req, res):
329 cal = calendar.HTMLCalendar()
330 self.assertEqual(
Serhiy Storchakaaef859c2015-02-05 15:14:35 +0200331 cal.formatyearpage(2004, encoding=req),
332 (result_2004_html % {'e': res}).encode(res)
R David Murrayd0c86952012-05-29 12:55:05 -0400333 )
334
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000335 def test_output(self):
336 self.assertEqual(
337 self.normalize_calendar(calendar.calendar(2004)),
338 self.normalize_calendar(result_2004_text)
339 )
340
341 def test_output_textcalendar(self):
342 self.assertEqual(
Serhiy Storchakaaef859c2015-02-05 15:14:35 +0200343 calendar.TextCalendar().formatyear(2004),
344 result_2004_text
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000345 )
346
R David Murrayd0c86952012-05-29 12:55:05 -0400347 def test_output_htmlcalendar_encoding_ascii(self):
348 self.check_htmlcalendar_encoding('ascii', 'ascii')
349
350 def test_output_htmlcalendar_encoding_utf8(self):
351 self.check_htmlcalendar_encoding('utf-8', 'utf-8')
352
353 def test_output_htmlcalendar_encoding_default(self):
354 self.check_htmlcalendar_encoding(None, sys.getdefaultencoding())
355
356 def test_yeardatescalendar(self):
357 def shrink(cal):
R David Murraybb756782012-05-30 08:10:54 -0400358 return [[[' '.join('{:02d}/{:02d}/{}'.format(
359 d.month, d.day, str(d.year)[-2:]) for d in z)
360 for z in y] for y in x] for x in cal]
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000361 self.assertEqual(
R David Murrayd0c86952012-05-29 12:55:05 -0400362 shrink(calendar.Calendar().yeardatescalendar(2004)),
363 result_2004_dates
364 )
365
366 def test_yeardayscalendar(self):
367 self.assertEqual(
368 calendar.Calendar().yeardayscalendar(2004),
369 result_2004_days
370 )
371
372 def test_formatweekheader_short(self):
373 self.assertEqual(
374 calendar.TextCalendar().formatweekheader(2),
375 'Mo Tu We Th Fr Sa Su'
376 )
377
378 def test_formatweekheader_long(self):
379 self.assertEqual(
380 calendar.TextCalendar().formatweekheader(9),
381 ' Monday Tuesday Wednesday Thursday '
382 ' Friday Saturday Sunday '
383 )
384
385 def test_formatmonth(self):
386 self.assertEqual(
Serhiy Storchakaaef859c2015-02-05 15:14:35 +0200387 calendar.TextCalendar().formatmonth(2004, 1),
388 result_2004_01_text
R David Murrayd0c86952012-05-29 12:55:05 -0400389 )
390
391 def test_formatmonthname_with_year(self):
392 self.assertEqual(
393 calendar.HTMLCalendar().formatmonthname(2004, 1, withyear=True),
394 '<tr><th colspan="7" class="month">January 2004</th></tr>'
395 )
396
397 def test_formatmonthname_without_year(self):
398 self.assertEqual(
399 calendar.HTMLCalendar().formatmonthname(2004, 1, withyear=False),
400 '<tr><th colspan="7" class="month">January</th></tr>'
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000401 )
402
Ezio Melotti87f09372013-09-14 04:55:53 +0300403 def test_prweek(self):
404 with support.captured_stdout() as out:
405 week = [(1,0), (2,1), (3,2), (4,3), (5,4), (6,5), (7,6)]
406 calendar.TextCalendar().prweek(week, 1)
407 self.assertEqual(out.getvalue().strip(), "1 2 3 4 5 6 7")
408
409 def test_prmonth(self):
410 with support.captured_stdout() as out:
411 calendar.TextCalendar().prmonth(2004, 1)
412 output = out.getvalue().strip()
413 self.assertEqual(output, result_2004_01_text.strip())
414
415 def test_pryear(self):
416 with support.captured_stdout() as out:
417 calendar.TextCalendar().pryear(2004)
418 self.assertEqual(out.getvalue().strip(), result_2004_text.strip())
419
420 def test_format(self):
421 with support.captured_stdout() as out:
422 calendar.format(["1", "2", "3"], colwidth=3, spacing=1)
423 self.assertEqual(out.getvalue().strip(), "1 2 3")
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000424
Fred Draked077ca12001-12-12 05:38:08 +0000425class CalendarTestCase(unittest.TestCase):
426 def test_isleap(self):
427 # Make sure that the return is right for a few years, and
428 # ensure that the return values are 1 or 0, not just true or
429 # false (see SF bug #485794). Specific additional tests may
430 # be appropriate; this tests a single "cycle".
431 self.assertEqual(calendar.isleap(2000), 1)
432 self.assertEqual(calendar.isleap(2001), 0)
433 self.assertEqual(calendar.isleap(2002), 0)
434 self.assertEqual(calendar.isleap(2003), 0)
435
436 def test_setfirstweekday(self):
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000437 self.assertRaises(TypeError, calendar.setfirstweekday, 'flabber')
Fred Draked077ca12001-12-12 05:38:08 +0000438 self.assertRaises(ValueError, calendar.setfirstweekday, -1)
439 self.assertRaises(ValueError, calendar.setfirstweekday, 200)
440 orig = calendar.firstweekday()
441 calendar.setfirstweekday(calendar.SUNDAY)
442 self.assertEqual(calendar.firstweekday(), calendar.SUNDAY)
443 calendar.setfirstweekday(calendar.MONDAY)
444 self.assertEqual(calendar.firstweekday(), calendar.MONDAY)
445 calendar.setfirstweekday(orig)
446
R David Murrayd0c86952012-05-29 12:55:05 -0400447 def test_illegal_weekday_reported(self):
448 with self.assertRaisesRegex(calendar.IllegalWeekdayError, '123'):
449 calendar.setfirstweekday(123)
450
451 def test_enumerate_weekdays(self):
Skip Montanaro693c6c42002-03-15 03:57:04 +0000452 self.assertRaises(IndexError, calendar.day_abbr.__getitem__, -10)
453 self.assertRaises(IndexError, calendar.day_name.__getitem__, 10)
454 self.assertEqual(len([d for d in calendar.day_abbr]), 7)
Fred Draked077ca12001-12-12 05:38:08 +0000455
Tim Peters0c2c8e72002-03-23 03:26:53 +0000456 def test_days(self):
457 for attr in "day_name", "day_abbr":
458 value = getattr(calendar, attr)
459 self.assertEqual(len(value), 7)
460 self.assertEqual(len(value[:]), 7)
461 # ensure they're all unique
Tim Petersbbc0d442004-11-13 16:18:32 +0000462 self.assertEqual(len(set(value)), 7)
463 # verify it "acts like a sequence" in two forms of iteration
464 self.assertEqual(value[::-1], list(reversed(value)))
Tim Peters0c2c8e72002-03-23 03:26:53 +0000465
466 def test_months(self):
467 for attr in "month_name", "month_abbr":
468 value = getattr(calendar, attr)
469 self.assertEqual(len(value), 13)
470 self.assertEqual(len(value[:]), 13)
471 self.assertEqual(value[0], "")
472 # ensure they're all unique
Tim Petersbbc0d442004-11-13 16:18:32 +0000473 self.assertEqual(len(set(value)), 13)
474 # verify it "acts like a sequence" in two forms of iteration
475 self.assertEqual(value[::-1], list(reversed(value)))
Tim Peters0c2c8e72002-03-23 03:26:53 +0000476
R David Murrayd0c86952012-05-29 12:55:05 -0400477 def test_locale_calendars(self):
Georg Brandl7004bd12010-10-19 18:54:25 +0000478 # ensure that Locale{Text,HTML}Calendar resets the locale properly
479 # (it is still not thread-safe though)
Georg Brandl7004bd12010-10-19 18:54:25 +0000480 old_october = calendar.TextCalendar().formatmonthname(2010, 10, 10)
Georg Brandl9450cc02010-10-20 06:50:19 +0000481 try:
Serhiy Storchakaf9fcdb72013-01-31 16:00:42 +0200482 cal = calendar.LocaleTextCalendar(locale='')
483 local_weekday = cal.formatweekday(1, 10)
484 local_month = cal.formatmonthname(2010, 10, 10)
Georg Brandl9450cc02010-10-20 06:50:19 +0000485 except locale.Error:
486 # cannot set the system default locale -- skip rest of test
Serhiy Storchakaf9fcdb72013-01-31 16:00:42 +0200487 raise unittest.SkipTest('cannot set the system default locale')
488 self.assertIsInstance(local_weekday, str)
489 self.assertIsInstance(local_month, str)
490 self.assertEqual(len(local_weekday), 10)
491 self.assertGreaterEqual(len(local_month), 10)
492 cal = calendar.LocaleHTMLCalendar(locale='')
493 local_weekday = cal.formatweekday(1)
494 local_month = cal.formatmonthname(2010, 10)
495 self.assertIsInstance(local_weekday, str)
496 self.assertIsInstance(local_month, str)
Georg Brandl7004bd12010-10-19 18:54:25 +0000497 new_october = calendar.TextCalendar().formatmonthname(2010, 10, 10)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000498 self.assertEqual(old_october, new_october)
Georg Brandl7004bd12010-10-19 18:54:25 +0000499
Ezio Melotti85710a42012-09-21 17:26:35 +0300500 def test_itermonthdates(self):
501 # ensure itermonthdates doesn't overflow after datetime.MAXYEAR
502 # see #15421
503 list(calendar.Calendar().itermonthdates(datetime.MAXYEAR, 12))
504
Walter Dörwald59ad4562004-07-02 19:00:09 +0000505
506class MonthCalendarTestCase(unittest.TestCase):
507 def setUp(self):
508 self.oldfirstweekday = calendar.firstweekday()
509 calendar.setfirstweekday(self.firstweekday)
510
511 def tearDown(self):
512 calendar.setfirstweekday(self.oldfirstweekday)
513
514 def check_weeks(self, year, month, weeks):
515 cal = calendar.monthcalendar(year, month)
516 self.assertEqual(len(cal), len(weeks))
Guido van Rossum805365e2007-05-07 22:24:25 +0000517 for i in range(len(weeks)):
Walter Dörwald59ad4562004-07-02 19:00:09 +0000518 self.assertEqual(weeks[i], sum(day != 0 for day in cal[i]))
519
520
521class MondayTestCase(MonthCalendarTestCase):
522 firstweekday = calendar.MONDAY
523
524 def test_february(self):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000525 # A 28-day february starting on monday (7+7+7+7 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000526 self.check_weeks(1999, 2, (7, 7, 7, 7))
527
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000528 # A 28-day february starting on tuesday (6+7+7+7+1 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000529 self.check_weeks(2005, 2, (6, 7, 7, 7, 1))
530
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000531 # A 28-day february starting on sunday (1+7+7+7+6 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000532 self.check_weeks(1987, 2, (1, 7, 7, 7, 6))
533
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000534 # A 29-day february starting on monday (7+7+7+7+1 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000535 self.check_weeks(1988, 2, (7, 7, 7, 7, 1))
536
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000537 # A 29-day february starting on tuesday (6+7+7+7+2 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000538 self.check_weeks(1972, 2, (6, 7, 7, 7, 2))
539
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000540 # A 29-day february starting on sunday (1+7+7+7+7 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000541 self.check_weeks(2004, 2, (1, 7, 7, 7, 7))
542
543 def test_april(self):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000544 # A 30-day april starting on monday (7+7+7+7+2 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000545 self.check_weeks(1935, 4, (7, 7, 7, 7, 2))
546
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000547 # A 30-day april starting on tuesday (6+7+7+7+3 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000548 self.check_weeks(1975, 4, (6, 7, 7, 7, 3))
549
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000550 # A 30-day april starting on sunday (1+7+7+7+7+1 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000551 self.check_weeks(1945, 4, (1, 7, 7, 7, 7, 1))
552
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000553 # A 30-day april starting on saturday (2+7+7+7+7 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000554 self.check_weeks(1995, 4, (2, 7, 7, 7, 7))
555
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000556 # A 30-day april starting on friday (3+7+7+7+6 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000557 self.check_weeks(1994, 4, (3, 7, 7, 7, 6))
558
559 def test_december(self):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000560 # A 31-day december starting on monday (7+7+7+7+3 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000561 self.check_weeks(1980, 12, (7, 7, 7, 7, 3))
562
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000563 # A 31-day december starting on tuesday (6+7+7+7+4 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000564 self.check_weeks(1987, 12, (6, 7, 7, 7, 4))
565
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000566 # A 31-day december starting on sunday (1+7+7+7+7+2 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000567 self.check_weeks(1968, 12, (1, 7, 7, 7, 7, 2))
568
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000569 # A 31-day december starting on thursday (4+7+7+7+6 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000570 self.check_weeks(1988, 12, (4, 7, 7, 7, 6))
571
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000572 # A 31-day december starting on friday (3+7+7+7+7 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000573 self.check_weeks(2017, 12, (3, 7, 7, 7, 7))
574
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000575 # A 31-day december starting on saturday (2+7+7+7+7+1 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000576 self.check_weeks(2068, 12, (2, 7, 7, 7, 7, 1))
577
578
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000579class SundayTestCase(MonthCalendarTestCase):
580 firstweekday = calendar.SUNDAY
581
582 def test_february(self):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000583 # A 28-day february starting on sunday (7+7+7+7 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000584 self.check_weeks(2009, 2, (7, 7, 7, 7))
585
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000586 # A 28-day february starting on monday (6+7+7+7+1 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000587 self.check_weeks(1999, 2, (6, 7, 7, 7, 1))
588
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000589 # A 28-day february starting on saturday (1+7+7+7+6 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000590 self.check_weeks(1997, 2, (1, 7, 7, 7, 6))
591
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000592 # A 29-day february starting on sunday (7+7+7+7+1 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000593 self.check_weeks(2004, 2, (7, 7, 7, 7, 1))
594
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000595 # A 29-day february starting on monday (6+7+7+7+2 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000596 self.check_weeks(1960, 2, (6, 7, 7, 7, 2))
597
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000598 # A 29-day february starting on saturday (1+7+7+7+7 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000599 self.check_weeks(1964, 2, (1, 7, 7, 7, 7))
600
601 def test_april(self):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000602 # A 30-day april starting on sunday (7+7+7+7+2 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000603 self.check_weeks(1923, 4, (7, 7, 7, 7, 2))
604
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000605 # A 30-day april starting on monday (6+7+7+7+3 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000606 self.check_weeks(1918, 4, (6, 7, 7, 7, 3))
607
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000608 # A 30-day april starting on saturday (1+7+7+7+7+1 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000609 self.check_weeks(1950, 4, (1, 7, 7, 7, 7, 1))
610
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000611 # A 30-day april starting on friday (2+7+7+7+7 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000612 self.check_weeks(1960, 4, (2, 7, 7, 7, 7))
613
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000614 # A 30-day april starting on thursday (3+7+7+7+6 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000615 self.check_weeks(1909, 4, (3, 7, 7, 7, 6))
616
617 def test_december(self):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000618 # A 31-day december starting on sunday (7+7+7+7+3 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000619 self.check_weeks(2080, 12, (7, 7, 7, 7, 3))
620
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000621 # A 31-day december starting on monday (6+7+7+7+4 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000622 self.check_weeks(1941, 12, (6, 7, 7, 7, 4))
623
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000624 # A 31-day december starting on saturday (1+7+7+7+7+2 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000625 self.check_weeks(1923, 12, (1, 7, 7, 7, 7, 2))
626
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000627 # A 31-day december starting on wednesday (4+7+7+7+6 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000628 self.check_weeks(1948, 12, (4, 7, 7, 7, 6))
629
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000630 # A 31-day december starting on thursday (3+7+7+7+7 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000631 self.check_weeks(1927, 12, (3, 7, 7, 7, 7))
632
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000633 # A 31-day december starting on friday (2+7+7+7+7+1 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000634 self.check_weeks(1995, 12, (2, 7, 7, 7, 7, 1))
635
Alexander Belopolsky43ca7102010-06-14 17:32:03 +0000636class TimegmTestCase(unittest.TestCase):
637 TIMESTAMPS = [0, 10, 100, 1000, 10000, 100000, 1000000,
638 1234567890, 1262304000, 1275785153,]
639 def test_timegm(self):
640 for secs in self.TIMESTAMPS:
641 tuple = time.gmtime(secs)
642 self.assertEqual(secs, calendar.timegm(tuple))
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000643
Brett Cannoncfae36f2010-07-23 13:54:14 +0000644class MonthRangeTestCase(unittest.TestCase):
645 def test_january(self):
646 # Tests valid lower boundary case.
647 self.assertEqual(calendar.monthrange(2004,1), (3,31))
648
649 def test_february_leap(self):
650 # Tests February during leap year.
651 self.assertEqual(calendar.monthrange(2004,2), (6,29))
652
653 def test_february_nonleap(self):
654 # Tests February in non-leap year.
655 self.assertEqual(calendar.monthrange(2010,2), (0,28))
656
657 def test_december(self):
658 # Tests valid upper boundary case.
659 self.assertEqual(calendar.monthrange(2004,12), (2,31))
660
661 def test_zeroth_month(self):
662 # Tests low invalid boundary case.
663 with self.assertRaises(calendar.IllegalMonthError):
664 calendar.monthrange(2004, 0)
665
666 def test_thirteenth_month(self):
667 # Tests high invalid boundary case.
668 with self.assertRaises(calendar.IllegalMonthError):
669 calendar.monthrange(2004, 13)
670
R David Murrayd0c86952012-05-29 12:55:05 -0400671 def test_illegal_month_reported(self):
672 with self.assertRaisesRegex(calendar.IllegalMonthError, '65'):
673 calendar.monthrange(2004, 65)
674
R. David Murray1daaf9e2010-12-31 19:21:14 +0000675class LeapdaysTestCase(unittest.TestCase):
676 def test_no_range(self):
677 # test when no range i.e. two identical years as args
678 self.assertEqual(calendar.leapdays(2010,2010), 0)
679
680 def test_no_leapdays(self):
681 # test when no leap years in range
682 self.assertEqual(calendar.leapdays(2010,2011), 0)
683
684 def test_no_leapdays_upper_boundary(self):
685 # test no leap years in range, when upper boundary is a leap year
686 self.assertEqual(calendar.leapdays(2010,2012), 0)
687
688 def test_one_leapday_lower_boundary(self):
689 # test when one leap year in range, lower boundary is leap year
690 self.assertEqual(calendar.leapdays(2012,2013), 1)
691
692 def test_several_leapyears_in_range(self):
693 self.assertEqual(calendar.leapdays(1997,2020), 5)
694
Brett Cannoncfae36f2010-07-23 13:54:14 +0000695
Serhiy Storchakaaef859c2015-02-05 15:14:35 +0200696def conv(s):
697 return s.replace('\n', os.linesep).encode()
Senthil Kumaran962fed92011-08-11 09:22:52 +0800698
Serhiy Storchakaaef859c2015-02-05 15:14:35 +0200699class CommandLineTestCase(unittest.TestCase):
700 def run_ok(self, *args):
701 return assert_python_ok('-m', 'calendar', *args)[1]
702
703 def assertFailure(self, *args):
704 rc, stdout, stderr = assert_python_failure('-m', 'calendar', *args)
705 self.assertIn(b'Usage:', stderr)
706 self.assertEqual(rc, 2)
707
708 def test_help(self):
709 stdout = self.run_ok('-h')
710 self.assertIn(b'Usage:', stdout)
711 self.assertIn(b'calendar.py', stdout)
712 self.assertIn(b'--help', stdout)
713
714 def test_illegal_arguments(self):
715 self.assertFailure('-z')
716 #self.assertFailure('spam')
717 #self.assertFailure('2004', 'spam')
718 self.assertFailure('-t', 'html', '2004', '1')
719
720 def test_output_current_year(self):
721 stdout = self.run_ok()
722 year = datetime.datetime.now().year
723 self.assertIn((' %s' % year).encode(), stdout)
724 self.assertIn(b'January', stdout)
725 self.assertIn(b'Mo Tu We Th Fr Sa Su', stdout)
726
727 def test_output_year(self):
728 stdout = self.run_ok('2004')
729 self.assertEqual(stdout, conv(result_2004_text))
730
731 def test_output_month(self):
732 stdout = self.run_ok('2004', '1')
733 self.assertEqual(stdout, conv(result_2004_01_text))
734
735 def test_option_encoding(self):
736 self.assertFailure('-e')
737 self.assertFailure('--encoding')
738 stdout = self.run_ok('--encoding', 'utf-16-le', '2004')
739 self.assertEqual(stdout, result_2004_text.encode('utf-16-le'))
740
741 def test_option_locale(self):
742 self.assertFailure('-L')
743 self.assertFailure('--locale')
744 self.assertFailure('-L', 'en')
745 lang, enc = locale.getdefaultlocale()
746 lang = lang or 'C'
747 enc = enc or 'UTF-8'
748 try:
749 oldlocale = locale.getlocale(locale.LC_TIME)
750 try:
751 locale.setlocale(locale.LC_TIME, (lang, enc))
752 finally:
753 locale.setlocale(locale.LC_TIME, oldlocale)
754 except (locale.Error, ValueError):
755 self.skipTest('cannot set the system default locale')
756 stdout = self.run_ok('--locale', lang, '--encoding', enc, '2004')
757 self.assertIn('2004'.encode(enc), stdout)
758
759 def test_option_width(self):
760 self.assertFailure('-w')
761 self.assertFailure('--width')
762 self.assertFailure('-w', 'spam')
763 stdout = self.run_ok('--width', '3', '2004')
764 self.assertIn(b'Mon Tue Wed Thu Fri Sat Sun', stdout)
765
766 def test_option_lines(self):
767 self.assertFailure('-l')
768 self.assertFailure('--lines')
769 self.assertFailure('-l', 'spam')
770 stdout = self.run_ok('--lines', '2', '2004')
771 self.assertIn(conv('December\n\nMo Tu We'), stdout)
772
773 def test_option_spacing(self):
774 self.assertFailure('-s')
775 self.assertFailure('--spacing')
776 self.assertFailure('-s', 'spam')
777 stdout = self.run_ok('--spacing', '8', '2004')
778 self.assertIn(b'Su Mo', stdout)
779
780 def test_option_months(self):
781 self.assertFailure('-m')
782 self.assertFailure('--month')
783 self.assertFailure('-m', 'spam')
784 stdout = self.run_ok('--months', '1', '2004')
785 self.assertIn(conv('\nMo Tu We Th Fr Sa Su\n'), stdout)
786
787 def test_option_type(self):
788 self.assertFailure('-t')
789 self.assertFailure('--type')
790 self.assertFailure('-t', 'spam')
791 stdout = self.run_ok('--type', 'text', '2004')
792 self.assertEqual(stdout, conv(result_2004_text))
793 stdout = self.run_ok('--type', 'html', '2004')
794 self.assertEqual(stdout[:6], b'<?xml ')
795 self.assertIn(b'<title>Calendar for 2004</title>', stdout)
796
797 def test_html_output_current_year(self):
798 stdout = self.run_ok('--type', 'html')
799 year = datetime.datetime.now().year
800 self.assertIn(('<title>Calendar for %s</title>' % year).encode(),
801 stdout)
802 self.assertIn(b'<tr><th colspan="7" class="month">January</th></tr>',
803 stdout)
804
805 def test_html_output_year_encoding(self):
806 stdout = self.run_ok('-t', 'html', '--encoding', 'ascii', '2004')
807 self.assertEqual(stdout,
808 (result_2004_html % {'e': 'ascii'}).encode('ascii'))
809
810 def test_html_output_year_css(self):
811 self.assertFailure('-t', 'html', '-c')
812 self.assertFailure('-t', 'html', '--css')
813 stdout = self.run_ok('-t', 'html', '--css', 'custom.css', '2004')
814 self.assertIn(b'<link rel="stylesheet" type="text/css" '
815 b'href="custom.css" />', stdout)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000816
Fred Draked077ca12001-12-12 05:38:08 +0000817
818if __name__ == "__main__":
Serhiy Storchakaaef859c2015-02-05 15:14:35 +0200819 unittest.main()