Skip to content

Commit

Permalink
Maintenance: Tests: Use explicit encoding for tests
Browse files Browse the repository at this point in the history
* Tests with `render` can fail
  if detected encoding differs
  from used during test write

* add non-public api for internal testing:
  `util.get_encoding()` for public getting _target_encoding
  `util.set_temporary_encoding` context manager

* Extend "Canvas text is wider than the maxcol specified" details:
  reproduced on nonstandard encoding
  • Loading branch information
penguinolog committed Nov 28, 2023
1 parent d2dc7fb commit 0f14f71
Show file tree
Hide file tree
Showing 12 changed files with 322 additions and 202 deletions.
3 changes: 2 additions & 1 deletion tests/test_canvas.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

import urwid
from urwid import canvas
from urwid.util import get_encoding


class CanvasCacheTest(unittest.TestCase):
Expand Down Expand Up @@ -303,7 +304,7 @@ def test(self):

class CanvasOverlayTest(unittest.TestCase):
def setUp(self) -> None:
self.old_encoding = urwid.util._target_encoding
self.old_encoding = get_encoding()

def tearDown(self) -> None:
urwid.set_encoding(self.old_encoding)
Expand Down
9 changes: 4 additions & 5 deletions tests/test_doctests.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
import urwid.numedit


def load_tests(loader, tests, ignore):
def load_tests(loader: unittest.TestLoader, tests: unittest.BaseTestSuite, ignore) -> unittest.BaseTestSuite:
module_doctests = [
urwid.widget.attr_map,
urwid.widget.attr_wrap,
Expand Down Expand Up @@ -39,11 +39,10 @@ def load_tests(loader, tests, ignore):
urwid.monitored_list,
urwid.raw_display,
urwid.font,
'urwid.split_repr', # override function with same name
"urwid.split_repr", # override function with same name
urwid.util,
urwid.signals,
]
]
for m in module_doctests:
tests.addTests(doctest.DocTestSuite(m,
optionflags=doctest.ELLIPSIS | doctest.IGNORE_EXCEPTION_DETAIL))
tests.addTests(doctest.DocTestSuite(m, optionflags=doctest.ELLIPSIS | doctest.IGNORE_EXCEPTION_DETAIL))
return tests
11 changes: 6 additions & 5 deletions tests/test_font.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,20 +3,21 @@
import unittest

import urwid
from urwid.util import get_encoding


class TestFontRender(unittest.TestCase):
def setUp(self) -> None:
self.old_encoding = urwid.util._target_encoding
self.old_encoding = get_encoding()
urwid.set_encoding("utf-8")

def tearDown(self) -> None:
urwid.set_encoding(self.old_encoding)

def test_001_basic(self):
font = urwid.Thin3x3Font()
rendered = b'\n'.join(font.render("1").text).decode()
expected = '\n\n'
rendered = b"\n".join(font.render("1").text).decode()
expected = "\n\n"
self.assertEqual(expected, rendered)

def test_002_non_rect(self):
Expand All @@ -25,6 +26,6 @@ def test_002_non_rect(self):
Lines as bytes should be not equal length.
"""
font = urwid.Thin3x3Font()
rendered = b'\n'.join(font.render("2").text).decode()
expected = '┌─┐\n┌─┘\n└─ '
rendered = b"\n".join(font.render("2").text).decode()
expected = "┌─┐\n┌─┘\n└─ "
self.assertEqual(expected, rendered)
233 changes: 168 additions & 65 deletions tests/test_graphics.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,21 +3,24 @@
import unittest

import urwid
from urwid.util import get_encoding
from urwid.widget import bar_graph


class LineBoxTest(unittest.TestCase):
def setUp(self) -> None:
self.old_encoding = urwid.util._target_encoding
self.old_encoding = get_encoding()
urwid.set_encoding("utf-8")

def tearDown(self) -> None:
urwid.set_encoding(self.old_encoding)

def border(self, tl, t, tr, l, r, bl, b, br):
return [b''.join([tl, t, tr]),
b''.join([l, b" ", r]),
b''.join([bl, b, br]),]
return [
b"".join([tl, t, tr]),
b"".join([l, b" ", r]),
b"".join([bl, b, br]),
]

def test_linebox_pack(self):
# Bug #346 'pack' Padding does not run with LineBox
Expand All @@ -34,86 +37,186 @@ def test_linebox_border(self):
l = urwid.LineBox(t).render((3,)).text

# default
self.assertEqual(l,
self.border(b"\xe2\x94\x8c", b"\xe2\x94\x80",
b"\xe2\x94\x90", b"\xe2\x94\x82", b"\xe2\x94\x82",
b"\xe2\x94\x94", b"\xe2\x94\x80", b"\xe2\x94\x98"))

nums = [str(n).encode('iso8859-1') for n in range(8)]
b = dict(zip(["tlcorner", "tline", "trcorner", "lline", "rline",
"blcorner", "bline", "brcorner"], nums))
self.assertEqual(
l,
self.border(
b"\xe2\x94\x8c",
b"\xe2\x94\x80",
b"\xe2\x94\x90",
b"\xe2\x94\x82",
b"\xe2\x94\x82",
b"\xe2\x94\x94",
b"\xe2\x94\x80",
b"\xe2\x94\x98",
),
)

nums = [str(n).encode("iso8859-1") for n in range(8)]
b = dict(zip(["tlcorner", "tline", "trcorner", "lline", "rline", "blcorner", "bline", "brcorner"], nums))
l = urwid.LineBox(t, **b).render((3,)).text

self.assertEqual(l, self.border(*nums))


class BarGraphTest(unittest.TestCase):
def bgtest(self, desc, data, top, widths, maxrow, exp ):
rval = bar_graph.calculate_bargraph_display(data,top,widths,maxrow)
def bgtest(self, desc, data, top, widths, maxrow, exp):
rval = bar_graph.calculate_bargraph_display(data, top, widths, maxrow)
assert rval == exp, f"{desc} expected {exp!r}, got {rval!r}"

def test1(self):
self.bgtest('simplest',[[0]],5,[1],1,
[(1,[(0,1)])] )
self.bgtest('simpler',[[0],[0]],5,[1,2],5,
[(5,[(0,3)])] )
self.bgtest('simple',[[5]],5,[1],1,
[(1,[(1,1)])] )
self.bgtest('2col-1',[[2],[0]],5,[1,2],5,
[(3,[(0,3)]), (2,[(1,1),(0,2)]) ] )
self.bgtest('2col-2',[[0],[2]],5,[1,2],5,
[(3,[(0,3)]), (2,[(0,1),(1,2)]) ] )
self.bgtest('2col-3',[[2],[3]],5,[1,2],5,
[(2,[(0,3)]), (1,[(0,1),(1,2)]), (2,[(1,3)]) ] )
self.bgtest('3col-1',[[5],[3],[0]],5,[2,1,1],5,
[(2,[(1,2),(0,2)]), (3,[(1,3),(0,1)]) ] )
self.bgtest('3col-2',[[4],[4],[4]],5,[2,1,1],5,
[(1,[(0,4)]), (4,[(1,4)]) ] )
self.bgtest('3col-3',[[1],[2],[3]],5,[2,1,1],5,
[(2,[(0,4)]), (1,[(0,3),(1,1)]), (1,[(0,2),(1,2)]),
(1,[(1,4)]) ] )
self.bgtest('3col-4',[[4],[2],[4]],5,[1,2,1],5,
[(1,[(0,4)]), (2,[(1,1),(0,2),(1,1)]), (2,[(1,4)]) ] )
self.bgtest("simplest", [[0]], 5, [1], 1, [(1, [(0, 1)])]),
self.bgtest(
"simpler",
[[0], [0]],
5,
[1, 2],
5,
[(5, [(0, 3)])],
)
self.bgtest(
"simple",
[[5]],
5,
[1],
1,
[(1, [(1, 1)])],
)
self.bgtest(
"2col-1",
[[2], [0]],
5,
[1, 2],
5,
[(3, [(0, 3)]), (2, [(1, 1), (0, 2)])],
)
self.bgtest(
"2col-2",
[[0], [2]],
5,
[1, 2],
5,
[(3, [(0, 3)]), (2, [(0, 1), (1, 2)])],
)
self.bgtest(
"2col-3",
[[2], [3]],
5,
[1, 2],
5,
[(2, [(0, 3)]), (1, [(0, 1), (1, 2)]), (2, [(1, 3)])],
)
self.bgtest(
"3col-1",
[[5], [3], [0]],
5,
[2, 1, 1],
5,
[(2, [(1, 2), (0, 2)]), (3, [(1, 3), (0, 1)])],
)
self.bgtest(
"3col-2",
[[4], [4], [4]],
5,
[2, 1, 1],
5,
[(1, [(0, 4)]), (4, [(1, 4)])],
)
self.bgtest(
"3col-3",
[[1], [2], [3]],
5,
[2, 1, 1],
5,
[(2, [(0, 4)]), (1, [(0, 3), (1, 1)]), (1, [(0, 2), (1, 2)]), (1, [(1, 4)])],
)
self.bgtest(
"3col-4",
[[4], [2], [4]],
5,
[1, 2, 1],
5,
[(1, [(0, 4)]), (2, [(1, 1), (0, 2), (1, 1)]), (2, [(1, 4)])],
)

def test2(self):
self.bgtest('simple1a',[[2,0],[2,1]],2,[1,1],2,
[(1,[(1,2)]),(1,[(1,1),(2,1)]) ] )
self.bgtest('simple1b',[[2,1],[2,0]],2,[1,1],2,
[(1,[(1,2)]),(1,[(2,1),(1,1)]) ] )
self.bgtest('cross1a',[[2,2],[1,2]],2,[1,1],2,
[(2,[(2,2)]) ] )
self.bgtest('cross1b',[[1,2],[2,2]],2,[1,1],2,
[(2,[(2,2)]) ] )
self.bgtest('mix1a',[[3,2,1],[2,2,2],[1,2,3]],3,[1,1,1],3,
[(1,[(1,1),(0,1),(3,1)]),(1,[(2,1),(3,2)]),
(1,[(3,3)]) ] )
self.bgtest('mix1b',[[1,2,3],[2,2,2],[3,2,1]],3,[1,1,1],3,
[(1,[(3,1),(0,1),(1,1)]),(1,[(3,2),(2,1)]),
(1,[(3,3)]) ] )
self.bgtest(
"simple1a",
[[2, 0], [2, 1]],
2,
[1, 1],
2,
[(1, [(1, 2)]), (1, [(1, 1), (2, 1)])],
)
self.bgtest(
"simple1b",
[[2, 1], [2, 0]],
2,
[1, 1],
2,
[(1, [(1, 2)]), (1, [(2, 1), (1, 1)])],
)
self.bgtest("cross1a", [[2, 2], [1, 2]], 2, [1, 1], 2, [(2, [(2, 2)])])
self.bgtest("cross1b", [[1, 2], [2, 2]], 2, [1, 1], 2, [(2, [(2, 2)])])
self.bgtest(
"mix1a",
[[3, 2, 1], [2, 2, 2], [1, 2, 3]],
3,
[1, 1, 1],
3,
[(1, [(1, 1), (0, 1), (3, 1)]), (1, [(2, 1), (3, 2)]), (1, [(3, 3)])],
)
self.bgtest(
"mix1b",
[[1, 2, 3], [2, 2, 2], [3, 2, 1]],
3,
[1, 1, 1],
3,
[(1, [(3, 1), (0, 1), (1, 1)]), (1, [(3, 2), (2, 1)]), (1, [(3, 3)])],
)


class SmoothBarGraphTest(unittest.TestCase):
def setUp(self) -> None:
self.old_encoding = urwid.util._target_encoding
self.old_encoding = get_encoding()
urwid.set_encoding("utf-8")

def tearDown(self) -> None:
urwid.set_encoding(self.old_encoding)

def sbgtest(self, desc, data, top, exp ):
g = urwid.BarGraph( ['black','red','blue'],
None, {(1,0):'red/black', (2,1):'blue/red'})
g.set_data( data, top )
rval = g.calculate_display((5,3))
def sbgtest(self, desc, data, top, exp):
g = urwid.BarGraph(["black", "red", "blue"], None, {(1, 0): "red/black", (2, 1): "blue/red"})
g.set_data(data, top)
rval = g.calculate_display((5, 3))
assert rval == exp, f"{desc} expected {exp!r}, got {rval!r}"

def test1(self):
self.sbgtest('simple', [[3]], 5,
[(1, [(0, 5)]), (1, [((1, 0, 6), 5)]), (1, [(1, 5)])] )
self.sbgtest('boring', [[4,2]], 6,
[(1, [(0, 5)]), (1, [(1, 5)]), (1, [(2,5)]) ] )
self.sbgtest('two', [[4],[2]], 6,
[(1, [(0, 5)]), (1, [(1, 3), (0, 2)]), (1, [(1, 5)]) ] )
self.sbgtest('twos', [[3],[4]], 6,
[(1, [(0, 5)]), (1, [((1,0,4), 3), (1, 2)]), (1, [(1,5)]) ] )
self.sbgtest('twof', [[4],[3]], 6,
[(1, [(0, 5)]), (1, [(1,3), ((1,0,4), 2)]), (1, [(1,5)]) ] )
self.sbgtest(
"simple",
[[3]],
5,
[(1, [(0, 5)]), (1, [((1, 0, 6), 5)]), (1, [(1, 5)])],
)
self.sbgtest(
"boring",
[[4, 2]],
6,
[(1, [(0, 5)]), (1, [(1, 5)]), (1, [(2, 5)])],
)
self.sbgtest(
"two",
[[4], [2]],
6,
[(1, [(0, 5)]), (1, [(1, 3), (0, 2)]), (1, [(1, 5)])],
)
self.sbgtest(
"twos",
[[3], [4]],
6,
[(1, [(0, 5)]), (1, [((1, 0, 4), 3), (1, 2)]), (1, [(1, 5)])],
)
self.sbgtest(
"twof",
[[4], [3]],
6,
[(1, [(0, 5)]), (1, [(1, 3), ((1, 0, 4), 2)]), (1, [(1, 5)])],
)

0 comments on commit 0f14f71

Please sign in to comment.