def setUp(self):
     self.io = IOMock()
     with self.io:
         self.interface = DexterInterface()
         self.view = self.interface.view
         self.terminal = self.interface.terminal
class TestDexterView(unittest.TestCase):
    def setUp(self):
        self.io = IOMock()
        with self.io:
            self.interface = DexterInterface()
            self.view = self.interface.view
            self.terminal = self.interface.terminal

    def tearDown(self):
        with self.terminal:
            pass

    def get_line(self, y):
        return "".join(chr(self.terminal.stdscr.inch(y, x)) for x in range(self.terminal.width))

    def get_lines(self):
        height = self.terminal.height
        return [self.get_line(y) for y in range(height)]

    def blank_lines(self, n):
        return [self.blank_line] * n

    @property
    def blank_line(self):
        return " " * self.terminal.width

    def test_append_no_newline(self):
        self.view.append("Hello world")
        self.assertEqual(self.view.contents, ["Hello world"])

    def test_append_with_newlines(self):
        self.view.append("ABC\nDEF\nGHI")
        self.assertEqual(self.view.contents, ["ABC", "DEF", "GHI"])

    def test_multiple_append(self):
        self.view.append("Line 1")
        self.view.append("Line 2\nLine 3")
        self.assertEqual(self.view.contents, ["Line 1", "Line 2", "Line 3"])

    def assertLines(self, lines):
        width = self.terminal.width
        expected = self.blank_lines(self.terminal.height - len(lines))
        expected += [line.ljust(width) for line in lines]
        self.assertEqual(self.get_lines(), expected)

    def test_draw_empty(self):
        with self.io:
            self.interface.redraw()
        self.assertLines(["msglog>"])

    def test_draw_one_line(self):
        with self.io:
            self.view.append("Hello")
            self.interface.redraw()
        self.assertLines(["Hello", "msglog>"])

    def test_draw_two_lines(self):
        with self.io:
            self.view.append("Hello\nworld")
            self.interface.redraw()
        self.assertLines(["Hello", "world", "msglog>"])

    def test_draw_long_line(self):
        with self.io:
            width = self.terminal.width
            self.view.append("q" * (width + 5))
            self.interface.redraw()
        self.assertLines(["q" * width, "msglog>"])  # Trimmed to terminal width