You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
trezor-firmware/core/tests/test_trezor.ui.text.py

151 lines
4.8 KiB

import mock
from common import *
from trezor import ui
from trezor.ui import display
from trezor.ui.components.common import text
if False:
from typing import List, Tuple
class TestTextSpan(unittest.TestCase):
def lines(self, span: text.Span) -> List[Tuple[str, int, bool]]:
result = []
while True:
should_continue = span.next_line()
substr = span.string[span.start : span.start + span.length]
result.append((substr, span.width, span.word_break))
if not should_continue:
break
return result
def checkSpanWithoutWidths(
self, span: text.Span, expected: List[Tuple[str, bool]]
) -> None:
expected_with_calculated_widths = [
(string, ui.display.text_width(string, span.font), word_break)
for string, word_break in expected
]
self.assertListEqual(self.lines(span), expected_with_calculated_widths)
def test_basic(self):
span = text.Span("hello")
self.checkSpanWithoutWidths(
span,
[("hello", False)],
)
span.reset("world", start=0, font=ui.NORMAL)
self.checkSpanWithoutWidths(
span,
[("world", False)],
)
span.reset("", start=0, font=ui.NORMAL)
self.checkSpanWithoutWidths(
span,
[("", False)],
)
def test_two_lines(self):
line_width = display.text_width("hello world", ui.NORMAL) - 1
span = text.Span("hello world", line_width=line_width)
self.checkSpanWithoutWidths(
span,
[
("hello", False),
("world", False),
],
)
def test_newlines(self):
span = text.Span("hello\nworld")
self.checkSpanWithoutWidths(
span,
[
("hello", False),
("world", False),
],
)
span = text.Span("\nhello\nworld\n")
self.checkSpanWithoutWidths(
span,
[
("", False),
("hello", False),
("world", False),
("", False),
],
)
def test_break_words(self):
line_width = display.text_width("hello w", ui.NORMAL) + text.DASH_WIDTH
span = text.Span("hello world", line_width=line_width, break_words=True)
self.checkSpanWithoutWidths(
span,
[
("hello w", True),
("orld", False),
],
)
def test_long_word(self):
line_width = display.text_width("establishme", ui.NORMAL) + text.DASH_WIDTH
span = text.Span(
"Down with the establishment!", line_width=line_width, break_words=False
)
self.checkSpanWithoutWidths(
span,
[
("Down with", False),
("the", False),
("establishme", True),
("nt!", False),
],
)
def test_has_more_content(self):
line_width = display.text_width("hello world", ui.NORMAL) - 1
span = text.Span("hello world", line_width=line_width)
self.assertTrue(span.has_more_content())
self.assertTrue(span.next_line())
self.assertEqual("hello", span.string[span.start : span.start + span.length])
# has_more_content is True because there's text remaining on the line
self.assertTrue(span.has_more_content())
# next_line is False because we should not continue iterating
self.assertFalse(span.next_line())
self.assertEqual("world", span.string[span.start : span.start + span.length])
self.assertFalse(span.has_more_content())
self.assertFalse(span.next_line())
self.assertEqual("world", span.string[span.start : span.start + span.length])
def test_has_more_content_trailing_newline(self):
span = text.Span("1\n2\n3\n")
self.assertTrue(span.has_more_content())
self.assertTrue(span.next_line())
self.assertEqual("1", span.string[span.start : span.start + span.length])
self.assertTrue(span.has_more_content())
self.assertTrue(span.next_line())
self.assertEqual("2", span.string[span.start : span.start + span.length])
self.assertTrue(span.has_more_content())
self.assertTrue(span.next_line())
self.assertEqual("3", span.string[span.start : span.start + span.length])
# has_more_content is False because the "remaining" text is empty
self.assertFalse(span.has_more_content())
# next_line is False because we should not continue iterating
self.assertFalse(span.next_line())
self.assertEqual("", span.string[span.start : span.start + span.length])
if __name__ == "__main__":
unittest.main()