diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2022-09-16 09:09:35 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2022-09-16 09:09:35 +0000 |
commit | 0dfe1c9e2780469e3a4696e8fb3e6f717a7ebeb7 (patch) | |
tree | a0b651b55ea02e3b00bbc5eedba566fdd6bd7c08 /tests/test_terminal_io | |
parent | Initial commit. (diff) | |
download | terminaltables-0dfe1c9e2780469e3a4696e8fb3e6f717a7ebeb7.tar.xz terminaltables-0dfe1c9e2780469e3a4696e8fb3e6f717a7ebeb7.zip |
Adding upstream version 3.1.0.upstream/3.1.0
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'tests/test_terminal_io')
-rw-r--r-- | tests/test_terminal_io/__init__.py | 45 | ||||
-rw-r--r-- | tests/test_terminal_io/sub_title_ascii_win10.bmp | bin | 0 -> 1998 bytes | |||
-rw-r--r-- | tests/test_terminal_io/sub_title_ascii_win2012.bmp | bin | 0 -> 3048 bytes | |||
-rw-r--r-- | tests/test_terminal_io/sub_title_ascii_winxp.bmp | bin | 0 -> 2070 bytes | |||
-rw-r--r-- | tests/test_terminal_io/sub_title_cjk_win10.bmp | bin | 0 -> 4278 bytes | |||
-rw-r--r-- | tests/test_terminal_io/sub_title_cjk_win2012.bmp | bin | 0 -> 6896 bytes | |||
-rw-r--r-- | tests/test_terminal_io/sub_title_cjk_winxp.bmp | bin | 0 -> 4322 bytes | |||
-rw-r--r-- | tests/test_terminal_io/test_get_console_info.py | 28 | ||||
-rw-r--r-- | tests/test_terminal_io/test_set_terminal_title.py | 110 | ||||
-rw-r--r-- | tests/test_terminal_io/test_terminal_size.py | 54 |
10 files changed, 237 insertions, 0 deletions
diff --git a/tests/test_terminal_io/__init__.py b/tests/test_terminal_io/__init__.py new file mode 100644 index 0000000..93738fc --- /dev/null +++ b/tests/test_terminal_io/__init__.py @@ -0,0 +1,45 @@ +"""Common objects used by tests in directory.""" + +from terminaltables import terminal_io + + +class MockKernel32(object): + """Mock kernel32.""" + + def __init__(self, stderr=terminal_io.INVALID_HANDLE_VALUE, stdout=terminal_io.INVALID_HANDLE_VALUE): + """Constructor.""" + self.stderr = stderr + self.stdout = stdout + self.csbi_err = b'x\x00)#\x00\x00\x87\x05\x07\x00\x00\x00j\x05w\x00\x87\x05x\x00J\x00' # 119 x 29 + self.csbi_out = b'L\x00,\x01\x00\x00*\x01\x07\x00\x00\x00\x0e\x01K\x00*\x01L\x00L\x00' # 75 x 28 + self.setConsoleTitleA_called = False + self.setConsoleTitleW_called = False + + def GetConsoleScreenBufferInfo(self, handle, lpcsbi): # noqa + """Mock GetConsoleScreenBufferInfo. + + :param handle: Unused handle. + :param lpcsbi: ctypes.create_string_buffer() return value. + """ + if handle == self.stderr: + lpcsbi.raw = self.csbi_err + else: + lpcsbi.raw = self.csbi_out + return 1 + + def GetStdHandle(self, handle): # noqa + """Mock GetStdHandle. + + :param int handle: STD_ERROR_HANDLE or STD_OUTPUT_HANDLE. + """ + return self.stderr if handle == terminal_io.STD_ERROR_HANDLE else self.stdout + + def SetConsoleTitleA(self, _): # noqa + """Mock SetConsoleTitleA.""" + self.setConsoleTitleA_called = True + return 1 + + def SetConsoleTitleW(self, _): # noqa + """Mock SetConsoleTitleW.""" + self.setConsoleTitleW_called = True + return 1 diff --git a/tests/test_terminal_io/sub_title_ascii_win10.bmp b/tests/test_terminal_io/sub_title_ascii_win10.bmp Binary files differnew file mode 100644 index 0000000..638d0a3 --- /dev/null +++ b/tests/test_terminal_io/sub_title_ascii_win10.bmp diff --git a/tests/test_terminal_io/sub_title_ascii_win2012.bmp b/tests/test_terminal_io/sub_title_ascii_win2012.bmp Binary files differnew file mode 100644 index 0000000..04f0f2a --- /dev/null +++ b/tests/test_terminal_io/sub_title_ascii_win2012.bmp diff --git a/tests/test_terminal_io/sub_title_ascii_winxp.bmp b/tests/test_terminal_io/sub_title_ascii_winxp.bmp Binary files differnew file mode 100644 index 0000000..c40a2d2 --- /dev/null +++ b/tests/test_terminal_io/sub_title_ascii_winxp.bmp diff --git a/tests/test_terminal_io/sub_title_cjk_win10.bmp b/tests/test_terminal_io/sub_title_cjk_win10.bmp Binary files differnew file mode 100644 index 0000000..052e6b5 --- /dev/null +++ b/tests/test_terminal_io/sub_title_cjk_win10.bmp diff --git a/tests/test_terminal_io/sub_title_cjk_win2012.bmp b/tests/test_terminal_io/sub_title_cjk_win2012.bmp Binary files differnew file mode 100644 index 0000000..ec48a85 --- /dev/null +++ b/tests/test_terminal_io/sub_title_cjk_win2012.bmp diff --git a/tests/test_terminal_io/sub_title_cjk_winxp.bmp b/tests/test_terminal_io/sub_title_cjk_winxp.bmp Binary files differnew file mode 100644 index 0000000..349f685 --- /dev/null +++ b/tests/test_terminal_io/sub_title_cjk_winxp.bmp diff --git a/tests/test_terminal_io/test_get_console_info.py b/tests/test_terminal_io/test_get_console_info.py new file mode 100644 index 0000000..1a9b98f --- /dev/null +++ b/tests/test_terminal_io/test_get_console_info.py @@ -0,0 +1,28 @@ +# coding: utf-8 +"""Test function in module.""" + +import ctypes + +import pytest + +from terminaltables.terminal_io import get_console_info, INVALID_HANDLE_VALUE, IS_WINDOWS + +from tests.test_terminal_io import MockKernel32 + + +def test(): + """Test function.""" + # Test live WinError. + if IS_WINDOWS: + with pytest.raises(OSError): + get_console_info(ctypes.windll.kernel32, 0) + + # Test INVALID_HANDLE_VALUE. + kernel32 = MockKernel32(stderr=1) + with pytest.raises(OSError): + get_console_info(kernel32, INVALID_HANDLE_VALUE) + + # Test no error with mock methods. + width, height = get_console_info(kernel32, 1) + assert width == 119 + assert height == 29 diff --git a/tests/test_terminal_io/test_set_terminal_title.py b/tests/test_terminal_io/test_set_terminal_title.py new file mode 100644 index 0000000..6d58301 --- /dev/null +++ b/tests/test_terminal_io/test_set_terminal_title.py @@ -0,0 +1,110 @@ +# coding: utf-8 +"""Test function in module.""" + +import sys +from textwrap import dedent + +import py +import pytest + +from terminaltables.terminal_io import IS_WINDOWS, set_terminal_title + +from tests import PROJECT_ROOT +from tests.screenshot import RunNewConsole, screenshot_until_match +from tests.test_terminal_io import MockKernel32 + +HERE = py.path.local(__file__).dirpath() + + +@pytest.mark.parametrize('is_windows', [False, True]) +@pytest.mark.parametrize('mode', ['ascii', 'unicode', 'bytes']) +def test(monkeypatch, is_windows, mode): + """Test function. + + :param monkeypatch: pytest fixture. + :param bool is_windows: Monkeypatch terminal_io.IS_WINDOWS + :param str mode: Scenario to test for. + """ + monkeypatch.setattr('terminaltables.terminal_io.IS_WINDOWS', is_windows) + kernel32 = MockKernel32() + + # Title. + if mode == 'ascii': + title = 'Testing terminaltables.' + elif mode == 'unicode': + title = u'Testing terminaltables with unicode: 世界你好蓝色' + else: + title = b'Testing terminaltables with bytes.' + + # Run. + assert set_terminal_title(title, kernel32) + if not is_windows: + return + + # Verify. + if mode == 'ascii': + assert kernel32.setConsoleTitleA_called + assert not kernel32.setConsoleTitleW_called + elif mode == 'unicode': + assert not kernel32.setConsoleTitleA_called + assert kernel32.setConsoleTitleW_called + else: + assert kernel32.setConsoleTitleA_called + assert not kernel32.setConsoleTitleW_called + + +@pytest.mark.skipif(str(not IS_WINDOWS)) +@pytest.mark.skipif('True') # https://github.com/Robpol86/terminaltables/issues/30 +@pytest.mark.parametrize('mode', ['ascii', 'unicode', 'bytes']) +def test_windows_screenshot(tmpdir, mode): + """Test function on Windows in a new console window. Take a screenshot to verify it works. + + :param tmpdir: pytest fixture. + :param str mode: Scenario to test for. + """ + script = tmpdir.join('script.py') + command = [sys.executable, str(script)] + change_title = tmpdir.join('change_title') + screenshot = PROJECT_ROOT.join('test_terminal_io.png') + if screenshot.check(): + screenshot.remove() + + # Determine title. + if mode == 'ascii': + title = "'test ASCII test'" + elif mode == 'unicode': + title = u"u'test 世界你好蓝色 test'" + else: + title = "b'test ASCII test'" + + # Generate script. + script_template = dedent(u"""\ + # coding: utf-8 + from __future__ import print_function + import os, time + from terminaltables.terminal_io import set_terminal_title + stop_after = time.time() + 20 + + print('Waiting for FindWindowA() in RunNewConsole.__enter__()...') + while not os.path.exists(r'{change_title}') and time.time() < stop_after: + time.sleep(0.5) + assert set_terminal_title({title}) is True + + print('Waiting for screenshot_until_match()...') + while not os.path.exists(r'{screenshot}') and time.time() < stop_after: + time.sleep(0.5) + """) + script_contents = script_template.format(change_title=str(change_title), title=title, screenshot=str(screenshot)) + script.write(script_contents.encode('utf-8'), mode='wb') + + # Setup expected. + if mode == 'unicode': + sub_images = [str(p) for p in HERE.listdir('sub_title_cjk_*.bmp')] + else: + sub_images = [str(p) for p in HERE.listdir('sub_title_ascii_*.bmp')] + assert sub_images + + # Run. + with RunNewConsole(command) as gen: + change_title.ensure(file=True) # Touch file. + screenshot_until_match(str(screenshot), 15, sub_images, 1, gen) diff --git a/tests/test_terminal_io/test_terminal_size.py b/tests/test_terminal_io/test_terminal_size.py new file mode 100644 index 0000000..ba14d18 --- /dev/null +++ b/tests/test_terminal_io/test_terminal_size.py @@ -0,0 +1,54 @@ +# coding: utf-8 +"""Test function in module.""" + +import pytest + +from terminaltables.terminal_io import DEFAULT_HEIGHT, DEFAULT_WIDTH, INVALID_HANDLE_VALUE, IS_WINDOWS, terminal_size + +from tests.test_terminal_io import MockKernel32 + + +@pytest.mark.parametrize('stderr', [1, INVALID_HANDLE_VALUE]) +@pytest.mark.parametrize('stdout', [2, INVALID_HANDLE_VALUE]) +def test_windows(monkeypatch, stderr, stdout): + """Test function with IS_WINDOWS=True. + + :param monkeypatch: pytest fixture. + :param int stderr: Mock handle value. + :param int stdout: Mock handle value. + """ + monkeypatch.setattr('terminaltables.terminal_io.IS_WINDOWS', True) + + kernel32 = MockKernel32(stderr=stderr, stdout=stdout) + width, height = terminal_size(kernel32) + + if stderr == INVALID_HANDLE_VALUE and stdout == INVALID_HANDLE_VALUE: + assert width == DEFAULT_WIDTH + assert height == DEFAULT_HEIGHT + elif stdout == INVALID_HANDLE_VALUE: + assert width == 119 + assert height == 29 + elif stderr == INVALID_HANDLE_VALUE: + assert width == 75 + assert height == 28 + else: + assert width == 119 + assert height == 29 + + +@pytest.mark.skipif(str(IS_WINDOWS)) +def test_nix(monkeypatch): + """Test function with IS_WINDOWS=False. + + :param monkeypatch: pytest fixture. + """ + # Test exception (no terminal within pytest). + width, height = terminal_size() + assert width == DEFAULT_WIDTH + assert height == DEFAULT_HEIGHT + + # Test mocked. + monkeypatch.setattr('fcntl.ioctl', lambda *_: b'\x1d\x00w\x00\xca\x02\x96\x01') + width, height = terminal_size() + assert width == 119 + assert height == 29 |