Advertisement
Orrin19

Linked List Test

Oct 5th, 2023
46
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 8.09 KB | None | 0 0
  1. """Тесты модуля linked_list"""
  2.  
  3. import unittest
  4.  
  5. from linked_list import LinkedListItem, LinkedList  # pylint: disable=E0401
  6.  
  7.  
  8. TEST_LEN = [
  9.     0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
  10. ]
  11.  
  12. TEST_LAST = TEST_LEN
  13.  
  14. TEST_REMOVE = [
  15.     ([1], 1),
  16.     ([1, 1, 1], 1),
  17.     ([2, 1, 1, 3], 1),
  18.     ([2, 3, 4], 2),
  19.     ([2, 3, 4], 4),
  20. ]
  21.  
  22. TEST_REMOVE_FAILED = [
  23.     ([], 1),
  24.     ([1], 2),
  25.     ([1, 1, 1, 3, 4], 2),
  26. ]
  27.  
  28. TEST_CONTAINS = [
  29.     ([], 1, False),
  30.     ([1], 1, True),
  31.     ([1], 2, False),
  32.     ([1, 1, 1], 1, True),
  33.     ([2, 3], 5, False),
  34.     ([2, 3], 3, True),
  35. ]
  36.  
  37. TEST_GETITEM = [
  38.     ([2], 0),
  39.     ([4], -1),
  40.     ([5, 1], 1),
  41.     ([5, 1], -2),
  42.     ([2, 0, 1, 4, 2], 2),
  43. ]
  44.  
  45. TEST_GETITEM_FAILED = [
  46.     ([], 0),
  47.     ([1], 1),
  48.     ([1], -2),
  49.     ([1, 2, 3], 3),
  50.     ([1, 2, 4], -4),
  51. ]
  52.  
  53. TEST_INSERT = [
  54.     # (create_linked_list([]), 0, 42),
  55.     ([1], 0, 42),
  56.     # (create_linked_list([2]), 1, 42),
  57.     ([1, 2, 3], 1, 42),
  58.     ([1, 2, 3], 0, 42),
  59. ]
  60.  
  61.  
  62. def create_linked_list(nodes_list):
  63.     """Создание связного списка"""
  64.     return LinkedList(*nodes_list)
  65.  
  66.  
  67. class TestLinkedListItem(unittest.TestCase):
  68.     """Тест-кейс класса LinkedListItem"""
  69.  
  70.     def test_next_item(self):
  71.         """Тест соединения узлов через next_item"""
  72.         node_a = LinkedListItem(42)
  73.         node_b = LinkedListItem(196)
  74.         node_a.next_item = node_b
  75.         self.assertTrue(node_a.next_item is node_b)
  76.         self.assertTrue(node_a.previous_item is None)
  77.         self.assertTrue(node_b.next_item is None)
  78.         self.assertTrue(node_b.previous_item is node_a)
  79.  
  80.     def test_previous_item(self):
  81.         """Тест соединения узлов через previous_item"""
  82.         node_a = LinkedListItem(42)
  83.         node_b = LinkedListItem(196)
  84.         node_b.previous_item = node_a
  85.         self.assertTrue(node_a.next_item is node_b)
  86.         self.assertTrue(node_a.previous_item is None)
  87.         self.assertTrue(node_b.next_item is None)
  88.         self.assertTrue(node_b.previous_item is node_a)
  89.  
  90.  
  91. class TestLinkedList(unittest.TestCase):
  92.     """Тест-кейс класса LinkedList"""
  93.  
  94.     def test_len(self):
  95.         """Тест метода len"""
  96.         for expected_len in TEST_LEN:
  97.             linked_list = LinkedList(*list(range(expected_len)))
  98.             with self.subTest(expected_len=expected_len):
  99.                 self.assertEqual(len(linked_list), expected_len)
  100.  
  101.     def test_last(self):
  102.         """Тест свойства last"""
  103.         for last in TEST_LAST:
  104.             linked_list = LinkedList(*list(range(last)))
  105.             with self.subTest(last=last):
  106.                 if last == 0:
  107.                     self.assertEqual(linked_list.last, None)
  108.                 else:
  109.                     self.assertEqual(linked_list.last, last - 1)
  110.  
  111.     def test_append_left(self):
  112.         """Тест метода append_left"""
  113.         for expected_len in TEST_LAST:
  114.             linked_list = LinkedList()
  115.             for i in range(expected_len):
  116.                 linked_list.append_left(i)
  117.             with self.subTest(expected_len=expected_len):
  118.                 last_first = linked_list.first_item
  119.                 linked_list.append_left(42)
  120.                 first_item = linked_list.first_item  # pylint: disable=E1101
  121.                 self.assertTrue(first_item is not last_first)
  122.                 if expected_len == 0:
  123.                     self.assertTrue(first_item.next_item is first_item)
  124.                 else:
  125.                     self.assertTrue(
  126.                         first_item.next_item.content == expected_len - 1)
  127.  
  128.     def test_append_right(self):
  129.         """Тест метода append_right"""
  130.         for expected_len in TEST_LAST:
  131.             linked_list = LinkedList()
  132.             for i in range(expected_len):
  133.                 linked_list.append_right(i)
  134.             with self.subTest(expected_len=expected_len):
  135.                 linked_list.append_right(42)
  136.                 first_item = linked_list.first_item
  137.                 appended_item = linked_list.first_item.previous_item
  138.                 if expected_len == 0:
  139.                     self.assertTrue(appended_item.content == 42)
  140.                     self.assertTrue(appended_item.next_item is appended_item)
  141.                 else:
  142.                     self.assertTrue(first_item.previous_item is appended_item)
  143.                     self.assertTrue(appended_item.next_item is first_item)
  144.  
  145.     def test_append(self):
  146.         """Тест метода append"""
  147.         for expected_len in TEST_LAST:
  148.             linked_list = LinkedList()
  149.             linked_list.append(*list(range(expected_len)))
  150.             with self.subTest(expected_len=expected_len):
  151.                 linked_list.append(42)
  152.                 first_item = linked_list.first_item
  153.                 appended_item = linked_list.first_item.previous_item
  154.                 if expected_len == 0:
  155.                     self.assertTrue(appended_item.content == 42)
  156.                     self.assertTrue(appended_item.next_item is appended_item)
  157.                 else:
  158.                     self.assertTrue(first_item.previous_item is appended_item)
  159.                     self.assertTrue(appended_item.next_item is first_item)
  160.  
  161.     def test_remove(self):
  162.         """Тест метода remove"""
  163.         for node_list, remove_item in TEST_REMOVE:
  164.             linked_list = create_linked_list(node_list)
  165.             with self.subTest(node_list=node_list, remove_item=remove_item):
  166.                 linked_list.remove(remove_item)
  167.                 self.assertEqual(len(linked_list), len(node_list) - 1)
  168.  
  169.     def test_remove_failed(self):
  170.         """Тест метода remove с исключением ValueError"""
  171.         for node_list, remove_item in TEST_REMOVE_FAILED:
  172.             linked_list = create_linked_list(node_list)
  173.             with self.subTest(node_list=node_list, remove_item=remove_item):
  174.                 with self.assertRaises(ValueError):
  175.                     linked_list.remove(remove_item)
  176.  
  177.     def test_insert(self):
  178.         """Тест метода insert"""
  179.         for node_list, index, content in TEST_INSERT:
  180.             linked_list = create_linked_list(node_list)
  181.             with self.subTest(node_list=node_list, index=index,
  182.                               content=content):
  183.                 linked_list.insert(linked_list[index], content)
  184.                 self.assertEqual(len(linked_list), len(node_list) + 1)
  185.                 node_list.insert(index + 1, content)
  186.                 self.assertEqual([i.content for i in linked_list], node_list)
  187.  
  188.     def test_getitem(self):
  189.         """Тест индексации"""
  190.         for node_list, index in TEST_GETITEM:
  191.             linked_list = create_linked_list(node_list)
  192.             with self.subTest(node_list=node_list, index=index):
  193.                 item = linked_list[index]
  194.                 self.assertEqual(item, node_list[index])
  195.  
  196.     def test_getitem_failed(self):
  197.         """Тест индексации с исключением IndexError"""
  198.         for node_list, index in TEST_GETITEM_FAILED:
  199.             linked_list = create_linked_list(node_list)
  200.             with self.subTest(node_list=node_list, index=index):
  201.                 with self.assertRaises(IndexError):
  202.                     _ = linked_list[index]
  203.  
  204.     def test_contains(self):
  205.         """Тест поддержки оператора in"""
  206.         for node_list, item, expected in TEST_CONTAINS:
  207.             linked_list = create_linked_list(node_list)
  208.             with self.subTest(node_list=node_list, item=item, expected=expected):
  209.                 self.assertTrue((item in linked_list) is expected)
  210.  
  211.     def test_reversed(self):
  212.         """Тест поддержки функции reversed"""
  213.         for i in TEST_LEN:
  214.             linked_list = create_linked_list(list(range(i)))
  215.             with self.subTest(node_list=list(range(i))):
  216.                 self.assertEqual(
  217.                     list(reversed(linked_list)),
  218.                     list(range(i - 1, -1, -1))
  219.                 )
  220.  
  221.  
  222. if __name__ == '__main__':
  223.     unittest.main()
  224.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement