1
0
Fork 0
colorclass/tests/test_example.py

97 lines
3.2 KiB
Python
Raw Permalink Normal View History

"""Test example script."""
import subprocess
import sys
import pytest
from colorclass.windows import IS_WINDOWS
from tests.conftest import PROJECT_ROOT
from tests.screenshot import RunNewConsole, screenshot_until_match
@pytest.mark.parametrize('colors', [True, False, None])
@pytest.mark.parametrize('light_bg', [True, False, None])
def test_piped(colors, light_bg):
"""Test script with output piped to non-tty (this pytest process).
:param bool colors: Enable, disable, or omit color arguments (default is no colors due to no tty).
:param bool light_bg: Enable light, dark, or omit light/dark arguments.
"""
command = [sys.executable, str(PROJECT_ROOT.join('example.py')), 'print']
# Set options.
if colors is True:
command.append('--colors')
elif colors is False:
command.append('--no-colors')
if light_bg is True:
command.append('--light-bg')
elif light_bg is False:
command.append('--dark-bg')
# Run.
proc = subprocess.Popen(command, stderr=subprocess.STDOUT, stdout=subprocess.PIPE)
output = proc.communicate()[0].decode()
assert proc.poll() == 0
assert 'Autocolors for all backgrounds' in output
assert 'Red' in output
# Verify colors. Output is always stripped of all colors on Windows when piped to non-console (e.g. pytest).
if colors is False or IS_WINDOWS:
assert '\033[' not in output
assert 'Black Red Green Yellow Blue Magenta Cyan White' in output
return
assert '\033[' in output
# Verify light bg.
count_dark_fg = output.count('\033[31mRed')
count_light_fg = output.count('\033[91mRed')
if light_bg:
assert count_dark_fg == 2
assert count_light_fg == 1
else:
assert count_dark_fg == 1
assert count_light_fg == 2
@pytest.mark.skipif(str(not IS_WINDOWS))
@pytest.mark.parametrize('colors,light_bg', [
(True, False),
(True, True),
(False, False),
(None, False),
])
def test_windows_screenshot(colors, light_bg):
"""Test script on Windows in a new console window. Take a screenshot to verify colors work.
:param bool colors: Enable, disable, or omit color arguments (default has colors).
:param bool light_bg: Create console with white background color.
"""
screenshot = PROJECT_ROOT.join('test_example_test_windows_screenshot.png')
if screenshot.check():
screenshot.remove()
command = [sys.executable, str(PROJECT_ROOT.join('example.py')), 'print', '-w', str(screenshot)]
# Set options.
if colors is True:
command.append('--colors')
elif colors is False:
command.append('--no-colors')
# Setup expected.
if colors is False:
candidates = [str(p) for p in PROJECT_ROOT.join('tests').listdir('sub_red_sans_*.bmp')]
expected_count = 27
elif light_bg:
candidates = [str(p) for p in PROJECT_ROOT.join('tests').listdir('sub_red_dark_fg_*.bmp')]
expected_count = 2
else:
candidates = [str(p) for p in PROJECT_ROOT.join('tests').listdir('sub_red_light_fg_*.bmp')]
expected_count = 2
assert candidates
# Run.
with RunNewConsole(command, maximized=True, white_bg=light_bg) as gen:
screenshot_until_match(str(screenshot), 15, candidates, expected_count, gen)