Commit 256198a6 authored by Serhiy Storchaka's avatar Serhiy Storchaka

Issue #18982: Add tests for CLI of the calendar module.

parent 8f307447
...@@ -2,11 +2,22 @@ import calendar ...@@ -2,11 +2,22 @@ import calendar
import unittest import unittest
from test import test_support from test import test_support
from test.script_helper import assert_python_ok, assert_python_failure
import locale import locale
import datetime import datetime
import os
result_2004_01_text = """\
January 2004
Mo Tu We Th Fr Sa Su
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
"""
result_2004_text = """\
result_2004_text = """
2004 2004
January February March January February March
...@@ -44,7 +55,7 @@ Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su ...@@ -44,7 +55,7 @@ Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
25 26 27 28 29 30 31 29 30 27 28 29 30 31 25 26 27 28 29 30 31 29 30 27 28 29 30 31
""" """
result_2004_html = """ result_2004_html = """\
<?xml version="1.0" encoding="ascii"?> <?xml version="1.0" encoding="ascii"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html> <html>
...@@ -460,6 +471,124 @@ class LeapdaysTestCase(unittest.TestCase): ...@@ -460,6 +471,124 @@ class LeapdaysTestCase(unittest.TestCase):
self.assertEqual(calendar.leapdays(1997,2020), 5) self.assertEqual(calendar.leapdays(1997,2020), 5)
class CommandLineTestCase(unittest.TestCase):
def run_ok(self, *args):
return assert_python_ok('-m', 'calendar', *args)[1]
def assertFailure(self, *args):
rc, stdout, stderr = assert_python_failure('-m', 'calendar', *args)
self.assertIn(b'Usage:', stderr)
self.assertEqual(rc, 2)
def test_help(self):
stdout = self.run_ok('-h')
self.assertIn(b'Usage:', stdout)
self.assertIn(b'calendar.py', stdout)
self.assertIn(b'--help', stdout)
def test_illegal_arguments(self):
self.assertFailure('-z')
#self.assertFailure('spam')
#self.assertFailure('2004', 'spam')
self.assertFailure('-t', 'html', '2004', '1')
def test_output_current_year(self):
stdout = self.run_ok()
year = datetime.datetime.now().year
self.assertIn((' %s' % year).encode(), stdout)
self.assertIn(b'January', stdout)
self.assertIn(b'Mo Tu We Th Fr Sa Su', stdout)
def test_output_year(self):
stdout = self.run_ok('2004')
self.assertEqual(stdout.strip(), result_2004_text.strip())
def test_output_month(self):
stdout = self.run_ok('2004', '1')
self.assertEqual(stdout.strip(), result_2004_01_text.strip())
def test_option_encoding(self):
self.assertFailure('-e')
self.assertFailure('--encoding')
stdout = self.run_ok('--encoding', 'rot-13', '2004')
self.assertEqual(stdout.strip(), result_2004_text.encode('rot-13').strip())
def test_option_locale(self):
self.assertFailure('-L')
self.assertFailure('--locale')
self.assertFailure('-L', 'en')
lang, enc = locale.getdefaultlocale()
lang = lang or 'C'
enc = enc or 'UTF-8'
try:
oldlocale = locale.getlocale(locale.LC_TIME)
try:
locale.setlocale(locale.LC_TIME, (lang, enc))
finally:
locale.setlocale(locale.LC_TIME, oldlocale)
except (locale.Error, ValueError):
self.skipTest('cannot set the system default locale')
stdout = self.run_ok('--locale', lang, '--encoding', enc, '2004')
self.assertIn('2004'.encode(enc), stdout)
def test_option_width(self):
self.assertFailure('-w')
self.assertFailure('--width')
self.assertFailure('-w', 'spam')
stdout = self.run_ok('--width', '3', '2004')
self.assertIn(b'Mon Tue Wed Thu Fri Sat Sun', stdout)
def test_option_lines(self):
self.assertFailure('-l')
self.assertFailure('--lines')
self.assertFailure('-l', 'spam')
stdout = self.run_ok('--lines', '2', '2004')
self.assertIn('December\n\nMo Tu We', stdout)
def test_option_spacing(self):
self.assertFailure('-s')
self.assertFailure('--spacing')
self.assertFailure('-s', 'spam')
stdout = self.run_ok('--spacing', '8', '2004')
self.assertIn(b'Su Mo', stdout)
def test_option_months(self):
self.assertFailure('-m')
self.assertFailure('--month')
self.assertFailure('-m', 'spam')
stdout = self.run_ok('--months', '1', '2004')
self.assertIn('\nMo Tu We Th Fr Sa Su\n', stdout)
def test_option_type(self):
self.assertFailure('-t')
self.assertFailure('--type')
self.assertFailure('-t', 'spam')
stdout = self.run_ok('--type', 'text', '2004')
self.assertEqual(stdout.strip(), result_2004_text.strip())
stdout = self.run_ok('--type', 'html', '2004')
self.assertEqual(stdout[:6], b'<?xml ')
self.assertIn(b'<title>Calendar for 2004</title>', stdout)
def test_html_output_current_year(self):
stdout = self.run_ok('--type', 'html')
year = datetime.datetime.now().year
self.assertIn(('<title>Calendar for %s</title>' % year).encode(),
stdout)
self.assertIn(b'<tr><th colspan="7" class="month">January</th></tr>',
stdout)
def test_html_output_year_encoding(self):
stdout = self.run_ok('-t', 'html', '--encoding', 'ascii', '2004')
self.assertEqual(stdout.strip(), result_2004_html.strip())
def test_html_output_year_css(self):
self.assertFailure('-t', 'html', '-c')
self.assertFailure('-t', 'html', '--css')
stdout = self.run_ok('-t', 'html', '--css', 'custom.css', '2004')
self.assertIn(b'<link rel="stylesheet" type="text/css" '
b'href="custom.css" />', stdout)
def test_main(): def test_main():
test_support.run_unittest( test_support.run_unittest(
OutputTestCase, OutputTestCase,
...@@ -468,8 +597,10 @@ def test_main(): ...@@ -468,8 +597,10 @@ def test_main():
SundayTestCase, SundayTestCase,
MonthRangeTestCase, MonthRangeTestCase,
LeapdaysTestCase, LeapdaysTestCase,
CommandLineTestCase,
) )
if __name__ == "__main__": if __name__ == "__main__":
test_main() test_main()
unittest.main()
...@@ -98,6 +98,8 @@ Tools/Demos ...@@ -98,6 +98,8 @@ Tools/Demos
Tests Tests
----- -----
- Issue #18982: Add tests for CLI of the calendar module.
- Issue #19949: The test_xpickle test now tests compatibility with installed - Issue #19949: The test_xpickle test now tests compatibility with installed
Python 2.7 and reports skipped tests. Based on patch by Zachary Ware. Python 2.7 and reports skipped tests. Based on patch by Zachary Ware.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment