summaryrefslogtreecommitdiffstats
path: root/tests/test_terminal_io
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test_terminal_io')
-rw-r--r--tests/test_terminal_io/__init__.py45
-rw-r--r--tests/test_terminal_io/sub_title_ascii_win10.bmpbin0 -> 1998 bytes
-rw-r--r--tests/test_terminal_io/sub_title_ascii_win2012.bmpbin0 -> 3048 bytes
-rw-r--r--tests/test_terminal_io/sub_title_ascii_winxp.bmpbin0 -> 2070 bytes
-rw-r--r--tests/test_terminal_io/sub_title_cjk_win10.bmpbin0 -> 4278 bytes
-rw-r--r--tests/test_terminal_io/sub_title_cjk_win2012.bmpbin0 -> 6896 bytes
-rw-r--r--tests/test_terminal_io/sub_title_cjk_winxp.bmpbin0 -> 4322 bytes
-rw-r--r--tests/test_terminal_io/test_get_console_info.py28
-rw-r--r--tests/test_terminal_io/test_set_terminal_title.py110
-rw-r--r--tests/test_terminal_io/test_terminal_size.py54
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
new file mode 100644
index 0000000..638d0a3
--- /dev/null
+++ b/tests/test_terminal_io/sub_title_ascii_win10.bmp
Binary files differ
diff --git a/tests/test_terminal_io/sub_title_ascii_win2012.bmp b/tests/test_terminal_io/sub_title_ascii_win2012.bmp
new file mode 100644
index 0000000..04f0f2a
--- /dev/null
+++ b/tests/test_terminal_io/sub_title_ascii_win2012.bmp
Binary files differ
diff --git a/tests/test_terminal_io/sub_title_ascii_winxp.bmp b/tests/test_terminal_io/sub_title_ascii_winxp.bmp
new file mode 100644
index 0000000..c40a2d2
--- /dev/null
+++ b/tests/test_terminal_io/sub_title_ascii_winxp.bmp
Binary files differ
diff --git a/tests/test_terminal_io/sub_title_cjk_win10.bmp b/tests/test_terminal_io/sub_title_cjk_win10.bmp
new file mode 100644
index 0000000..052e6b5
--- /dev/null
+++ b/tests/test_terminal_io/sub_title_cjk_win10.bmp
Binary files differ
diff --git a/tests/test_terminal_io/sub_title_cjk_win2012.bmp b/tests/test_terminal_io/sub_title_cjk_win2012.bmp
new file mode 100644
index 0000000..ec48a85
--- /dev/null
+++ b/tests/test_terminal_io/sub_title_cjk_win2012.bmp
Binary files differ
diff --git a/tests/test_terminal_io/sub_title_cjk_winxp.bmp b/tests/test_terminal_io/sub_title_cjk_winxp.bmp
new file mode 100644
index 0000000..349f685
--- /dev/null
+++ b/tests/test_terminal_io/sub_title_cjk_winxp.bmp
Binary files differ
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