import unittest import tempfile from configparser import ConfigParser from os.path import join from logFileModel import LogFileModel from settings import Settings class TestLogFileModel(unittest.TestCase): def setUp(self): self.test_dir = tempfile.TemporaryDirectory() self.tmpfile = join(self.test_dir.name, "my.log") self.model = LogFileModel(self.tmpfile, Settings(ConfigParser())) def tearDown(self): self.test_dir.cleanup() def write_str(self, string: str): with open(self.tmpfile, "w+b") as f: f.write(string.encode("utf8")) def test_load_from_beginning(self): self.write_str("1\n2\n3\n4\n5\n6\n7\n") expected_lines = ["1", "2", "3", "4", "5"] lines = self.model.data(0, 0, 5) line_str = [l.line() for l in lines] self.assertEqual(expected_lines, line_str) def test_load_from_middle_of_first_line(self): self.write_str("abc\ndef\nghi\njkl") expected_lines = ["abc", "def", "ghi"] lines = self.model.data(1, 0, 3) line_str = [l.line() for l in lines] self.assertEqual(expected_lines, line_str) def test_read_from_newline_character(self): self.write_str("abc\ndef\nghi\njkl") expected_lines = ["abc", "def"] lines = self.model.data(3, 0, 2) line_str = [l.line() for l in lines] self.assertEqual(expected_lines, line_str) def test_negative_byte_offset(self): self.write_str("abc\ndef\nghi\njkl") expected_lines = ["abc","def"] lines = self.model.data(-1, 0, 2) line_str = [l.line() for l in lines] self.assertEqual(expected_lines, line_str) def test_empty_last_line_is_ignored(self): self.write_str("1\n") expected_lines = ["1"] lines = self.model.data(0, 0, 5) line_str = [l.line() for l in lines] self.assertEqual(expected_lines, line_str) def test_load_more_lines_than_are_available(self): """ Wants to read 4 lines in a file with only 3 lines. Returns all three lines. """ self.write_str("abc\ndef\nghi") expected_lines = ["abc", "def", "ghi"] lines = self.model.data(0, 0, 4) line_str = [l.line() for l in lines] self.assertEqual(expected_lines, line_str) def test_read_behind_eof(self): """ Wants to read 4 lines from the middle of the second line. File has only 3 lines. Returns all 3 lines. """ text = "abc\ndef\nghi" self.write_str(text) expected_lines = ["abc", "def", "ghi"] lines = self.model.data(text.index("e"), 0, 4) line_str = [l.line() for l in lines] self.assertEqual(expected_lines, line_str) def test_read_after_scrolling_2_lines(self): """ """ text = "0___\n1___\n2___\n3___\n4___\n5___" self.write_str(text) expected_lines = ["3___", "4___"] lines = self.model.data(text.index("1___"), 2, 2) line_str = [l.line() for l in lines] self.assertEqual(expected_lines, line_str) def test_scroll_with_float(self): """ If lines to lines to return is a float, then the value is rounded up. Floats mean that the text area is such that a line is partially visible. """ text = "0___\n1___\n2___\n3___\n4___\n5___" self.write_str(text) expected_lines = ["3___","4___", "5___"] lines = self.model.data(text.index("1___"), 2, 2.1) line_str = [l.line() for l in lines] self.assertEqual(expected_lines, line_str) def test_scroll_up_at_beginning_of_file(self): """ Scrolling up at beginning of file. Return """ text = "0___\n1___\n2___\n3___\n4___\n5___" self.write_str(text) expected_lines = ["0___", "1___"] lines = self.model.data(5, -2, 2) line_str = [l.line() for l in lines] self.assertEqual(expected_lines, line_str) def test_read_word_at_middle_of_line(self): text = "0___\nlorem ipsum dolor sit amet\n2___" self.write_str(text) expected = ("ipsum", text.index("ipsum"), text.index("ipsum") + len("ipsum")) actual = self.model.read_word_at(text.index("ipsum") + 2) self.assertEqual(expected, actual) def test_read_word_at_start_of_line(self): text = "0___\nlorem ipsum dolor sit amet\n2___" word = "lorem" self.write_str(text) expected = (word, text.index(word), text.index(word) + len(word)) actual = self.model.read_word_at(text.index(word)) self.assertEqual(expected, actual) def test_read_word_at_end_of_line(self): text = "0___\nlorem ipsum dolor sit amet\n2___" word = "amet" self.write_str(text) expected = (word, text.index(word), text.index(word) + len(word)) actual = self.model.read_word_at(text.index(word)) self.assertEqual(expected, actual) def test_read_word_at_beginning_of_file(self): text = "lorem ipsum dolor sit amet\n1___" word = "lorem" self.write_str(text) expected = (word, text.index(word), text.index(word) + len(word)) actual = self.model.read_word_at(text.index(word)) self.assertEqual(expected, actual) if __name__ == '__main__': unittest.main()