"""Tests fuer den Anzeigetreiber -- Zeilenaufbau und die festen Hinweistexte. python3 -m unittest test_display """ import unittest import config import migra from display import Display from transport import FakeTransport def _lesbar(frame): """Telegramm als lesbarer Text; Steuerzeichen werden zu '.'.""" return "".join(chr(b) if 32 <= b < 127 else "." for b in frame) class TestFesteTexte(unittest.TestCase): """Die Hinweiszeilen muessen in die Anzeige passen. Am Geraet aufgefallen: "MONTIERUNG" hat 10 Zeichen, die Anzeige fasst 9 -- angezeigt wurde "MONTIERUN". _emit_line schneidet stillschweigend ab, also faellt so etwas sonst erst auf der Anzeige auf. """ def test_hinweiszeilen_passen_in_die_zeilenbreite(self): for name in ("NOLINK_LINES", "NOWIFI_LINES"): for zeile in getattr(config, name): self.assertLessEqual( len(zeile), config.CHARS_PER_LINE, "config.%s: %r hat %d Zeichen, die Anzeige fasst %d" % (name, zeile, len(zeile), config.CHARS_PER_LINE)) def test_es_gibt_nicht_mehr_hinweiszeilen_als_zeilen(self): for name in ("NOLINK_LINES", "NOWIFI_LINES"): self.assertLessEqual(len(getattr(config, name)), len(config.LINE_Y)) class TestZeilenaufbau(unittest.TestCase): def setUp(self): self.t = FakeTransport(echo=False) self.d = Display(self.t, response=True) def _letztes(self): return self.t.frames[-1] def test_zeile_wird_auf_volle_breite_aufgefuellt(self): """Ohne Auffuellen blieben Reste der vorigen Anzeige stehen. Gleichzeitig die Regressionsprobe fuer str.ljust, das MicroPython nicht kennt (am Geraet aufgefallen). """ self.d.show_lines("AB", "CD") text = _lesbar(self._letztes()) self.assertIn("AB" + " " * (config.CHARS_PER_LINE - 2), text) self.assertIn("CD" + " " * (config.CHARS_PER_LINE - 2), text) def test_zu_lange_zeile_wird_abgeschnitten(self): """Zu breit aufgefuellt bricht das Fuell-Leerzeichen um und beschaedigt die andere Zeile -- deshalb hart abschneiden.""" lang = "X" * (config.CHARS_PER_LINE + 5) self.d.show_lines(lang) text = _lesbar(self._letztes()) self.assertIn("X" * config.CHARS_PER_LINE, text) self.assertNotIn("X" * (config.CHARS_PER_LINE + 1), text) def test_oberste_zeile_wird_zuletzt_gezeichnet(self): """Schutz der Home-Zelle: ein Zeichensatzwechsel mitten im Telegramm zerstoert (0,0), die oberste Zeile muss danach kommen.""" self.d.show_lines("OBEN", "UNTEN") text = _lesbar(self._letztes()) self.assertLess(text.index("UNTEN"), text.index("OBEN")) def test_clear_erzeugt_ein_vollbild_loeschen(self): self.d.show_lines("A", "B", clear=True) mit = self._letztes() self.d.show_lines("A", "B", clear=False) ohne = self._letztes() fuellen = bytes([migra.ESC]) + b"F" + config.BACKGROUND.encode("ascii") self.assertIn(fuellen, mit) self.assertNotIn(fuellen, ohne) def test_mehr_zeilen_als_die_anzeige_hat(self): with self.assertRaises(ValueError): self.d.show_lines(*(["X"] * (len(config.LINE_Y) + 1))) if __name__ == "__main__": unittest.main()