pylib-hacks / testing / io_ / test_terminalwriter.py

import py
import os, sys
from py._io import terminalwriter

def test_get_terminal_width():
    x = py.io.get_terminal_width
    assert x == terminalwriter.get_terminal_width

def test_getdimensions(monkeypatch):
    fcntl = py.test.importorskip("fcntl")
    import struct
    l = []
    monkeypatch.setattr(fcntl, 'ioctl', lambda *args: l.append(args))
    try:
        terminalwriter._getdimensions()
    except (TypeError, struct.error):
        pass
    assert len(l) == 1
    assert l[0][0] == 1

def test_terminal_width_COLUMNS(monkeypatch):
    """ Dummy test for get_terminal_width
    """
    fcntl = py.test.importorskip("fcntl")
    monkeypatch.setattr(fcntl, 'ioctl', lambda *args: int('x'))
    monkeypatch.setenv('COLUMNS', '42')
    assert terminalwriter.get_terminal_width() == 42
    monkeypatch.delenv('COLUMNS', raising=False)

def test_terminalwriter_defaultwidth_80(monkeypatch):
    monkeypatch.setattr(terminalwriter, '_getdimensions', lambda: 0/0)
    monkeypatch.delenv('COLUMNS', raising=False)
    tw = py.io.TerminalWriter()
    assert tw.fullwidth == 80

def test_terminalwriter_getdimensions_bogus(monkeypatch):
    monkeypatch.setattr(terminalwriter, '_getdimensions', lambda: (10,10))
    monkeypatch.delenv('COLUMNS', raising=False)
    tw = py.io.TerminalWriter()
    assert tw.fullwidth == 80

def test_terminalwriter_computes_width(monkeypatch):
    monkeypatch.setattr(terminalwriter, 'get_terminal_width', lambda: 42)
    tw = py.io.TerminalWriter()
    assert tw.fullwidth == 42

def test_terminalwriter_default_instantiation():
    tw = py.io.TerminalWriter(stringio=True)
    assert hasattr(tw, 'stringio')

def test_terminalwriter_dumb_term_no_markup(monkeypatch):
    monkeypatch.setattr(os, 'environ', {'TERM': 'dumb', 'PATH': ''})
    class MyFile:
        def isatty(self):
            return True
    monkeypatch.setattr(sys, 'stdout', MyFile())
    try:
        assert sys.stdout.isatty()
        tw = py.io.TerminalWriter()
        assert not tw.hasmarkup
    finally:
        monkeypatch.undo()

def test_unicode_encoding():
    msg = py.builtin._totext('b\u00f6y', 'utf8')
    for encoding in 'utf8', 'latin1':
        l = []
        tw = py.io.TerminalWriter(l.append, encoding=encoding)
        tw.line(msg)
        assert l[0].strip() == msg.encode(encoding)

class TestTerminalWriter:
    def pytest_generate_tests(self, metafunc):
        if "tw" in metafunc.funcargnames:
            metafunc.addcall(id="path", param="path")
            metafunc.addcall(id="stringio", param="stringio")
            metafunc.addcall(id="callable", param="callable")
    def pytest_funcarg__tw(self, request):
        if request.param == "path":
            tmpdir = request.getfuncargvalue("tmpdir")
            p = tmpdir.join("tmpfile")
            import codecs
            f = codecs.open(str(p), 'w+', encoding='utf8')
            tw = py.io.TerminalWriter(f)
            def getlines():
                tw._file.flush()
                return p.open('r').readlines()
        elif request.param == "stringio":
            tw = py.io.TerminalWriter(stringio=True)
            def getlines():
                tw.stringio.seek(0)
                return tw.stringio.readlines()
        elif request.param == "callable":
            writes = []
            tw = py.io.TerminalWriter(writes.append)
            def getlines():
                io = py.io.TextIO()
                io.write("".join(writes))
                io.seek(0)
                return io.readlines()
        tw.getlines = getlines
        return tw

    def test_line(self, tw):
        tw.line("hello")
        l = tw.getlines()
        assert len(l) == 1
        assert l[0] == "hello\n"

    def test_line_unicode(self, tw):
        for encoding in 'utf8', 'latin1':
            tw._encoding = encoding
            msg = py.builtin._totext('b\u00f6y', 'utf8')
            tw.line(msg)
            l = tw.getlines()
            assert l[0] == msg + "\n"

    def test_sep_no_title(self, tw):
        tw.sep("-", fullwidth=60)
        l = tw.getlines()
        assert len(l) == 1
        assert l[0] == "-" * 60 + "\n"

    def test_sep_with_title(self, tw):
        tw.sep("-", "hello", fullwidth=60)
        l = tw.getlines()
        assert len(l) == 1
        assert l[0] == "-" * 26 + " hello " + "-" * 27 + "\n"

    @py.test.mark.skipif("sys.platform == 'win32'")
    def test__escaped(self, tw):
        text2 = tw._escaped("hello", (31))
        assert text2.find("hello") != -1

    @py.test.mark.skipif("sys.platform == 'win32'")
    def test_markup(self, tw):
        for bold in (True, False):
            for color in ("red", "green"):
                text2 = tw.markup("hello", **{color: True, 'bold': bold})
                assert text2.find("hello") != -1
        py.test.raises(ValueError, "tw.markup('x', wronkw=3)")
        py.test.raises(ValueError, "tw.markup('x', wronkw=0)")

    def test_line_write_markup(self, tw):
        tw.hasmarkup = True
        tw.line("x", bold=True)
        tw.write("x\n", red=True)
        l = tw.getlines()
        if sys.platform != "win32":
            assert len(l[0]) >= 2, l
            assert len(l[1]) >= 2, l

    def test_attr_fullwidth(self, tw):
        tw.sep("-", "hello", fullwidth=70)
        tw.fullwidth = 70
        tw.sep("-", "hello")
        l = tw.getlines()
        assert len(l[0]) == len(l[1])


def test_attr_hasmarkup():
    tw = py.io.TerminalWriter(stringio=True)
    assert not tw.hasmarkup
    tw.hasmarkup = True
    tw.line("hello", bold=True)
    s = tw.stringio.getvalue()
    assert len(s) > len("hello")

def test_ansi_print():
    # we have no easy way to construct a file that
    # represents a terminal
    f = py.io.TextIO()
    f.isatty = lambda: True
    py.io.ansi_print("hello", 0x32, file=f)
    text2 = f.getvalue()
    assert text2.find("hello") != -1
    assert len(text2) >= len("hello")
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.