blob: 6c7cdd1baccfe0b93deece1f5778415e8177b614 [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
Berker Peksagce643912015-05-06 06:33:17 +03005from test.support.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
Alexander Belopolsky957b7562016-09-27 20:26:39 -0400505 def test_itermonthdays(self):
506 for firstweekday in range(7):
507 cal = calendar.Calendar(firstweekday)
508 # Test the extremes, see #28253 and #26650
509 for y, m in [(1, 1), (9999, 12)]:
510 days = list(cal.itermonthdays(y, m))
511 self.assertIn(len(days), (35, 42))
512 # Test a short month
513 cal = calendar.Calendar(firstweekday=3)
514 days = list(cal.itermonthdays(2001, 2))
515 self.assertEqual(days, list(range(1, 29)))
516
517 def test_itermonthdays2(self):
518 for firstweekday in range(7):
519 cal = calendar.Calendar(firstweekday)
520 # Test the extremes, see #28253 and #26650
521 for y, m in [(1, 1), (9999, 12)]:
522 days = list(cal.itermonthdays2(y, m))
523 self.assertEqual(days[0][1], firstweekday)
524 self.assertEqual(days[-1][1], (firstweekday - 1) % 7)
525
Walter Dörwald59ad4562004-07-02 19:00:09 +0000526
527class MonthCalendarTestCase(unittest.TestCase):
528 def setUp(self):
529 self.oldfirstweekday = calendar.firstweekday()
530 calendar.setfirstweekday(self.firstweekday)
531
532 def tearDown(self):
533 calendar.setfirstweekday(self.oldfirstweekday)
534
535 def check_weeks(self, year, month, weeks):
536 cal = calendar.monthcalendar(year, month)
537 self.assertEqual(len(cal), len(weeks))
Guido van Rossum805365e2007-05-07 22:24:25 +0000538 for i in range(len(weeks)):
Walter Dörwald59ad4562004-07-02 19:00:09 +0000539 self.assertEqual(weeks[i], sum(day != 0 for day in cal[i]))
540
541
542class MondayTestCase(MonthCalendarTestCase):
543 firstweekday = calendar.MONDAY
544
545 def test_february(self):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000546 # A 28-day february starting on monday (7+7+7+7 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000547 self.check_weeks(1999, 2, (7, 7, 7, 7))
548
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000549 # A 28-day february starting on tuesday (6+7+7+7+1 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000550 self.check_weeks(2005, 2, (6, 7, 7, 7, 1))
551
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000552 # A 28-day february starting on sunday (1+7+7+7+6 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000553 self.check_weeks(1987, 2, (1, 7, 7, 7, 6))
554
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000555 # A 29-day february starting on monday (7+7+7+7+1 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000556 self.check_weeks(1988, 2, (7, 7, 7, 7, 1))
557
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000558 # A 29-day february starting on tuesday (6+7+7+7+2 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000559 self.check_weeks(1972, 2, (6, 7, 7, 7, 2))
560
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000561 # A 29-day february starting on sunday (1+7+7+7+7 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000562 self.check_weeks(2004, 2, (1, 7, 7, 7, 7))
563
564 def test_april(self):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000565 # A 30-day april starting on monday (7+7+7+7+2 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000566 self.check_weeks(1935, 4, (7, 7, 7, 7, 2))
567
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000568 # A 30-day april starting on tuesday (6+7+7+7+3 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000569 self.check_weeks(1975, 4, (6, 7, 7, 7, 3))
570
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000571 # A 30-day april starting on sunday (1+7+7+7+7+1 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000572 self.check_weeks(1945, 4, (1, 7, 7, 7, 7, 1))
573
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000574 # A 30-day april starting on saturday (2+7+7+7+7 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000575 self.check_weeks(1995, 4, (2, 7, 7, 7, 7))
576
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000577 # A 30-day april starting on friday (3+7+7+7+6 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000578 self.check_weeks(1994, 4, (3, 7, 7, 7, 6))
579
580 def test_december(self):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000581 # A 31-day december starting on monday (7+7+7+7+3 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000582 self.check_weeks(1980, 12, (7, 7, 7, 7, 3))
583
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000584 # A 31-day december starting on tuesday (6+7+7+7+4 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000585 self.check_weeks(1987, 12, (6, 7, 7, 7, 4))
586
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000587 # A 31-day december starting on sunday (1+7+7+7+7+2 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000588 self.check_weeks(1968, 12, (1, 7, 7, 7, 7, 2))
589
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000590 # A 31-day december starting on thursday (4+7+7+7+6 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000591 self.check_weeks(1988, 12, (4, 7, 7, 7, 6))
592
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000593 # A 31-day december starting on friday (3+7+7+7+7 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000594 self.check_weeks(2017, 12, (3, 7, 7, 7, 7))
595
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000596 # A 31-day december starting on saturday (2+7+7+7+7+1 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000597 self.check_weeks(2068, 12, (2, 7, 7, 7, 7, 1))
598
599
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000600class SundayTestCase(MonthCalendarTestCase):
601 firstweekday = calendar.SUNDAY
602
603 def test_february(self):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000604 # A 28-day february starting on sunday (7+7+7+7 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000605 self.check_weeks(2009, 2, (7, 7, 7, 7))
606
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000607 # A 28-day february starting on monday (6+7+7+7+1 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000608 self.check_weeks(1999, 2, (6, 7, 7, 7, 1))
609
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000610 # A 28-day february starting on saturday (1+7+7+7+6 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000611 self.check_weeks(1997, 2, (1, 7, 7, 7, 6))
612
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000613 # A 29-day february starting on sunday (7+7+7+7+1 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000614 self.check_weeks(2004, 2, (7, 7, 7, 7, 1))
615
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000616 # A 29-day february starting on monday (6+7+7+7+2 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000617 self.check_weeks(1960, 2, (6, 7, 7, 7, 2))
618
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000619 # A 29-day february starting on saturday (1+7+7+7+7 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000620 self.check_weeks(1964, 2, (1, 7, 7, 7, 7))
621
622 def test_april(self):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000623 # A 30-day april starting on sunday (7+7+7+7+2 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000624 self.check_weeks(1923, 4, (7, 7, 7, 7, 2))
625
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000626 # A 30-day april starting on monday (6+7+7+7+3 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000627 self.check_weeks(1918, 4, (6, 7, 7, 7, 3))
628
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000629 # A 30-day april starting on saturday (1+7+7+7+7+1 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000630 self.check_weeks(1950, 4, (1, 7, 7, 7, 7, 1))
631
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000632 # A 30-day april starting on friday (2+7+7+7+7 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000633 self.check_weeks(1960, 4, (2, 7, 7, 7, 7))
634
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000635 # A 30-day april starting on thursday (3+7+7+7+6 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000636 self.check_weeks(1909, 4, (3, 7, 7, 7, 6))
637
638 def test_december(self):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000639 # A 31-day december starting on sunday (7+7+7+7+3 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000640 self.check_weeks(2080, 12, (7, 7, 7, 7, 3))
641
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000642 # A 31-day december starting on monday (6+7+7+7+4 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000643 self.check_weeks(1941, 12, (6, 7, 7, 7, 4))
644
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000645 # A 31-day december starting on saturday (1+7+7+7+7+2 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000646 self.check_weeks(1923, 12, (1, 7, 7, 7, 7, 2))
647
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000648 # A 31-day december starting on wednesday (4+7+7+7+6 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000649 self.check_weeks(1948, 12, (4, 7, 7, 7, 6))
650
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000651 # A 31-day december starting on thursday (3+7+7+7+7 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000652 self.check_weeks(1927, 12, (3, 7, 7, 7, 7))
653
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000654 # A 31-day december starting on friday (2+7+7+7+7+1 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000655 self.check_weeks(1995, 12, (2, 7, 7, 7, 7, 1))
656
Alexander Belopolsky43ca7102010-06-14 17:32:03 +0000657class TimegmTestCase(unittest.TestCase):
658 TIMESTAMPS = [0, 10, 100, 1000, 10000, 100000, 1000000,
659 1234567890, 1262304000, 1275785153,]
660 def test_timegm(self):
661 for secs in self.TIMESTAMPS:
662 tuple = time.gmtime(secs)
663 self.assertEqual(secs, calendar.timegm(tuple))
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000664
Brett Cannoncfae36f2010-07-23 13:54:14 +0000665class MonthRangeTestCase(unittest.TestCase):
666 def test_january(self):
667 # Tests valid lower boundary case.
668 self.assertEqual(calendar.monthrange(2004,1), (3,31))
669
670 def test_february_leap(self):
671 # Tests February during leap year.
672 self.assertEqual(calendar.monthrange(2004,2), (6,29))
673
674 def test_february_nonleap(self):
675 # Tests February in non-leap year.
676 self.assertEqual(calendar.monthrange(2010,2), (0,28))
677
678 def test_december(self):
679 # Tests valid upper boundary case.
680 self.assertEqual(calendar.monthrange(2004,12), (2,31))
681
682 def test_zeroth_month(self):
683 # Tests low invalid boundary case.
684 with self.assertRaises(calendar.IllegalMonthError):
685 calendar.monthrange(2004, 0)
686
687 def test_thirteenth_month(self):
688 # Tests high invalid boundary case.
689 with self.assertRaises(calendar.IllegalMonthError):
690 calendar.monthrange(2004, 13)
691
R David Murrayd0c86952012-05-29 12:55:05 -0400692 def test_illegal_month_reported(self):
693 with self.assertRaisesRegex(calendar.IllegalMonthError, '65'):
694 calendar.monthrange(2004, 65)
695
R. David Murray1daaf9e2010-12-31 19:21:14 +0000696class LeapdaysTestCase(unittest.TestCase):
697 def test_no_range(self):
698 # test when no range i.e. two identical years as args
699 self.assertEqual(calendar.leapdays(2010,2010), 0)
700
701 def test_no_leapdays(self):
702 # test when no leap years in range
703 self.assertEqual(calendar.leapdays(2010,2011), 0)
704
705 def test_no_leapdays_upper_boundary(self):
706 # test no leap years in range, when upper boundary is a leap year
707 self.assertEqual(calendar.leapdays(2010,2012), 0)
708
709 def test_one_leapday_lower_boundary(self):
710 # test when one leap year in range, lower boundary is leap year
711 self.assertEqual(calendar.leapdays(2012,2013), 1)
712
713 def test_several_leapyears_in_range(self):
714 self.assertEqual(calendar.leapdays(1997,2020), 5)
715
Brett Cannoncfae36f2010-07-23 13:54:14 +0000716
Serhiy Storchakaaef859c2015-02-05 15:14:35 +0200717def conv(s):
718 return s.replace('\n', os.linesep).encode()
Senthil Kumaran962fed92011-08-11 09:22:52 +0800719
Serhiy Storchakaaef859c2015-02-05 15:14:35 +0200720class CommandLineTestCase(unittest.TestCase):
721 def run_ok(self, *args):
722 return assert_python_ok('-m', 'calendar', *args)[1]
723
724 def assertFailure(self, *args):
725 rc, stdout, stderr = assert_python_failure('-m', 'calendar', *args)
Serhiy Storchaka97852612015-11-01 17:14:27 +0200726 self.assertIn(b'usage:', stderr)
Serhiy Storchakaaef859c2015-02-05 15:14:35 +0200727 self.assertEqual(rc, 2)
728
729 def test_help(self):
730 stdout = self.run_ok('-h')
Serhiy Storchaka97852612015-11-01 17:14:27 +0200731 self.assertIn(b'usage:', stdout)
Serhiy Storchakaaef859c2015-02-05 15:14:35 +0200732 self.assertIn(b'calendar.py', stdout)
733 self.assertIn(b'--help', stdout)
734
735 def test_illegal_arguments(self):
736 self.assertFailure('-z')
Serhiy Storchaka97852612015-11-01 17:14:27 +0200737 self.assertFailure('spam')
738 self.assertFailure('2004', 'spam')
Serhiy Storchakaaef859c2015-02-05 15:14:35 +0200739 self.assertFailure('-t', 'html', '2004', '1')
740
741 def test_output_current_year(self):
742 stdout = self.run_ok()
743 year = datetime.datetime.now().year
744 self.assertIn((' %s' % year).encode(), stdout)
745 self.assertIn(b'January', stdout)
746 self.assertIn(b'Mo Tu We Th Fr Sa Su', stdout)
747
748 def test_output_year(self):
749 stdout = self.run_ok('2004')
750 self.assertEqual(stdout, conv(result_2004_text))
751
752 def test_output_month(self):
753 stdout = self.run_ok('2004', '1')
754 self.assertEqual(stdout, conv(result_2004_01_text))
755
756 def test_option_encoding(self):
757 self.assertFailure('-e')
758 self.assertFailure('--encoding')
759 stdout = self.run_ok('--encoding', 'utf-16-le', '2004')
760 self.assertEqual(stdout, result_2004_text.encode('utf-16-le'))
761
762 def test_option_locale(self):
763 self.assertFailure('-L')
764 self.assertFailure('--locale')
765 self.assertFailure('-L', 'en')
766 lang, enc = locale.getdefaultlocale()
767 lang = lang or 'C'
768 enc = enc or 'UTF-8'
769 try:
770 oldlocale = locale.getlocale(locale.LC_TIME)
771 try:
772 locale.setlocale(locale.LC_TIME, (lang, enc))
773 finally:
774 locale.setlocale(locale.LC_TIME, oldlocale)
775 except (locale.Error, ValueError):
776 self.skipTest('cannot set the system default locale')
777 stdout = self.run_ok('--locale', lang, '--encoding', enc, '2004')
778 self.assertIn('2004'.encode(enc), stdout)
779
780 def test_option_width(self):
781 self.assertFailure('-w')
782 self.assertFailure('--width')
783 self.assertFailure('-w', 'spam')
784 stdout = self.run_ok('--width', '3', '2004')
785 self.assertIn(b'Mon Tue Wed Thu Fri Sat Sun', stdout)
786
787 def test_option_lines(self):
788 self.assertFailure('-l')
789 self.assertFailure('--lines')
790 self.assertFailure('-l', 'spam')
791 stdout = self.run_ok('--lines', '2', '2004')
792 self.assertIn(conv('December\n\nMo Tu We'), stdout)
793
794 def test_option_spacing(self):
795 self.assertFailure('-s')
796 self.assertFailure('--spacing')
797 self.assertFailure('-s', 'spam')
798 stdout = self.run_ok('--spacing', '8', '2004')
799 self.assertIn(b'Su Mo', stdout)
800
801 def test_option_months(self):
802 self.assertFailure('-m')
803 self.assertFailure('--month')
804 self.assertFailure('-m', 'spam')
805 stdout = self.run_ok('--months', '1', '2004')
806 self.assertIn(conv('\nMo Tu We Th Fr Sa Su\n'), stdout)
807
808 def test_option_type(self):
809 self.assertFailure('-t')
810 self.assertFailure('--type')
811 self.assertFailure('-t', 'spam')
812 stdout = self.run_ok('--type', 'text', '2004')
813 self.assertEqual(stdout, conv(result_2004_text))
814 stdout = self.run_ok('--type', 'html', '2004')
815 self.assertEqual(stdout[:6], b'<?xml ')
816 self.assertIn(b'<title>Calendar for 2004</title>', stdout)
817
818 def test_html_output_current_year(self):
819 stdout = self.run_ok('--type', 'html')
820 year = datetime.datetime.now().year
821 self.assertIn(('<title>Calendar for %s</title>' % year).encode(),
822 stdout)
823 self.assertIn(b'<tr><th colspan="7" class="month">January</th></tr>',
824 stdout)
825
826 def test_html_output_year_encoding(self):
827 stdout = self.run_ok('-t', 'html', '--encoding', 'ascii', '2004')
828 self.assertEqual(stdout,
829 (result_2004_html % {'e': 'ascii'}).encode('ascii'))
830
831 def test_html_output_year_css(self):
832 self.assertFailure('-t', 'html', '-c')
833 self.assertFailure('-t', 'html', '--css')
834 stdout = self.run_ok('-t', 'html', '--css', 'custom.css', '2004')
835 self.assertIn(b'<link rel="stylesheet" type="text/css" '
836 b'href="custom.css" />', stdout)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000837
Fred Draked077ca12001-12-12 05:38:08 +0000838
Martin Panter4eb376c2016-01-16 06:49:30 +0000839class MiscTestCase(unittest.TestCase):
840 def test__all__(self):
Serhiy Storchaka2c1d3e32016-01-16 11:05:11 +0200841 blacklist = {'mdays', 'January', 'February', 'EPOCH',
Martin Panter4eb376c2016-01-16 06:49:30 +0000842 'MONDAY', 'TUESDAY', 'WEDNESDAY', 'THURSDAY', 'FRIDAY',
843 'SATURDAY', 'SUNDAY', 'different_locale', 'c',
844 'prweek', 'week', 'format', 'formatstring', 'main'}
845 support.check__all__(self, calendar, blacklist=blacklist)
846
847
Fred Draked077ca12001-12-12 05:38:08 +0000848if __name__ == "__main__":
Serhiy Storchakaaef859c2015-02-05 15:14:35 +0200849 unittest.main()