From 896739353a613f23c007d9acaa2809010a522a37 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Fri, 16 Sep 2022 11:10:14 +0200 Subject: Adding upstream version 2.2.0. Signed-off-by: Daniel Baumann --- tests/test_codes.py | 137 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 137 insertions(+) create mode 100644 tests/test_codes.py (limited to 'tests/test_codes.py') diff --git a/tests/test_codes.py b/tests/test_codes.py new file mode 100644 index 0000000..dd146c8 --- /dev/null +++ b/tests/test_codes.py @@ -0,0 +1,137 @@ +"""Test objects in module.""" + +import errno +import os +import subprocess +import sys +import time + +import pytest + +from colorclass.codes import ANSICodeMapping, BASE_CODES, list_tags +from colorclass.windows import IS_WINDOWS + + +def test_ansi_code_mapping_whitelist(): + """Test whitelist enforcement.""" + auto_codes = ANSICodeMapping('{green}{bgred}Test{/all}') + + # Test __getitem__. + with pytest.raises(KeyError): + assert not auto_codes['red'] + assert auto_codes['green'] == 32 + + # Test iter and len. + assert sorted(auto_codes) == ['/all', 'bgred', 'green'] + assert len(auto_codes) == 3 + + +@pytest.mark.parametrize('toggle', ['light', 'dark', 'none']) +def test_auto_toggles(toggle): + """Test auto colors and ANSICodeMapping class toggles. + + :param str toggle: Toggle method to call. + """ + # Toggle. + if toggle == 'light': + ANSICodeMapping.enable_all_colors() + ANSICodeMapping.set_light_background() + assert ANSICodeMapping.DISABLE_COLORS is False + assert ANSICodeMapping.LIGHT_BACKGROUND is True + elif toggle == 'dark': + ANSICodeMapping.enable_all_colors() + ANSICodeMapping.set_dark_background() + assert ANSICodeMapping.DISABLE_COLORS is False + assert ANSICodeMapping.LIGHT_BACKGROUND is False + else: + ANSICodeMapping.disable_all_colors() + assert ANSICodeMapping.DISABLE_COLORS is True + assert ANSICodeMapping.LIGHT_BACKGROUND is False + + # Test iter and len. + auto_codes = ANSICodeMapping('}{'.join([''] + list(BASE_CODES) + [''])) + count = 0 + for k, v in auto_codes.items(): + count += 1 + assert str(k) == k + assert v is None or int(v) == v + assert len(auto_codes) == count + + # Test foreground properties. + key_fg = '{autoblack}{autored}{autogreen}{autoyellow}{autoblue}{automagenta}{autocyan}{autowhite}' + actual = key_fg.format(**auto_codes) + if toggle == 'light': + assert actual == '3031323334353637' + elif toggle == 'dark': + assert actual == '9091929394959697' + else: + assert actual == 'NoneNoneNoneNoneNoneNoneNoneNone' + + # Test background properties. + key_fg = '{autobgblack}{autobgred}{autobggreen}{autobgyellow}{autobgblue}{autobgmagenta}{autobgcyan}{autobgwhite}' + actual = key_fg.format(**auto_codes) + if toggle == 'light': + assert actual == '4041424344454647' + elif toggle == 'dark': + assert actual == '100101102103104105106107' + else: + assert actual == 'NoneNoneNoneNoneNoneNoneNoneNone' + + +def test_list_tags(): + """Test list_tags().""" + actual = list_tags() + assert ('red', '/red', 31, 39) in actual + assert sorted(t for i in actual for t in i[:2] if t is not None) == sorted(BASE_CODES) + + +@pytest.mark.parametrize('tty', [False, True]) +def test_disable_colors_piped(tty): + """Verify colors enabled by default when piped to TTY and disabled when not. + + :param bool tty: Pipe to TTY/terminal? + """ + assert_statement = 'assert __import__("colorclass").codes.ANSICodeMapping.disable_if_no_tty() is {bool}' + command_colors_enabled = [sys.executable, '-c', assert_statement.format(bool='False')] + command_colors_disabled = [sys.executable, '-c', assert_statement.format(bool='True')] + + # Run piped to this pytest process. + if not tty: # Outputs piped to non-terminal/non-tty. Colors disabled by default. + proc = subprocess.Popen(command_colors_disabled, stderr=subprocess.STDOUT, stdout=subprocess.PIPE) + output = proc.communicate() + assert not output[0] + assert not output[1] + assert proc.poll() == 0 + return + + # Run through a new console window (Windows). + if IS_WINDOWS: + c_flags = subprocess.CREATE_NEW_CONSOLE + proc = subprocess.Popen(command_colors_enabled, close_fds=True, creationflags=c_flags) + proc.communicate() # Pipes directed towards new console window. Not worth doing screenshot image processing. + assert proc.poll() == 0 + return + + # Run through pseudo tty (Linux/OSX). + master, slave = __import__('pty').openpty() + proc = subprocess.Popen(command_colors_enabled, stderr=subprocess.STDOUT, stdout=slave, close_fds=True) + os.close(slave) + + # Read output. + output = '' + while True: + try: + data = os.read(master, 1024).decode() + except OSError as exc: + if exc.errno != errno.EIO: # EIO means EOF on some systems. + raise + data = None + if data: + output += data + elif proc.poll() is None: + time.sleep(0.01) + else: + break + os.close(master) + assert not output + assert proc.poll() == 0 -- cgit v1.2.3