blob: c777f6483567ddb92633fac0e713800f0f608118 [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
Oz N Tiram8b7a4cc2017-06-06 11:35:59 +020060
61default_format = dict(year="year", month="month", encoding="ascii")
62
Serhiy Storchakaaef859c2015-02-05 15:14:35 +020063result_2004_html = """\
Oz N Tiram8b7a4cc2017-06-06 11:35:59 +020064<?xml version="1.0" encoding="{encoding}"?>
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000065<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
66<html>
67<head>
Oz N Tiram8b7a4cc2017-06-06 11:35:59 +020068<meta http-equiv="Content-Type" content="text/html; charset={encoding}" />
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000069<link rel="stylesheet" type="text/css" href="calendar.css" />
Thomas Wouters47b49bf2007-08-30 22:15:33 +000070<title>Calendar for 2004</title>
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000071</head>
72<body>
Oz N Tiram8b7a4cc2017-06-06 11:35:59 +020073<table border="0" cellpadding="0" cellspacing="0" class="{year}">
74<tr><th colspan="3" class="{year}">2004</th></tr><tr><td><table border="0" cellpadding="0" cellspacing="0" class="{month}">
75<tr><th colspan="7" class="{month}">January</th></tr>
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000076<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>
77<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>
78<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>
79<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>
80<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>
81<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>
82</table>
Oz N Tiram8b7a4cc2017-06-06 11:35:59 +020083</td><td><table border="0" cellpadding="0" cellspacing="0" class="{month}">
84<tr><th colspan="7" class="{month}">February</th></tr>
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000085<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>
86<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>
87<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>
88<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>
89<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>
90<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>
91</table>
Oz N Tiram8b7a4cc2017-06-06 11:35:59 +020092</td><td><table border="0" cellpadding="0" cellspacing="0" class="{month}">
93<tr><th colspan="7" class="{month}">March</th></tr>
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000094<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>
95<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>
96<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>
97<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>
98<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>
99<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>
100</table>
Oz N Tiram8b7a4cc2017-06-06 11:35:59 +0200101</td></tr><tr><td><table border="0" cellpadding="0" cellspacing="0" class="{month}">
102<tr><th colspan="7" class="{month}">April</th></tr>
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000103<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>
104<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>
105<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>
106<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>
107<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>
108<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>
109</table>
Oz N Tiram8b7a4cc2017-06-06 11:35:59 +0200110</td><td><table border="0" cellpadding="0" cellspacing="0" class="{month}">
111<tr><th colspan="7" class="{month}">May</th></tr>
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000112<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>
113<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>
114<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>
115<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>
116<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>
117<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>
118<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>
119</table>
Oz N Tiram8b7a4cc2017-06-06 11:35:59 +0200120</td><td><table border="0" cellpadding="0" cellspacing="0" class="{month}">
121<tr><th colspan="7" class="{month}">June</th></tr>
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000122<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>
123<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>
124<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>
125<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>
126<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>
127<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>
128</table>
Oz N Tiram8b7a4cc2017-06-06 11:35:59 +0200129</td></tr><tr><td><table border="0" cellpadding="0" cellspacing="0" class="{month}">
130<tr><th colspan="7" class="{month}">July</th></tr>
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000131<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>
132<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>
133<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>
134<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>
135<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>
136<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>
137</table>
Oz N Tiram8b7a4cc2017-06-06 11:35:59 +0200138</td><td><table border="0" cellpadding="0" cellspacing="0" class="{month}">
139<tr><th colspan="7" class="{month}">August</th></tr>
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000140<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>
141<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>
142<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>
143<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>
144<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>
145<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>
146<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>
147</table>
Oz N Tiram8b7a4cc2017-06-06 11:35:59 +0200148</td><td><table border="0" cellpadding="0" cellspacing="0" class="{month}">
149<tr><th colspan="7" class="{month}">September</th></tr>
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000150<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>
151<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>
152<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>
153<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>
154<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>
155<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>
156</table>
Oz N Tiram8b7a4cc2017-06-06 11:35:59 +0200157</td></tr><tr><td><table border="0" cellpadding="0" cellspacing="0" class="{month}">
158<tr><th colspan="7" class="{month}">October</th></tr>
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000159<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>
160<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>
161<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>
162<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>
163<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>
164<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>
165</table>
Oz N Tiram8b7a4cc2017-06-06 11:35:59 +0200166</td><td><table border="0" cellpadding="0" cellspacing="0" class="{month}">
167<tr><th colspan="7" class="{month}">November</th></tr>
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000168<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>
169<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>
170<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>
171<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>
172<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>
173<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>
174</table>
Oz N Tiram8b7a4cc2017-06-06 11:35:59 +0200175</td><td><table border="0" cellpadding="0" cellspacing="0" class="{month}">
176<tr><th colspan="7" class="{month}">December</th></tr>
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000177<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>
178<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>
179<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>
180<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>
181<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>
182<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>
183</table>
184</td></tr></table></body>
185</html>
186"""
187
R David Murrayd0c86952012-05-29 12:55:05 -0400188result_2004_days = [
189 [[[0, 0, 0, 1, 2, 3, 4],
190 [5, 6, 7, 8, 9, 10, 11],
191 [12, 13, 14, 15, 16, 17, 18],
192 [19, 20, 21, 22, 23, 24, 25],
193 [26, 27, 28, 29, 30, 31, 0]],
194 [[0, 0, 0, 0, 0, 0, 1],
195 [2, 3, 4, 5, 6, 7, 8],
196 [9, 10, 11, 12, 13, 14, 15],
197 [16, 17, 18, 19, 20, 21, 22],
198 [23, 24, 25, 26, 27, 28, 29]],
199 [[1, 2, 3, 4, 5, 6, 7],
200 [8, 9, 10, 11, 12, 13, 14],
201 [15, 16, 17, 18, 19, 20, 21],
202 [22, 23, 24, 25, 26, 27, 28],
203 [29, 30, 31, 0, 0, 0, 0]]],
204 [[[0, 0, 0, 1, 2, 3, 4],
205 [5, 6, 7, 8, 9, 10, 11],
206 [12, 13, 14, 15, 16, 17, 18],
207 [19, 20, 21, 22, 23, 24, 25],
208 [26, 27, 28, 29, 30, 0, 0]],
209 [[0, 0, 0, 0, 0, 1, 2],
210 [3, 4, 5, 6, 7, 8, 9],
211 [10, 11, 12, 13, 14, 15, 16],
212 [17, 18, 19, 20, 21, 22, 23],
213 [24, 25, 26, 27, 28, 29, 30],
214 [31, 0, 0, 0, 0, 0, 0]],
215 [[0, 1, 2, 3, 4, 5, 6],
216 [7, 8, 9, 10, 11, 12, 13],
217 [14, 15, 16, 17, 18, 19, 20],
218 [21, 22, 23, 24, 25, 26, 27],
219 [28, 29, 30, 0, 0, 0, 0]]],
220 [[[0, 0, 0, 1, 2, 3, 4],
221 [5, 6, 7, 8, 9, 10, 11],
222 [12, 13, 14, 15, 16, 17, 18],
223 [19, 20, 21, 22, 23, 24, 25],
224 [26, 27, 28, 29, 30, 31, 0]],
225 [[0, 0, 0, 0, 0, 0, 1],
226 [2, 3, 4, 5, 6, 7, 8],
227 [9, 10, 11, 12, 13, 14, 15],
228 [16, 17, 18, 19, 20, 21, 22],
229 [23, 24, 25, 26, 27, 28, 29],
230 [30, 31, 0, 0, 0, 0, 0]],
231 [[0, 0, 1, 2, 3, 4, 5],
232 [6, 7, 8, 9, 10, 11, 12],
233 [13, 14, 15, 16, 17, 18, 19],
234 [20, 21, 22, 23, 24, 25, 26],
235 [27, 28, 29, 30, 0, 0, 0]]],
236 [[[0, 0, 0, 0, 1, 2, 3],
237 [4, 5, 6, 7, 8, 9, 10],
238 [11, 12, 13, 14, 15, 16, 17],
239 [18, 19, 20, 21, 22, 23, 24],
240 [25, 26, 27, 28, 29, 30, 31]],
241 [[1, 2, 3, 4, 5, 6, 7],
242 [8, 9, 10, 11, 12, 13, 14],
243 [15, 16, 17, 18, 19, 20, 21],
244 [22, 23, 24, 25, 26, 27, 28],
245 [29, 30, 0, 0, 0, 0, 0]],
246 [[0, 0, 1, 2, 3, 4, 5],
247 [6, 7, 8, 9, 10, 11, 12],
248 [13, 14, 15, 16, 17, 18, 19],
249 [20, 21, 22, 23, 24, 25, 26],
250 [27, 28, 29, 30, 31, 0, 0]]]
251]
252
253result_2004_dates = \
254 [[['12/29/03 12/30/03 12/31/03 01/01/04 01/02/04 01/03/04 01/04/04',
255 '01/05/04 01/06/04 01/07/04 01/08/04 01/09/04 01/10/04 01/11/04',
256 '01/12/04 01/13/04 01/14/04 01/15/04 01/16/04 01/17/04 01/18/04',
257 '01/19/04 01/20/04 01/21/04 01/22/04 01/23/04 01/24/04 01/25/04',
258 '01/26/04 01/27/04 01/28/04 01/29/04 01/30/04 01/31/04 02/01/04'],
259 ['01/26/04 01/27/04 01/28/04 01/29/04 01/30/04 01/31/04 02/01/04',
260 '02/02/04 02/03/04 02/04/04 02/05/04 02/06/04 02/07/04 02/08/04',
261 '02/09/04 02/10/04 02/11/04 02/12/04 02/13/04 02/14/04 02/15/04',
262 '02/16/04 02/17/04 02/18/04 02/19/04 02/20/04 02/21/04 02/22/04',
263 '02/23/04 02/24/04 02/25/04 02/26/04 02/27/04 02/28/04 02/29/04'],
264 ['03/01/04 03/02/04 03/03/04 03/04/04 03/05/04 03/06/04 03/07/04',
265 '03/08/04 03/09/04 03/10/04 03/11/04 03/12/04 03/13/04 03/14/04',
266 '03/15/04 03/16/04 03/17/04 03/18/04 03/19/04 03/20/04 03/21/04',
267 '03/22/04 03/23/04 03/24/04 03/25/04 03/26/04 03/27/04 03/28/04',
268 '03/29/04 03/30/04 03/31/04 04/01/04 04/02/04 04/03/04 04/04/04']],
269 [['03/29/04 03/30/04 03/31/04 04/01/04 04/02/04 04/03/04 04/04/04',
270 '04/05/04 04/06/04 04/07/04 04/08/04 04/09/04 04/10/04 04/11/04',
271 '04/12/04 04/13/04 04/14/04 04/15/04 04/16/04 04/17/04 04/18/04',
272 '04/19/04 04/20/04 04/21/04 04/22/04 04/23/04 04/24/04 04/25/04',
273 '04/26/04 04/27/04 04/28/04 04/29/04 04/30/04 05/01/04 05/02/04'],
274 ['04/26/04 04/27/04 04/28/04 04/29/04 04/30/04 05/01/04 05/02/04',
275 '05/03/04 05/04/04 05/05/04 05/06/04 05/07/04 05/08/04 05/09/04',
276 '05/10/04 05/11/04 05/12/04 05/13/04 05/14/04 05/15/04 05/16/04',
277 '05/17/04 05/18/04 05/19/04 05/20/04 05/21/04 05/22/04 05/23/04',
278 '05/24/04 05/25/04 05/26/04 05/27/04 05/28/04 05/29/04 05/30/04',
279 '05/31/04 06/01/04 06/02/04 06/03/04 06/04/04 06/05/04 06/06/04'],
280 ['05/31/04 06/01/04 06/02/04 06/03/04 06/04/04 06/05/04 06/06/04',
281 '06/07/04 06/08/04 06/09/04 06/10/04 06/11/04 06/12/04 06/13/04',
282 '06/14/04 06/15/04 06/16/04 06/17/04 06/18/04 06/19/04 06/20/04',
283 '06/21/04 06/22/04 06/23/04 06/24/04 06/25/04 06/26/04 06/27/04',
284 '06/28/04 06/29/04 06/30/04 07/01/04 07/02/04 07/03/04 07/04/04']],
285 [['06/28/04 06/29/04 06/30/04 07/01/04 07/02/04 07/03/04 07/04/04',
286 '07/05/04 07/06/04 07/07/04 07/08/04 07/09/04 07/10/04 07/11/04',
287 '07/12/04 07/13/04 07/14/04 07/15/04 07/16/04 07/17/04 07/18/04',
288 '07/19/04 07/20/04 07/21/04 07/22/04 07/23/04 07/24/04 07/25/04',
289 '07/26/04 07/27/04 07/28/04 07/29/04 07/30/04 07/31/04 08/01/04'],
290 ['07/26/04 07/27/04 07/28/04 07/29/04 07/30/04 07/31/04 08/01/04',
291 '08/02/04 08/03/04 08/04/04 08/05/04 08/06/04 08/07/04 08/08/04',
292 '08/09/04 08/10/04 08/11/04 08/12/04 08/13/04 08/14/04 08/15/04',
293 '08/16/04 08/17/04 08/18/04 08/19/04 08/20/04 08/21/04 08/22/04',
294 '08/23/04 08/24/04 08/25/04 08/26/04 08/27/04 08/28/04 08/29/04',
295 '08/30/04 08/31/04 09/01/04 09/02/04 09/03/04 09/04/04 09/05/04'],
296 ['08/30/04 08/31/04 09/01/04 09/02/04 09/03/04 09/04/04 09/05/04',
297 '09/06/04 09/07/04 09/08/04 09/09/04 09/10/04 09/11/04 09/12/04',
298 '09/13/04 09/14/04 09/15/04 09/16/04 09/17/04 09/18/04 09/19/04',
299 '09/20/04 09/21/04 09/22/04 09/23/04 09/24/04 09/25/04 09/26/04',
300 '09/27/04 09/28/04 09/29/04 09/30/04 10/01/04 10/02/04 10/03/04']],
301 [['09/27/04 09/28/04 09/29/04 09/30/04 10/01/04 10/02/04 10/03/04',
302 '10/04/04 10/05/04 10/06/04 10/07/04 10/08/04 10/09/04 10/10/04',
303 '10/11/04 10/12/04 10/13/04 10/14/04 10/15/04 10/16/04 10/17/04',
304 '10/18/04 10/19/04 10/20/04 10/21/04 10/22/04 10/23/04 10/24/04',
305 '10/25/04 10/26/04 10/27/04 10/28/04 10/29/04 10/30/04 10/31/04'],
306 ['11/01/04 11/02/04 11/03/04 11/04/04 11/05/04 11/06/04 11/07/04',
307 '11/08/04 11/09/04 11/10/04 11/11/04 11/12/04 11/13/04 11/14/04',
308 '11/15/04 11/16/04 11/17/04 11/18/04 11/19/04 11/20/04 11/21/04',
309 '11/22/04 11/23/04 11/24/04 11/25/04 11/26/04 11/27/04 11/28/04',
310 '11/29/04 11/30/04 12/01/04 12/02/04 12/03/04 12/04/04 12/05/04'],
311 ['11/29/04 11/30/04 12/01/04 12/02/04 12/03/04 12/04/04 12/05/04',
312 '12/06/04 12/07/04 12/08/04 12/09/04 12/10/04 12/11/04 12/12/04',
313 '12/13/04 12/14/04 12/15/04 12/16/04 12/17/04 12/18/04 12/19/04',
314 '12/20/04 12/21/04 12/22/04 12/23/04 12/24/04 12/25/04 12/26/04',
315 '12/27/04 12/28/04 12/29/04 12/30/04 12/31/04 01/01/05 01/02/05']]]
316
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000317
318class OutputTestCase(unittest.TestCase):
319 def normalize_calendar(self, s):
Mark Dickinson934896d2009-02-21 20:59:32 +0000320 # Filters out locale dependent strings
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000321 def neitherspacenordigit(c):
322 return not c.isspace() and not c.isdigit()
323
324 lines = []
Ezio Melottid8b509b2011-09-28 17:37:55 +0300325 for line in s.splitlines(keepends=False):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000326 # Drop texts, as they are locale dependent
327 if line and not filter(neitherspacenordigit, line):
328 lines.append(line)
329 return lines
330
R David Murrayd0c86952012-05-29 12:55:05 -0400331 def check_htmlcalendar_encoding(self, req, res):
332 cal = calendar.HTMLCalendar()
Oz N Tiram8b7a4cc2017-06-06 11:35:59 +0200333 format_ = default_format.copy()
334 format_["encoding"] = req or 'utf-8'
335 output = cal.formatyearpage(2004, encoding=req)
R David Murrayd0c86952012-05-29 12:55:05 -0400336 self.assertEqual(
Oz N Tiram8b7a4cc2017-06-06 11:35:59 +0200337 output,
338 result_2004_html.format(**format_).encode(res)
R David Murrayd0c86952012-05-29 12:55:05 -0400339 )
340
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000341 def test_output(self):
342 self.assertEqual(
343 self.normalize_calendar(calendar.calendar(2004)),
344 self.normalize_calendar(result_2004_text)
345 )
346
347 def test_output_textcalendar(self):
348 self.assertEqual(
Serhiy Storchakaaef859c2015-02-05 15:14:35 +0200349 calendar.TextCalendar().formatyear(2004),
350 result_2004_text
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000351 )
352
R David Murrayd0c86952012-05-29 12:55:05 -0400353 def test_output_htmlcalendar_encoding_ascii(self):
354 self.check_htmlcalendar_encoding('ascii', 'ascii')
355
356 def test_output_htmlcalendar_encoding_utf8(self):
357 self.check_htmlcalendar_encoding('utf-8', 'utf-8')
358
359 def test_output_htmlcalendar_encoding_default(self):
360 self.check_htmlcalendar_encoding(None, sys.getdefaultencoding())
361
362 def test_yeardatescalendar(self):
363 def shrink(cal):
R David Murraybb756782012-05-30 08:10:54 -0400364 return [[[' '.join('{:02d}/{:02d}/{}'.format(
365 d.month, d.day, str(d.year)[-2:]) for d in z)
366 for z in y] for y in x] for x in cal]
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000367 self.assertEqual(
R David Murrayd0c86952012-05-29 12:55:05 -0400368 shrink(calendar.Calendar().yeardatescalendar(2004)),
369 result_2004_dates
370 )
371
372 def test_yeardayscalendar(self):
373 self.assertEqual(
374 calendar.Calendar().yeardayscalendar(2004),
375 result_2004_days
376 )
377
378 def test_formatweekheader_short(self):
379 self.assertEqual(
380 calendar.TextCalendar().formatweekheader(2),
381 'Mo Tu We Th Fr Sa Su'
382 )
383
384 def test_formatweekheader_long(self):
385 self.assertEqual(
386 calendar.TextCalendar().formatweekheader(9),
387 ' Monday Tuesday Wednesday Thursday '
388 ' Friday Saturday Sunday '
389 )
390
391 def test_formatmonth(self):
392 self.assertEqual(
Serhiy Storchakaaef859c2015-02-05 15:14:35 +0200393 calendar.TextCalendar().formatmonth(2004, 1),
394 result_2004_01_text
R David Murrayd0c86952012-05-29 12:55:05 -0400395 )
396
397 def test_formatmonthname_with_year(self):
398 self.assertEqual(
399 calendar.HTMLCalendar().formatmonthname(2004, 1, withyear=True),
400 '<tr><th colspan="7" class="month">January 2004</th></tr>'
401 )
402
403 def test_formatmonthname_without_year(self):
404 self.assertEqual(
405 calendar.HTMLCalendar().formatmonthname(2004, 1, withyear=False),
406 '<tr><th colspan="7" class="month">January</th></tr>'
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000407 )
408
Ezio Melotti87f09372013-09-14 04:55:53 +0300409 def test_prweek(self):
410 with support.captured_stdout() as out:
411 week = [(1,0), (2,1), (3,2), (4,3), (5,4), (6,5), (7,6)]
412 calendar.TextCalendar().prweek(week, 1)
Serhiy Storchaka0595ed22016-10-25 15:20:58 +0300413 self.assertEqual(out.getvalue(), " 1 2 3 4 5 6 7")
Ezio Melotti87f09372013-09-14 04:55:53 +0300414
415 def test_prmonth(self):
416 with support.captured_stdout() as out:
417 calendar.TextCalendar().prmonth(2004, 1)
Serhiy Storchaka7ff51bd2016-10-25 15:00:52 +0300418 self.assertEqual(out.getvalue(), result_2004_01_text)
Ezio Melotti87f09372013-09-14 04:55:53 +0300419
420 def test_pryear(self):
421 with support.captured_stdout() as out:
422 calendar.TextCalendar().pryear(2004)
Serhiy Storchaka0595ed22016-10-25 15:20:58 +0300423 self.assertEqual(out.getvalue(), result_2004_text)
Ezio Melotti87f09372013-09-14 04:55:53 +0300424
425 def test_format(self):
426 with support.captured_stdout() as out:
427 calendar.format(["1", "2", "3"], colwidth=3, spacing=1)
428 self.assertEqual(out.getvalue().strip(), "1 2 3")
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000429
Fred Draked077ca12001-12-12 05:38:08 +0000430class CalendarTestCase(unittest.TestCase):
431 def test_isleap(self):
432 # Make sure that the return is right for a few years, and
433 # ensure that the return values are 1 or 0, not just true or
434 # false (see SF bug #485794). Specific additional tests may
435 # be appropriate; this tests a single "cycle".
436 self.assertEqual(calendar.isleap(2000), 1)
437 self.assertEqual(calendar.isleap(2001), 0)
438 self.assertEqual(calendar.isleap(2002), 0)
439 self.assertEqual(calendar.isleap(2003), 0)
440
441 def test_setfirstweekday(self):
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000442 self.assertRaises(TypeError, calendar.setfirstweekday, 'flabber')
Fred Draked077ca12001-12-12 05:38:08 +0000443 self.assertRaises(ValueError, calendar.setfirstweekday, -1)
444 self.assertRaises(ValueError, calendar.setfirstweekday, 200)
445 orig = calendar.firstweekday()
446 calendar.setfirstweekday(calendar.SUNDAY)
447 self.assertEqual(calendar.firstweekday(), calendar.SUNDAY)
448 calendar.setfirstweekday(calendar.MONDAY)
449 self.assertEqual(calendar.firstweekday(), calendar.MONDAY)
450 calendar.setfirstweekday(orig)
451
R David Murrayd0c86952012-05-29 12:55:05 -0400452 def test_illegal_weekday_reported(self):
453 with self.assertRaisesRegex(calendar.IllegalWeekdayError, '123'):
454 calendar.setfirstweekday(123)
455
456 def test_enumerate_weekdays(self):
Skip Montanaro693c6c42002-03-15 03:57:04 +0000457 self.assertRaises(IndexError, calendar.day_abbr.__getitem__, -10)
458 self.assertRaises(IndexError, calendar.day_name.__getitem__, 10)
459 self.assertEqual(len([d for d in calendar.day_abbr]), 7)
Fred Draked077ca12001-12-12 05:38:08 +0000460
Tim Peters0c2c8e72002-03-23 03:26:53 +0000461 def test_days(self):
462 for attr in "day_name", "day_abbr":
463 value = getattr(calendar, attr)
464 self.assertEqual(len(value), 7)
465 self.assertEqual(len(value[:]), 7)
466 # ensure they're all unique
Tim Petersbbc0d442004-11-13 16:18:32 +0000467 self.assertEqual(len(set(value)), 7)
468 # verify it "acts like a sequence" in two forms of iteration
469 self.assertEqual(value[::-1], list(reversed(value)))
Tim Peters0c2c8e72002-03-23 03:26:53 +0000470
471 def test_months(self):
472 for attr in "month_name", "month_abbr":
473 value = getattr(calendar, attr)
474 self.assertEqual(len(value), 13)
475 self.assertEqual(len(value[:]), 13)
476 self.assertEqual(value[0], "")
477 # ensure they're all unique
Tim Petersbbc0d442004-11-13 16:18:32 +0000478 self.assertEqual(len(set(value)), 13)
479 # verify it "acts like a sequence" in two forms of iteration
480 self.assertEqual(value[::-1], list(reversed(value)))
Tim Peters0c2c8e72002-03-23 03:26:53 +0000481
R David Murrayd0c86952012-05-29 12:55:05 -0400482 def test_locale_calendars(self):
Georg Brandl7004bd12010-10-19 18:54:25 +0000483 # ensure that Locale{Text,HTML}Calendar resets the locale properly
484 # (it is still not thread-safe though)
Georg Brandl7004bd12010-10-19 18:54:25 +0000485 old_october = calendar.TextCalendar().formatmonthname(2010, 10, 10)
Georg Brandl9450cc02010-10-20 06:50:19 +0000486 try:
Serhiy Storchakaf9fcdb72013-01-31 16:00:42 +0200487 cal = calendar.LocaleTextCalendar(locale='')
488 local_weekday = cal.formatweekday(1, 10)
489 local_month = cal.formatmonthname(2010, 10, 10)
Georg Brandl9450cc02010-10-20 06:50:19 +0000490 except locale.Error:
491 # cannot set the system default locale -- skip rest of test
Serhiy Storchakaf9fcdb72013-01-31 16:00:42 +0200492 raise unittest.SkipTest('cannot set the system default locale')
493 self.assertIsInstance(local_weekday, str)
494 self.assertIsInstance(local_month, str)
495 self.assertEqual(len(local_weekday), 10)
496 self.assertGreaterEqual(len(local_month), 10)
497 cal = calendar.LocaleHTMLCalendar(locale='')
498 local_weekday = cal.formatweekday(1)
499 local_month = cal.formatmonthname(2010, 10)
500 self.assertIsInstance(local_weekday, str)
501 self.assertIsInstance(local_month, str)
Georg Brandl7004bd12010-10-19 18:54:25 +0000502 new_october = calendar.TextCalendar().formatmonthname(2010, 10, 10)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000503 self.assertEqual(old_october, new_october)
Georg Brandl7004bd12010-10-19 18:54:25 +0000504
Ezio Melotti85710a42012-09-21 17:26:35 +0300505 def test_itermonthdates(self):
506 # ensure itermonthdates doesn't overflow after datetime.MAXYEAR
507 # see #15421
508 list(calendar.Calendar().itermonthdates(datetime.MAXYEAR, 12))
509
Alexander Belopolsky957b7562016-09-27 20:26:39 -0400510 def test_itermonthdays(self):
511 for firstweekday in range(7):
512 cal = calendar.Calendar(firstweekday)
513 # Test the extremes, see #28253 and #26650
514 for y, m in [(1, 1), (9999, 12)]:
515 days = list(cal.itermonthdays(y, m))
516 self.assertIn(len(days), (35, 42))
517 # Test a short month
518 cal = calendar.Calendar(firstweekday=3)
519 days = list(cal.itermonthdays(2001, 2))
520 self.assertEqual(days, list(range(1, 29)))
521
522 def test_itermonthdays2(self):
523 for firstweekday in range(7):
524 cal = calendar.Calendar(firstweekday)
525 # Test the extremes, see #28253 and #26650
526 for y, m in [(1, 1), (9999, 12)]:
527 days = list(cal.itermonthdays2(y, m))
528 self.assertEqual(days[0][1], firstweekday)
529 self.assertEqual(days[-1][1], (firstweekday - 1) % 7)
530
Walter Dörwald59ad4562004-07-02 19:00:09 +0000531
532class MonthCalendarTestCase(unittest.TestCase):
533 def setUp(self):
534 self.oldfirstweekday = calendar.firstweekday()
535 calendar.setfirstweekday(self.firstweekday)
536
537 def tearDown(self):
538 calendar.setfirstweekday(self.oldfirstweekday)
539
540 def check_weeks(self, year, month, weeks):
541 cal = calendar.monthcalendar(year, month)
542 self.assertEqual(len(cal), len(weeks))
Guido van Rossum805365e2007-05-07 22:24:25 +0000543 for i in range(len(weeks)):
Walter Dörwald59ad4562004-07-02 19:00:09 +0000544 self.assertEqual(weeks[i], sum(day != 0 for day in cal[i]))
545
546
547class MondayTestCase(MonthCalendarTestCase):
548 firstweekday = calendar.MONDAY
549
550 def test_february(self):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000551 # A 28-day february starting on monday (7+7+7+7 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000552 self.check_weeks(1999, 2, (7, 7, 7, 7))
553
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000554 # A 28-day february starting on tuesday (6+7+7+7+1 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000555 self.check_weeks(2005, 2, (6, 7, 7, 7, 1))
556
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000557 # A 28-day february starting on sunday (1+7+7+7+6 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000558 self.check_weeks(1987, 2, (1, 7, 7, 7, 6))
559
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000560 # A 29-day february starting on monday (7+7+7+7+1 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000561 self.check_weeks(1988, 2, (7, 7, 7, 7, 1))
562
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000563 # A 29-day february starting on tuesday (6+7+7+7+2 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000564 self.check_weeks(1972, 2, (6, 7, 7, 7, 2))
565
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000566 # A 29-day february starting on sunday (1+7+7+7+7 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000567 self.check_weeks(2004, 2, (1, 7, 7, 7, 7))
568
569 def test_april(self):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000570 # A 30-day april starting on monday (7+7+7+7+2 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000571 self.check_weeks(1935, 4, (7, 7, 7, 7, 2))
572
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000573 # A 30-day april starting on tuesday (6+7+7+7+3 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000574 self.check_weeks(1975, 4, (6, 7, 7, 7, 3))
575
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000576 # A 30-day april starting on sunday (1+7+7+7+7+1 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000577 self.check_weeks(1945, 4, (1, 7, 7, 7, 7, 1))
578
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000579 # A 30-day april starting on saturday (2+7+7+7+7 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000580 self.check_weeks(1995, 4, (2, 7, 7, 7, 7))
581
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000582 # A 30-day april starting on friday (3+7+7+7+6 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000583 self.check_weeks(1994, 4, (3, 7, 7, 7, 6))
584
585 def test_december(self):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000586 # A 31-day december starting on monday (7+7+7+7+3 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000587 self.check_weeks(1980, 12, (7, 7, 7, 7, 3))
588
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000589 # A 31-day december starting on tuesday (6+7+7+7+4 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000590 self.check_weeks(1987, 12, (6, 7, 7, 7, 4))
591
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000592 # A 31-day december starting on sunday (1+7+7+7+7+2 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000593 self.check_weeks(1968, 12, (1, 7, 7, 7, 7, 2))
594
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000595 # A 31-day december starting on thursday (4+7+7+7+6 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000596 self.check_weeks(1988, 12, (4, 7, 7, 7, 6))
597
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000598 # A 31-day december starting on friday (3+7+7+7+7 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000599 self.check_weeks(2017, 12, (3, 7, 7, 7, 7))
600
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000601 # A 31-day december starting on saturday (2+7+7+7+7+1 days)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000602 self.check_weeks(2068, 12, (2, 7, 7, 7, 7, 1))
603
604
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000605class SundayTestCase(MonthCalendarTestCase):
606 firstweekday = calendar.SUNDAY
607
608 def test_february(self):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000609 # A 28-day february starting on sunday (7+7+7+7 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000610 self.check_weeks(2009, 2, (7, 7, 7, 7))
611
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000612 # A 28-day february starting on monday (6+7+7+7+1 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000613 self.check_weeks(1999, 2, (6, 7, 7, 7, 1))
614
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000615 # A 28-day february starting on saturday (1+7+7+7+6 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000616 self.check_weeks(1997, 2, (1, 7, 7, 7, 6))
617
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000618 # A 29-day february starting on sunday (7+7+7+7+1 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000619 self.check_weeks(2004, 2, (7, 7, 7, 7, 1))
620
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000621 # A 29-day february starting on monday (6+7+7+7+2 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000622 self.check_weeks(1960, 2, (6, 7, 7, 7, 2))
623
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000624 # A 29-day february starting on saturday (1+7+7+7+7 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000625 self.check_weeks(1964, 2, (1, 7, 7, 7, 7))
626
627 def test_april(self):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000628 # A 30-day april starting on sunday (7+7+7+7+2 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000629 self.check_weeks(1923, 4, (7, 7, 7, 7, 2))
630
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000631 # A 30-day april starting on monday (6+7+7+7+3 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000632 self.check_weeks(1918, 4, (6, 7, 7, 7, 3))
633
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000634 # A 30-day april starting on saturday (1+7+7+7+7+1 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000635 self.check_weeks(1950, 4, (1, 7, 7, 7, 7, 1))
636
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000637 # A 30-day april starting on friday (2+7+7+7+7 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000638 self.check_weeks(1960, 4, (2, 7, 7, 7, 7))
639
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000640 # A 30-day april starting on thursday (3+7+7+7+6 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000641 self.check_weeks(1909, 4, (3, 7, 7, 7, 6))
642
643 def test_december(self):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000644 # A 31-day december starting on sunday (7+7+7+7+3 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000645 self.check_weeks(2080, 12, (7, 7, 7, 7, 3))
646
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000647 # A 31-day december starting on monday (6+7+7+7+4 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000648 self.check_weeks(1941, 12, (6, 7, 7, 7, 4))
649
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000650 # A 31-day december starting on saturday (1+7+7+7+7+2 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000651 self.check_weeks(1923, 12, (1, 7, 7, 7, 7, 2))
652
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000653 # A 31-day december starting on wednesday (4+7+7+7+6 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000654 self.check_weeks(1948, 12, (4, 7, 7, 7, 6))
655
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000656 # A 31-day december starting on thursday (3+7+7+7+7 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000657 self.check_weeks(1927, 12, (3, 7, 7, 7, 7))
658
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000659 # A 31-day december starting on friday (2+7+7+7+7+1 days)
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000660 self.check_weeks(1995, 12, (2, 7, 7, 7, 7, 1))
661
Alexander Belopolsky43ca7102010-06-14 17:32:03 +0000662class TimegmTestCase(unittest.TestCase):
663 TIMESTAMPS = [0, 10, 100, 1000, 10000, 100000, 1000000,
664 1234567890, 1262304000, 1275785153,]
665 def test_timegm(self):
666 for secs in self.TIMESTAMPS:
667 tuple = time.gmtime(secs)
668 self.assertEqual(secs, calendar.timegm(tuple))
Walter Dörwald302fa6d2004-07-08 17:14:17 +0000669
Brett Cannoncfae36f2010-07-23 13:54:14 +0000670class MonthRangeTestCase(unittest.TestCase):
671 def test_january(self):
672 # Tests valid lower boundary case.
673 self.assertEqual(calendar.monthrange(2004,1), (3,31))
674
675 def test_february_leap(self):
676 # Tests February during leap year.
677 self.assertEqual(calendar.monthrange(2004,2), (6,29))
678
679 def test_february_nonleap(self):
680 # Tests February in non-leap year.
681 self.assertEqual(calendar.monthrange(2010,2), (0,28))
682
683 def test_december(self):
684 # Tests valid upper boundary case.
685 self.assertEqual(calendar.monthrange(2004,12), (2,31))
686
687 def test_zeroth_month(self):
688 # Tests low invalid boundary case.
689 with self.assertRaises(calendar.IllegalMonthError):
690 calendar.monthrange(2004, 0)
691
692 def test_thirteenth_month(self):
693 # Tests high invalid boundary case.
694 with self.assertRaises(calendar.IllegalMonthError):
695 calendar.monthrange(2004, 13)
696
R David Murrayd0c86952012-05-29 12:55:05 -0400697 def test_illegal_month_reported(self):
698 with self.assertRaisesRegex(calendar.IllegalMonthError, '65'):
699 calendar.monthrange(2004, 65)
700
R. David Murray1daaf9e2010-12-31 19:21:14 +0000701class LeapdaysTestCase(unittest.TestCase):
702 def test_no_range(self):
703 # test when no range i.e. two identical years as args
704 self.assertEqual(calendar.leapdays(2010,2010), 0)
705
706 def test_no_leapdays(self):
707 # test when no leap years in range
708 self.assertEqual(calendar.leapdays(2010,2011), 0)
709
710 def test_no_leapdays_upper_boundary(self):
711 # test no leap years in range, when upper boundary is a leap year
712 self.assertEqual(calendar.leapdays(2010,2012), 0)
713
714 def test_one_leapday_lower_boundary(self):
715 # test when one leap year in range, lower boundary is leap year
716 self.assertEqual(calendar.leapdays(2012,2013), 1)
717
718 def test_several_leapyears_in_range(self):
719 self.assertEqual(calendar.leapdays(1997,2020), 5)
720
Brett Cannoncfae36f2010-07-23 13:54:14 +0000721
Serhiy Storchakaaef859c2015-02-05 15:14:35 +0200722def conv(s):
723 return s.replace('\n', os.linesep).encode()
Senthil Kumaran962fed92011-08-11 09:22:52 +0800724
Serhiy Storchakaaef859c2015-02-05 15:14:35 +0200725class CommandLineTestCase(unittest.TestCase):
726 def run_ok(self, *args):
727 return assert_python_ok('-m', 'calendar', *args)[1]
728
729 def assertFailure(self, *args):
730 rc, stdout, stderr = assert_python_failure('-m', 'calendar', *args)
Serhiy Storchaka97852612015-11-01 17:14:27 +0200731 self.assertIn(b'usage:', stderr)
Serhiy Storchakaaef859c2015-02-05 15:14:35 +0200732 self.assertEqual(rc, 2)
733
734 def test_help(self):
735 stdout = self.run_ok('-h')
Serhiy Storchaka97852612015-11-01 17:14:27 +0200736 self.assertIn(b'usage:', stdout)
Serhiy Storchakaaef859c2015-02-05 15:14:35 +0200737 self.assertIn(b'calendar.py', stdout)
738 self.assertIn(b'--help', stdout)
739
740 def test_illegal_arguments(self):
741 self.assertFailure('-z')
Serhiy Storchaka97852612015-11-01 17:14:27 +0200742 self.assertFailure('spam')
743 self.assertFailure('2004', 'spam')
Serhiy Storchakaaef859c2015-02-05 15:14:35 +0200744 self.assertFailure('-t', 'html', '2004', '1')
745
746 def test_output_current_year(self):
747 stdout = self.run_ok()
748 year = datetime.datetime.now().year
749 self.assertIn((' %s' % year).encode(), stdout)
750 self.assertIn(b'January', stdout)
751 self.assertIn(b'Mo Tu We Th Fr Sa Su', stdout)
752
753 def test_output_year(self):
754 stdout = self.run_ok('2004')
755 self.assertEqual(stdout, conv(result_2004_text))
756
757 def test_output_month(self):
758 stdout = self.run_ok('2004', '1')
759 self.assertEqual(stdout, conv(result_2004_01_text))
760
761 def test_option_encoding(self):
762 self.assertFailure('-e')
763 self.assertFailure('--encoding')
764 stdout = self.run_ok('--encoding', 'utf-16-le', '2004')
765 self.assertEqual(stdout, result_2004_text.encode('utf-16-le'))
766
767 def test_option_locale(self):
768 self.assertFailure('-L')
769 self.assertFailure('--locale')
770 self.assertFailure('-L', 'en')
771 lang, enc = locale.getdefaultlocale()
772 lang = lang or 'C'
773 enc = enc or 'UTF-8'
774 try:
775 oldlocale = locale.getlocale(locale.LC_TIME)
776 try:
777 locale.setlocale(locale.LC_TIME, (lang, enc))
778 finally:
779 locale.setlocale(locale.LC_TIME, oldlocale)
780 except (locale.Error, ValueError):
781 self.skipTest('cannot set the system default locale')
782 stdout = self.run_ok('--locale', lang, '--encoding', enc, '2004')
783 self.assertIn('2004'.encode(enc), stdout)
784
785 def test_option_width(self):
786 self.assertFailure('-w')
787 self.assertFailure('--width')
788 self.assertFailure('-w', 'spam')
789 stdout = self.run_ok('--width', '3', '2004')
790 self.assertIn(b'Mon Tue Wed Thu Fri Sat Sun', stdout)
791
792 def test_option_lines(self):
793 self.assertFailure('-l')
794 self.assertFailure('--lines')
795 self.assertFailure('-l', 'spam')
796 stdout = self.run_ok('--lines', '2', '2004')
797 self.assertIn(conv('December\n\nMo Tu We'), stdout)
798
799 def test_option_spacing(self):
800 self.assertFailure('-s')
801 self.assertFailure('--spacing')
802 self.assertFailure('-s', 'spam')
803 stdout = self.run_ok('--spacing', '8', '2004')
804 self.assertIn(b'Su Mo', stdout)
805
806 def test_option_months(self):
807 self.assertFailure('-m')
808 self.assertFailure('--month')
809 self.assertFailure('-m', 'spam')
810 stdout = self.run_ok('--months', '1', '2004')
811 self.assertIn(conv('\nMo Tu We Th Fr Sa Su\n'), stdout)
812
813 def test_option_type(self):
814 self.assertFailure('-t')
815 self.assertFailure('--type')
816 self.assertFailure('-t', 'spam')
817 stdout = self.run_ok('--type', 'text', '2004')
818 self.assertEqual(stdout, conv(result_2004_text))
819 stdout = self.run_ok('--type', 'html', '2004')
820 self.assertEqual(stdout[:6], b'<?xml ')
821 self.assertIn(b'<title>Calendar for 2004</title>', stdout)
822
823 def test_html_output_current_year(self):
824 stdout = self.run_ok('--type', 'html')
825 year = datetime.datetime.now().year
826 self.assertIn(('<title>Calendar for %s</title>' % year).encode(),
827 stdout)
828 self.assertIn(b'<tr><th colspan="7" class="month">January</th></tr>',
829 stdout)
830
831 def test_html_output_year_encoding(self):
832 stdout = self.run_ok('-t', 'html', '--encoding', 'ascii', '2004')
833 self.assertEqual(stdout,
Oz N Tiram8b7a4cc2017-06-06 11:35:59 +0200834 result_2004_html.format(**default_format).encode('ascii'))
Serhiy Storchakaaef859c2015-02-05 15:14:35 +0200835
836 def test_html_output_year_css(self):
837 self.assertFailure('-t', 'html', '-c')
838 self.assertFailure('-t', 'html', '--css')
839 stdout = self.run_ok('-t', 'html', '--css', 'custom.css', '2004')
840 self.assertIn(b'<link rel="stylesheet" type="text/css" '
841 b'href="custom.css" />', stdout)
Walter Dörwald59ad4562004-07-02 19:00:09 +0000842
Fred Draked077ca12001-12-12 05:38:08 +0000843
Martin Panter4eb376c2016-01-16 06:49:30 +0000844class MiscTestCase(unittest.TestCase):
845 def test__all__(self):
Serhiy Storchaka2c1d3e32016-01-16 11:05:11 +0200846 blacklist = {'mdays', 'January', 'February', 'EPOCH',
Martin Panter4eb376c2016-01-16 06:49:30 +0000847 'MONDAY', 'TUESDAY', 'WEDNESDAY', 'THURSDAY', 'FRIDAY',
848 'SATURDAY', 'SUNDAY', 'different_locale', 'c',
849 'prweek', 'week', 'format', 'formatstring', 'main'}
850 support.check__all__(self, calendar, blacklist=blacklist)
851
852
Oz N Tiram8b7a4cc2017-06-06 11:35:59 +0200853class TestSubClassingCase(unittest.TestCase):
854
855 def setUp(self):
856
857 class CustomHTMLCal(calendar.HTMLCalendar):
858 cssclasses = [style + " text-nowrap" for style in
859 calendar.HTMLCalendar.cssclasses]
860 cssclasses_weekday_head = ["red", "blue", "green", "lilac",
861 "yellow", "orange", "pink"]
862 cssclass_month_head = "text-center month-head"
863 cssclass_month = "text-center month"
864 cssclass_year = "text-italic "
865 cssclass_year_head = "lead "
866
867 self.cal = CustomHTMLCal()
868
869 def test_formatmonthname(self):
870 self.assertIn('class="text-center month-head"',
871 self.cal.formatmonthname(2017, 5))
872
873 def test_formatmonth(self):
874 self.assertIn('class="text-center month"',
875 self.cal.formatmonth(2017, 5))
876
877 def test_formatweek(self):
878 weeks = self.cal.monthdays2calendar(2017, 5)
879 self.assertIn('class="wed text-nowrap"', self.cal.formatweek(weeks[0]))
880
881 def test_formatweek_head(self):
882 header = self.cal.formatweekheader()
883 for color in self.cal.cssclasses_weekday_head:
884 self.assertIn('<th class="%s">' % color, header)
885
886 def test_format_year(self):
887 self.assertIn(
888 ('<table border="0" cellpadding="0" cellspacing="0" class="%s">' %
889 self.cal.cssclass_year), self.cal.formatyear(2017))
890
891 def test_format_year_head(self):
892 self.assertIn('<tr><th colspan="%d" class="%s">%s</th></tr>' % (
893 3, self.cal.cssclass_year_head, 2017), self.cal.formatyear(2017))
894
Fred Draked077ca12001-12-12 05:38:08 +0000895if __name__ == "__main__":
Serhiy Storchakaaef859c2015-02-05 15:14:35 +0200896 unittest.main()