# Software Testing 2022 [Midterm Presentation Slide](https://docs.google.com/presentation/d/1BNvzCAU-AFe7dv5KwQXJqVix3bjKb0K35qoTjQGDRHg/edit?usp=sharing) [Final Project Slide](https://docs.google.com/presentation/d/1F6jVtTycf7MSLwjpIzZfn54CMAU5qAVgKTSvbUMLIj8/edit#slide=id.p) [Groupwork 3](https://docs.google.com/document/d/1WBHuCnHhDnXBJn-w6E9m_md22DBG9UsheCBfELU6ABg/edit?usp=sharing) [Github](https://github.com/psf/black) [Drive](https://drive.google.com/drive/folders/1gLVl_2TgvLeCVrIpGOZR8AHjiJVXrmcT?usp=sharing) [Final Project Drive](https://drive.google.com/drive/folders/1dKtDkWYSXtcKvu9tsUKdMKWvmsnL7rUc?usp=sharing) [Final Project Report](https://docs.google.com/document/d/1QZ8gQuqFVfxQhgwqdw065H-DplGZ5N8RxKv9mBY5AF4/edit?usp=sharing) ## Unit Testing **source file:** //src/black/lines.py **Testing tools:** Unitest ## Difficulties - Hard to debug mock ## Special Case - Hard to debug mock - Infeasiable Test Requirement ## Coverage ``` $ pip install coverage $ coverage run -m unittest discover $ coverage html ``` --- ### [lines.py](https://github.com/psf/black/blob/main/src/black/lines.py) - [x] append - [x] append_safe - [x] is_comment - [x] is_decorator - [x] is_import - [x] is_class - [x] is_stub_class - [x] is_def - [x] is_class_paren_empty - [x] is_triple_quoted_string - [x] contains_standalone_comments - [x] contains_uncollapsable_type_comments - [x] contains_unsplittable_type_ignore - [x] contains_multiline_strings - [x] has_magic_trailing_comma - [x] append_comment - [x] comments_after - [x] remove_trailing_comma - [x] is_complex_subscript - [x] enumerate_with_length - [x] clone - [x] __str__ - [x] __bool__ * **Line Class: append function** ([CFG](https://i.imgur.com/RBwLKDA.png)) ```python= class test_append(unittest.TestCase): def setUp(self): print('Tests (Edge Coverage) for "append" Method in Line Class: ', end=' ') # pass def tearDown(self): print('') # pass def test_append_case1(self) -> None: # ALL Node and ALL Edge Coverage # 6 test paths are needed for Edge Coverage ## [1,2,4,6,7,8,9,12,15,10,14,3] ## [1,2,4,6,8,9,11,10,14,3] ## [1,2,4,6,7,8,9,12,10,3] ## [1,2,4,6,8,10,14,3] ## [1,2,4,5,6,8,9,11,13,10,14,3] ## [1,2,3] ## Test Path: [1, 2, 3] mode = Mode() line = Line(mode) leaf = Leaf(value = " ", type = 0) line.append(leaf = leaf) self.assertEqual(str(line), "\n") print("Test Path: [1, 2, 3] Completed") def test_append_case2(self) -> None: ## Test Path: [1, 2, 4, 5, 6, 8, 10, 14, 3] mode = Mode() line = Line(mode) ### is_class_paren_empty == True leaf0 = Leaf(value = "class", type = token.NAME) leaf1 = Leaf(value = " Car", type = token.STRING) leaf2 = Leaf(value = "(", type = token.LPAR) leaf3 = Leaf(value = ")", type = token.RPAR) line.leaves.append(leaf0) line.leaves.append(leaf1) line.leaves.append(leaf2) line.leaves.append(leaf3) leaf = Leaf(value = ":", type = token.COLON) line.append(leaf = leaf, preformatted = True) self.assertEqual(str(line), "class Car:\n") print("Test Path: [1, 2, 4, 5, 6, 8, 10, 14, 3] Completed") def test_append_case3(self) -> None: ## Test Path: [1, 2, 4, 6, 8, 9, 11, 10, 14, 3] mode = Mode() line = Line(mode) leaf = Leaf(value = "hello", type = token.STRING) line.append(leaf = leaf) self.assertEqual(str(line), "hello\n") print("Test Path: [1, 2, 4, 6, 8, 9, 11, 10, 14, 3] Completed") def test_append_case4(self) -> None: ## Test Path: [1, 2, 4, 6, 7, 8, 9, 12, 10, 3] mode = Mode(magic_trailing_comma = False) line = Line(mode) leaf0 = Leaf(value = "# comment1", type = token.COMMENT) line.leaves.append(leaf0) leaf = Leaf(value = "comment2", type = token.COMMENT) line.append(leaf = leaf, preformatted = False) self.assertEqual(str(line), "# comment1 comment2\n") print("Test Path: [1, 2, 4, 6, 7, 8, 9, 12, 10, 3] Completed") def test_append_case5(self) -> None: ## Test Path: [1, 2, 4, 6, 7, 8, 9, 12, 15, 10, 14, 3] mode = Mode(magic_trailing_comma = False) line = Line(mode) leaf0 = Leaf(value = "[", type = token.LBRACE) leaf1 = Leaf(value = ",", type = token.COMMA) line.append(leaf = leaf0) line.append(leaf = leaf1) leaf = Leaf(value = "]", type = token.RBRACE) line.append(leaf = leaf) self.assertEqual(str(line), "[]\n") print("Test Path: [1, 2, 4, 6, 7, 8, 9, 12, 15, 10, 14, 3] Completed") def test_append_case6(self) -> None: ## Test Path: [1, 2, 4, 5, 6, 8, 9, 11, 13, 10, 14, 3] mode = Mode() line = Line(mode) leaf0 = Leaf(value = "[", type = token.LBRACE) leaf1 = Leaf(value = ",", type = token.COMMA) line.append(leaf = leaf0) line.append(leaf = leaf1) leaf = Leaf(value = "]", type = token.RBRACE) line.append(leaf = leaf) self.assertEqual(str(line), "[,]\n") print("Test Path: [1, 2, 4, 5, 6, 8, 9, 11, 13, 10, 14, 3] Completed") ``` --- * * **Line Class: append_safe function** ([CFG](https://i.imgur.com/et01iqj.png)) ```python= class TestAppendSafe(unittest.TestCase): # Case 1: [1,2,4,5,7] def test_append_safe_case1(self) -> None: mode = Mode() line = Line(mode) leaf0 = Leaf(value="Blackie", type=token.NAME) leaf1 = Leaf(value="# Comment", type=153) line.append(leaf0) with self.assertRaisesRegex( ValueError, "cannot append standalone comments to a populated line" ): line.append_safe(leaf1) # Case 2: [1,2,3] def test_append_safe_case2(self) -> None: mode = Mode() line = Line(mode) leaf0 = Leaf(value="Class", type=token.NAME) line.bracket_tracker.depth = 1 line.append = mock.Mock(return_value=None) line.append_safe(leaf0) line.append.assert_called_once() # Case 3: [1,2,4,6] def test_append_safe_case3(self) -> None: mode = Mode() line = Line(mode) leaf0 = Leaf(value="# Comment", type=153) leaf1 = Leaf(value="Blackie", type=token.STRING) line.append_safe(leaf0) with self.assertRaisesRegex(ValueError, "cannot append to standalone comments"): line.append_safe(leaf1) # Case 4: [1,2,4,5,3] def test_append_safe_case4(self) -> None: mode = Mode() leaf0 = Leaf(value="Blackie", type=token.NAME) with mock.patch( "black.Line.is_comment", new_callable=mock.PropertyMock ) as mock_is_comment: mock_is_comment.return_value = False line = Line(mode) line.append = mock.Mock(return_value=None) line.append_safe(leaf0) line.append.assert_called_once() ``` --- * **Line Class: is_comment property** ([CFG](https://i.imgur.com/GsBpjkM.png)) ```python= class test_is_comment(unittest.TestCase): def setUp(self): print('Tests (Edge-Pair Coverage) for "is_comment" Property in Line Class: ', end=' ') def tearDown(self): print('') def test_is_comment_case1(self) -> None: print("Case 1") mode = Mode() line = Line(mode) leaf = Leaf(value = "comment1", type = STANDALONE_COMMENT) line.leaves.append(leaf) r = line.is_comment self.assertTrue(r) print("Test Path: [1, 2] completed") def test_is_comment_case2(self) -> None: print("Case 2") mode = Mode() line = Line(mode) leaf = Leaf(value = "comment1", type = token.STRING) line.leaves.append(leaf) r = line.is_comment self.assertFalse(r) print("Test Path: [1, 3] completed") ``` --- * **Line Class: is_decorator property** ([CFG](https://i.imgur.com/z9ury7p.png)) ```python= class test_is_decorator(unittest.TestCase): def setUp(self): print('Tests (Edge-Pair Coverage) for "is_decorator" Property in Line Class: ', end=' ') def tearDown(self): print('') def test_is_decorator_case1(self) -> None: print("Case 1") mode = Mode() line = Line(mode) leaf = Leaf(value = "@", type = token.AT) line.leaves.append(leaf) r = line.is_decorator self.assertTrue(r) print("Test Path: [1, 2] completed") def test_is_decorator_case2(self) -> None: print("Case 2") mode = Mode() line = Line(mode) leaf = Leaf(value = "comment1", type = token.STRING) line.leaves.append(leaf) r = line.is_decorator self.assertFalse(r) print("Test Path: [1, 3] completed") ``` --- * **Line Class: is_import property** ([CFG](https://i.imgur.com/qMYT0iN.png)) ```python= class test_is_import(unittest.TestCase): def setUp(self): print('Tests (Edge-Pair Coverage) for "is_import" Property in Line Class: ', end=' ') def tearDown(self): print('') @mock.patch('black.nodes.is_import') def test_is_import_case1(self, mock_is_import) -> None: print("Case 1") mode = Mode() line = Line(mode) leaf = Leaf(value = "import", type = token.NAME) node = Node(type = syms.import_name, children=[leaf]) leaf.parent = node line.leaves.append(leaf) r = line.is_import self.assertTrue(r) print("Test Path: [1, 2] completed") def test_is_import_case2(self) -> None: print("Case 2") mode = Mode() line = Line(mode) leaf = Leaf(value = "impo", type = token.STRING) node = Node(type = syms.import_name, children=[leaf]) leaf.parent = node line.leaves.append(leaf) r = line.is_import self.assertFalse(r) print("Test Path: [1, 3] completed") ``` --- * **Line Class: is_class property** ([CFG](https://i.imgur.com/1gDTo6Z.png)) ```python= class test_is_class(unittest.TestCase): def setUp(self): print('Tests (Edge-Pair Coverage) for "is_class" Property in Line Class: ', end=' ') def tearDown(self): print('') def test_is_class_case1(self) -> None: print("Case 1") mode = Mode() line = Line(mode) leaf = Leaf(value = "class", type = token.NAME) line.leaves.append(leaf) r = line.is_class self.assertTrue(r) print("Test Path: [1, 2] completed") def test_is_class_case2(self) -> None: print("Case 2") mode = Mode() line = Line(mode) leaf = Leaf(value = "class", type = token.STRING) line.leaves.append(leaf) r = line.is_class self.assertFalse(r) print("Test Path: [1, 3] completed") ``` --- * **Line Class: is_stub_class property** ([CFG](https://i.imgur.com/Iuxz2zN.png)) ```python= class test_is_stub_class(unittest.TestCase): def setUp(self): print('Tests (Edge-Pair Coverage) for "is_stub_class" Property in Line Class: ', end=' ') def tearDown(self): print('') def test_is_stub_class_case1(self) -> None: print("Case 1") mode = Mode() line = Line(mode) leaf = Leaf(value = "class", type = token.NAME) line.leaves.append(leaf) leaf0 = Leaf(value = ".", type = token.DOT) line.leaves.append(leaf0) line.leaves.append(leaf0) line.leaves.append(leaf0) r = line.is_stub_class self.assertTrue(r) print("Test Path: [1, 2] completed") def test_is_stub_class_case2(self) -> None: print("Case 2") mode = Mode() line = Line(mode) leaf = Leaf(value = "class", type = token.NAME) line.leaves.append(leaf) r = line.is_stub_class self.assertFalse(r) print("Test Path: [1, 3] completed") ``` --- * **Line Class: is_def property** ([CFG](https://i.imgur.com/T0Di59U.png)) ```python= class test_is_def(unittest.TestCase): # [1, 2, 5, 4, 6] # [1, 2, 4, 6] # [1, 2, 4, 7, 8] # [1, 2, 5, 4, 7, 9] # [1, 3] def setUp(self): print('Tests (Edge-Pair Coverage) for "is_def" Property in Line Class: ', end=' ') def tearDown(self): print('') def test_is_def_case1(self) -> None: print("Case 1") # Test Path: [1, 3] mode = Mode() line = Line(mode) r = line.is_def self.assertFalse(r) print("Test Path: [1, 3] completed") def test_is_def_case2(self) -> None: print("Case 2") # Test Paht: [1, 2, 4, 6] mode = Mode() line = Line(mode) leaf0 = Leaf(value = "def", type = token.NAME) leaf1 = Leaf(value = "sort", type = token.STRING) line.leaves.append(leaf0) line.leaves.append(leaf1) r = line.is_def self.assertTrue(r) print("Test Path: [1, 2, 4, 6] completed") def test_is_def_case3(self) -> None: print("Case 3") # Test Paht: [1, 2, 4, 7, 8] mode = Mode() line = Line(mode) leaf0 = Leaf(value = "async", type = token.ASYNC) leaf1 = Leaf(value = "def", type = token.NAME) line.leaves.append(leaf0) line.leaves.append(leaf1) r = line.is_def self.assertTrue(r) print("Test Path: [1, 2, 4, 7, 8] completed") def test_is_def_case4(self) -> None: print("Case 4") # Test Paht: [1, 2, 5, 4, 6] mode = Mode() line = Line(mode) leaf0 = Leaf(value = "def", type = token.NAME) line.leaves.append(leaf0) r = line.is_def self.assertTrue(r) print("Test Path: [1, 2, 5, 4, 6] completed") def test_is_def_case5(self) -> None: print("Case 5") # Test Paht: [1, 2, 5, 4, 7, 9] mode = Mode() line = Line(mode) leaf0 = Leaf(value = "sort", type = token.STRING) line.leaves.append(leaf0) r = line.is_def self.assertFalse(r) print("Test Path: [1, 2, 5, 4, 7, 9] completed") ``` --- * **Line Class: is_class_paren_empty property** ([CFG](https://i.imgur.com/jIDcn0Z.png)) ```python= class test_is_class_paren_empty(unittest.TestCase): def setUp(self): print('Tests (Edge-Pair Coverage) for "is_class_paren_empty" Property in Line Class: ', end=' ') def tearDown(self): print('') def test_is_class_paren_empty_case1(self) -> None: print("Case 1") mode = Mode() line = Line(mode) leaf0 = Leaf(value = "class", type = token.NAME) leaf1 = Leaf(value = "vehicle", type = token.STRING) leaf2 = Leaf(value = "(", type = token.LPAR) leaf3 = Leaf(value = ")", type = token.RPAR) line.leaves.append(leaf0) line.leaves.append(leaf1) line.leaves.append(leaf2) line.leaves.append(leaf3) r = line.is_class_paren_empty self.assertTrue(r) print("Test Path: [1, 2] completed") def test_is_class_paren_empty_case2(self) -> None: print("Case 2") mode = Mode() line = Line(mode) leaf = Leaf(value = "comment1", type = token.STRING) line.leaves.append(leaf) r = line.is_class_paren_empty self.assertFalse(r) print("Test Path: [1, 3] completed") ``` --- * **Line Class: is_triple_quoted_string property** ([CFG](https://i.imgur.com/6vm9DUB.png)) ```python= class test_is_triple_quoted_string(unittest.TestCase): def setUp(self): print('Tests (Edge-Pair Coverage) for "is_triple_quoted_string" Property in Line Class: ', end=' ') def tearDown(self): print('') def test_is_triple_quoted_string_case1(self) -> None: print("Case 1") mode = Mode() line = Line(mode) leaf = Leaf(value = "\"\"\" hello word", type = token.STRING) line.leaves.append(leaf) r = line.is_triple_quoted_string self.assertTrue(r) print("Test Path: [1, 2] completed") def test_is_triple_quoted_string_case2(self) -> None: print("Case 2") mode = Mode() line = Line(mode) leaf = Leaf(value = "comment1", type = token.STRING) line.leaves.append(leaf) r = line.is_triple_quoted_string self.assertFalse(r) print("Test Path: [1, 3] completed") ``` --- * **Line Class: contains_standalone_comments function** ([CFG](https://i.imgur.com/Qq6uneP.png)) ```python= class test_contains_standalone_comments(unittest.TestCase): # [1, 2, 4] # [1, 2, 3, 5] # [1, 2, 3, 2, 4] # [1, 2, 3, 2, 3, 2, 4] def setUp(self): print('Tests (Edge-Pair Coverage) for "contains_standalone_comments" Function in Line Class: ', end=' ') def tearDown(self): print('') def test_contains_standalone_comments_case1(self) -> None: print("Case 1") # Test Path: [1, 2, 4] mode = Mode() line = Line(mode) r = line.contains_standalone_comments() self.assertFalse(r) print("Test Path: [1, 2, 4] completed") def test_contains_standalone_comments_case2(self) -> None: print("Case 2") # Test Path: [1, 2, 3, 5] mode = Mode() line = Line(mode) leaf0 = Leaf(value = "# comment", type = STANDALONE_COMMENT) leaf0.bracket_depth = 1 line.leaves.append(leaf0) r = line.contains_standalone_comments() self.assertTrue(r) print("Test Path: [1, 2, 3, 5] completed") def test_contains_standalone_comments_case3(self) -> None: print("Case 3") # Test Path: [1, 2, 3, 2, 4] mode = Mode() line = Line(mode) leaf0 = Leaf(value = "comment", type = token.STRING) leaf0.bracket_depth = 1 line.leaves.append(leaf0) r = line.contains_standalone_comments() self.assertFalse(r) print("Test Path: [1, 2, 3, 2, 4] completed") def test_contains_standalone_comments_case4(self) -> None: print("Case 4") # Test Path: [1, 2, 3, 2, 3, 2, 4] mode = Mode() line = Line(mode) leaf0 = Leaf(value = "comment", type = token.STRING) leaf0.bracket_depth = 1 leaf1 = Leaf(value = "HELLO", type = token.STRING) leaf1.bracket_depth = 1 line.leaves.append(leaf0) line.leaves.append(leaf1) r = line.contains_standalone_comments() self.assertFalse(r) print("Test Path: [1, 2, 3, 2, 3, 2, 4] completed") ``` --- * **Line Class: contains_uncollapsable_type_comments function** ([CFG](https://i.imgur.com/OnSQDvB.png)) ```python= class Test_contain_uncollapable_type_comments(unittest.TestCase): # [1,2,3,4,7,8,10,12,14,13,10,12,14,13,10,11,8,9] def test_append_safe_case1(self) -> None: mode = Mode() line = Line(mode) leaf0 = Leaf(value="# type: ignore", type=token.COMMENT) line.comments.setdefault(id(0), []).append(leaf0) self.assertFalse(line.contains_uncollapsable_type_comments()) # [1,2,3,4,7,8,10,11,8,10,12,13,10,12,14,15] def test_contain_uncollapsable_test2(self) -> None: mode = Mode() line = Line(mode) leaf0 = Leaf(value="# type: ignore", type=token.COMMENT) leaf1 = Leaf(value="# type:", type=token.COMMENT) line.comments.setdefault(id(0), []).append(leaf0) line.comments.setdefault(id(1), []).append(leaf0) # print(is_type_comment(leaf0, " ignore")) # print(is_type_comment(leaf1, " ignore")) line.append(leaf1) self.assertTrue(line.contains_uncollapsable_type_comments()) # [1,2,3,4,6,7,8,9] def test_contain_uncollapsable_test3(self) -> None: mode = Mode() line = Line(mode) leaf0 = Leaf(value="Blackie", type=token.COMMA) leaf1 = Leaf(value="Blackie", type=token.COMMA) line.append_safe(leaf0) line.append_safe(leaf1) self.assertEqual(0, len(line.comments.items())) self.assertFalse(line.contains_uncollapsable_type_comments()) # [1,2,3,5] def test_contain_uncollapsable_test4(self) -> None: mode = Mode() line = Line(mode) self.assertFalse(line.contains_uncollapsable_type_comments()) ``` --- * **Line Class: contains_unsplittable_type_ignore function** ([CFG](https://i.imgur.com/ln0jRmr.png)) ```python= class test_contains_unsplittable_type_ignore(unittest.TestCase): # [1, 2] # [1, 3, 4, 6] # [1, 3, 4, 5, 7, 6] not possible # [1, 3, 4, 5, 7, 8, 9, 11] # [1, 3, 4, 5, 7, 8, 12, 7, 8, 12, 7, 6] # [1, 3, 4, 5, 7, 8, 12, 7, 8, 9, 12, 7, 6] def setUp(self): print('Tests (Edge-Pair Coverage) for "contains_unsplittable_type_ignore" Function in Line Class: ', end=' ') def tearDown(self): print('') def test_contains_unsplittable_type_ignore_case1(self) -> None: print("Case 1") # Test Path: [1, 2] mode = Mode() line = Line(mode) r = line.contains_unsplittable_type_ignore() self.assertFalse(r) print("Test Path: [1, 2] completed") def test_contains_unsplittable_type_ignore_case2(self) -> None: print("Case 2") # Test Path: [1, 3, 4, 6] mode = Mode() line = Line(mode) leaf0 = Leaf(value = "hello", type = token.STRING) leaf1 = Leaf(value = "# comment", type = token.COMMENT) leaf0.lineno = 1 leaf1.lineno = 2 line.leaves.append(leaf0) line.leaves.append(leaf1) r = line.contains_unsplittable_type_ignore() self.assertFalse(r) print("Test Path: [1, 3, 4, 6] completed") def test_contains_unsplittable_type_ignore_case3(self) -> None: print("Case 3") # Test Path: [1, 3, 4, 5, 7, 8, 12, 7, 8, 12, 7, 6] mode = Mode() line = Line(mode) leaf0 = Leaf(value = "hello", type = token.STRING) leaf1 = Leaf(value = "# comment", type = token.COMMENT) line.leaves.append(leaf0) line.leaves.append(leaf1) r = line.contains_unsplittable_type_ignore() self.assertFalse(r) print("Test Path: [1, 3, 4, 5, 7, 8, 12, 7, 8, 12, 7, 6] completed") def test_contains_unsplittable_type_ignore_case4(self) -> None: print("Case 4") # Test Path: [1, 3, 4, 5, 7, 8, 9, 11] mode = Mode() line = Line(mode) leaf0 = Leaf(value = "hello", type = token.STRING) comment0 = Leaf(value = "# type: ignore", type = token.COMMENT) line.comments.setdefault(id(leaf0), []).append(comment0) line.leaves.append(leaf0) r = line.contains_unsplittable_type_ignore() self.assertTrue(r) print("Test Path: [1, 3, 4, 5, 7, 8, 9, 11] completed") def test_contains_unsplittable_type_ignore_case5(self) -> None: print("Case 5") # Test Path: [1, 3, 4, 5, 7, 8, 12, 7, 8, 9, 12, 7, 6] mode = Mode() line = Line(mode) leaf0 = Leaf(value = "hello", type = token.STRING) leaf1 = Leaf(value = "world", type = token.STRING) comment0 = Leaf(value = "# type:ignore", type = token.COMMENT) line.comments.setdefault(id(leaf0), []).append(comment0) line.leaves.append(leaf1) line.leaves.append(leaf0) r = line.contains_unsplittable_type_ignore() self.assertFalse(r) print("Test Path: [1, 3, 4, 5, 7, 8, 12, 7, 8, 9, 12, 7, 6] completed") ``` --- * **Line Class: contains_multiline_strings function** ([CFG](https://i.imgur.com/m6cj5Vs.png)) ```python= class test_contains_multiline_strings_class(unittest.TestCase): def setUp(self): print('Tests (Edge-Pair Coverage) for "contains_multiline_strings" Function in Line Class: ', end=' ') def tearDown(self): print('') def test_contains_multiline_strings_case1(self) -> None: print("Case 1") mode = Mode() line = Line(mode) leaf = Leaf(value = '"""\n', type = token.STRING) line.leaves.append(leaf) r = line.contains_multiline_strings() self.assertTrue(r) print("Test Path: [1, 2] completed") def test_contains_multiline_strings_case2(self) -> None: print("Case 2") mode = Mode() line = Line(mode) leaf = Leaf(value = "class", type = token.NAME) line.leaves.append(leaf) r = line.contains_multiline_strings() self.assertFalse(r) print("Test Path: [1, 3] completed") ``` --- * **Line Class: has_magic_trailing_comma function** ([CFG](https://i.imgur.com/9558jZC.png)) ```python= class test_has_magic_trailing_comma(unittest.TestCase): # [1, 2] # [1, 3, 4] # [1, 3, 5, 6, 8] # [1, 3, 5, 7, 14] # [1, 3, 5, 6, 9, 10] # [1, 3, 5, 7, 15, 17] # [1, 3, 5, 7, 15, 16] # [1, 3, 5, 6, 9, 11, 10] # [1, 3, 5, 6, 9, 11, 13] def setUp(self): print('Tests (Edge-Pair Coverage) for "has_magic_trailing_comma" Method in Line Class: ', end=' ') # pass def tearDown(self): print('') # pass def test_has_magic_trailing_comma_case1(self) -> None: print("Case 1") ## Test Path: [1, 2] mode = Mode() line = Line(mode) leaf = Leaf(value = "str", type = token.STRING) r = line.has_magic_trailing_comma(leaf) self.assertFalse(r) print("Test Path: [1, 2] completed") def test_has_magic_trailing_comma_case2(self) -> None: print("Case 2") ## Test Path: [1, 3, 4] mode = Mode() line = Line(mode) leaf0 = Leaf(value = ",", type = token.COMMA) line.leaves.append(leaf0) leaf = Leaf(value = "]", type = token.RBRACE) r = line.has_magic_trailing_comma(leaf) self.assertTrue(r) print("Test Path: [1, 3, 4] completed") def test_has_magic_trailing_comma_case3(self) -> None: print("Case 3") ## Test Path: [1, 3, 5, 6, 8] mode = Mode(magic_trailing_comma=True, preview=True) line = Line(mode) leaf0 = Leaf(value = ",", type = token.COMMA) leaf0.bracket_depth = 1 leaf1 = Leaf(value = "{", type = token.LSQB) leaf1.bracket_depth = 1 leaf2 = Leaf(value = "}", type = token.RSQB) leaf2.bracket_depth = 1 line.leaves.append(leaf1) line.leaves.append(leaf0) leaf = Leaf(value = "}", type = token.RSQB) node = Node(type = syms.trailer, children=[leaf]) leaf.parent = node leaf.opening_bracket = leaf1 leaf.bracket_depth = 1 r = line.has_magic_trailing_comma(leaf) self.assertFalse(r) print("Test Path: [1, 3, 5, 6, 8] completed") def test_has_magic_trailing_comma_case4(self) -> None: print("Case 4") ## Test Path: [1, 3, 5, 6, 9, 10] mode = Mode() line = Line(mode) leaf0 = Leaf(value = ",", type = token.COMMA) line.leaves.append(leaf0) leaf = Leaf(value = "}", type = token.RSQB) node = Node(type = syms.trailer, children=[leaf]) leaf.parent = node r = line.has_magic_trailing_comma(leaf) self.assertTrue(r) print("Test Path: [1, 3, 5, 6, 9, 10] completed") def test_has_magic_trailing_comma_case5(self) -> None: print("Case 5") ## Test Path: [1, 3, 5, 7, 14] with mock.patch('black.lines.Line.is_import', new_callable=mock.PropertyMock) as mock_is_import: mock_is_import.return_value = True mode = Mode() line = Line(mode) leaf = Leaf(value = "import", type = token.NAME) node = Node(type = syms.import_name, children=[leaf]) leaf.parent = node line.leaves.append(leaf) leaf0 = Leaf(value = ",", type = token.COMMA) line.leaves.append(leaf0) leaf = Leaf(value = ")", type = token.RPAR) r = line.has_magic_trailing_comma(leaf) self.assertTrue(r) print("Test Path: [1, 3, 5, 7, 14] completed") def test_has_magic_trailing_comma_case6(self) -> None: print("Case 6") ## Test Path: [1, 3, 5, 7, 15, 17] mode = Mode() line = Line(mode) leaf0 = Leaf(value = ",", type = token.COMMA) line.leaves.append(leaf0) leaf = Leaf(value = ")", type = token.RPAR) r = line.has_magic_trailing_comma(leaf) self.assertFalse(r) print("Test Path: [1, 3, 5, 7, 15, 17] completed") def test_has_magic_trailing_comma_case7(self) -> None: print("Case 7") ## Test Path: [1, 3, 5, 7, 15, 16] mode = Mode() line = Line(mode) leaf0 = Leaf(value = ",", type = token.COMMA) line.leaves.append(leaf0) leaf1 = Leaf(value = "{", type = token.LSQB) leaf1.bracket_depth = 1 leaf = Leaf(value = ")", type = token.RPAR) leaf.opening_bracket = leaf1 leaf.bracket_depth = 1 r = line.has_magic_trailing_comma(leaf) self.assertTrue(r) print("Test Path: [1, 3, 5, 7, 15, 16] completed") def test_has_magic_trailing_comma_case8(self) -> None: print("Case 8") ## Test Path: [1, 3, 5, 6, 9, 11, 13] mode = Mode() line = Line(mode) leaf0 = Leaf(value = ",", type = token.COMMA) line.leaves.append(leaf0) leaf = Leaf(value = "}", type = token.RSQB) node = Node(type = syms.trailer, children=[leaf]) leaf.parent = node r = line.has_magic_trailing_comma(leaf, ensure_removable=True) self.assertFalse(r) print("Test Path: [1, 3, 5, 6, 9, 11, 13] completed") def test_has_magic_trailing_comma_case9(self) -> None: print("Case 9") ## Test Path: [1, 3, 5, 6, 9, 11, 10] mode = Mode() line = Line(mode) leaf0 = Leaf(value = ",", type = token.COMMA) node = Node(type = syms.listmaker, children=[leaf0]) leaf0.parent = node line.leaves.append(leaf0) leaf = Leaf(value = "}", type = token.RSQB) node = Node(type = syms.trailer, children=[leaf]) leaf.parent = node r = line.has_magic_trailing_comma(leaf, ensure_removable=True) self.assertTrue(r) print("Test Path: [1, 3, 5, 6, 9, 11, 10] completed") ``` --- * **Line Class: comments_after function** ([CFG](https://i.imgur.com/CvyMGrP.png)) ```python= class test_comments_after(unittest.TestCase): def setUp(self): print('Tests (Edge-Pair Coverage) for "comments_after" Function in Line Class: ', end=' ') def tearDown(self): print('') def test_comments_after_case1(self) -> None: print("Case 1") mode = Mode() line = Line(mode) leaf0 = Leaf(value = "hello", type = token.STRING) comment0 = Leaf(value = "# type: ignore", type = token.COMMENT) line.comments.setdefault(id(leaf0), []).append(comment0) line.leaves.append(leaf0) r = line.comments_after(leaf0) self.assertEqual([comment0], r) print("Test Path: [1] completed (not None)") def test_comments_after_case2(self) -> None: print("Case 2") mode = Mode() line = Line(mode) leaf0 = Leaf(value = "hello", type = token.STRING) line.leaves.append(leaf0) r = line.comments_after(leaf0) self.assertEqual([], r) print("Test Path: [1] completed (None)") ``` --- * **Line Class: append_comment** ([CFG](https://i.imgur.com/akHu30p.png)) ```python= class TestAppendComment(unittest.TestCase): # Case 1: [1,2,3] @mock.patch("black.brackets.BracketTracker.any_open_brackets") def test_append_comment_case1(self, mocked_tracker) -> None: print("Testing case1") mode = Mode() line = Line(mode) leaf1 = Leaf(value="# Comment", type=153) mocked_tracker.return_value = True # print(line.bracket_tracker.any_open_brackets()) # print(leaf1.type == STANDALONE_COMMENT) self.assertFalse(line.append_comment(leaf1)) # Case 2: [1,2,4,5] def test_append_comment_case2(self) -> None: print("Testing case2") mode = Mode() line = Line(mode) leaf1 = Leaf(value="# Comment", type=token.STRING) self.assertFalse(line.append_comment(leaf1)) # Case 3: [1,2,4,6,7] def test_append_comment_case3(self) -> None: print("Testing case3") mode = Mode() line = Line(mode) leaf1 = Leaf(value="# Comment", type=token.COMMENT) self.assertFalse(line.append_comment(leaf1)) # Case 4: [1,2,4,6,8,9,11] def test_append_comment_case4(self) -> None: print("Testing case4") mode = Mode() line = Line(mode) leaf1 = Leaf(value="string", type=token.STRING) leaf2 = Leaf(value="# Comment", type=token.COMMENT) line.append(leaf1) self.assertTrue(line.append_comment(leaf2)) # Case 5: [1,2,4,6,8,9,10,13,11] @mock.patch("blib2to3.pytree.Leaf") @mock.patch("black.nodes.is_type_comment") def test_append_comment_case5(self, mocked_is_type_comment, mocked_leaf) -> None: print("Testing case5") leaf1 = Leaf(value="(", type=token.LPAR) leaf2 = Leaf(value="# black", type=token.COMMENT) mocked_leaf.type = token.RPAR mocked_leaf.value = False mocked_leaf.parent.leaves.return_value = [None] * 2 mocked_is_type_comment.return_value = False mode = Mode() line = Line(mode) line.append(leaf1, preformatted=True) line.append(mocked_leaf, preformatted=True) last_leaf = line.leaves[-1] self.assertFalse(len(line.leaves) < 2) self.assertEqual(last_leaf.type, token.RPAR) self.assertFalse(last_leaf.value) self.assertTrue(last_leaf.parent) self.assertTrue(len(list(last_leaf.parent.leaves())) <= 3) self.assertTrue(line.append_comment(leaf2)) # Case 6: [1,2,4,6,8,9,10,12] @mock.patch("blib2to3.pytree.Leaf") @mock.patch("black.nodes.is_type_comment") def test_append_comment_case6(self, mocked_is_type_comment, mocked_leaf) -> None: print("Testing case6") leaf1 = Leaf(value="# black", type=token.COMMENT) mocked_leaf.type = token.RPAR mocked_leaf.value = False mocked_leaf.parent.leaves.return_value = [None] * 2 mocked_is_type_comment.return_value = False mode = Mode() line = Line(mode) line.append(mocked_leaf, preformatted=True) last_leaf = line.leaves[-1] self.assertTrue(len(line.leaves) < 2) self.assertEqual(last_leaf.type, token.RPAR) self.assertFalse(last_leaf.value) self.assertTrue(last_leaf.parent) self.assertTrue(len(list(last_leaf.parent.leaves())) <= 3) self.assertFalse(line.append_comment(leaf1)) ``` --- * **Line Class: remove_trailing_comma function** ([CFG](https://i.imgur.com/WuPUq2H.png)) ```python= class test_remove_trailing_comma(unittest.TestCase): def setUp(self): print('Tests (Edge-Pair Coverage) for "remove_trailing_comma" Function in Line Class: ', end=' ') def tearDown(self): print('') def test_remove_trailing_comma_case1(self) -> None: print("Case 1") mode = Mode(magic_trailing_comma = False) line = Line(mode) leaf0 = Leaf(value = "[", type = token.LBRACE) leaf1 = Leaf(value = ",", type = token.COMMA) line.leaves.append(leaf0) line.leaves.append(leaf1) line.remove_trailing_comma() self.assertEqual(line.leaves, [leaf0]) r = {id(leaf0): []} self.assertEqual(line.comments, r) print("Test Path: [1] completed") ``` --- * **Line Class: is_complex_subscript function** ([CFG](https://i.imgur.com/Ve0EeKs.png)) ```python= class test_is_complex_subscript(unittest.TestCase): def setUp(self): print('Tests (Edge-Pair Coverage) for "is_complex_subscript" Method in Line Class: ', end=' ') # pass def tearDown(self): print('') # pass def test_is_complex_subscript_case1(self) -> None: print("Case 1") ## Test Path: [1, 2, 4] mode = Mode() line = Line(mode) leaf = Leaf(value = "str", type = token.STRING) r = line.is_complex_subscript(leaf) self.assertFalse(r) print("Test Path: [1, 2, 4] completed") @mock.patch('black.brackets.BracketTracker.get_open_lsqb') def test_is_complex_subscript_case2(self, mock_get_open_lsqb) -> None: print("Case 2") ## Test Path: [1, 3, 5, 10, 4] leaf0 = Leaf(value = "[", type = token.LBRACE) mock_get_open_lsqb.return_value = leaf0 mode = Mode() line = Line(mode) leaf = Leaf(value = "]", type = token.RBRACE, prefix = None) r = line.is_complex_subscript(leaf) self.assertFalse(r) print("Test Path: [1, 3, 5, 10, 4] completed") @mock.patch('black.brackets.BracketTracker.get_open_lsqb') def test_is_complex_subscript_case3(self, mock_get_open_lsqb) -> None: print("Case 3") ## Test Path: [1, 3, 5, 6, 7, 4] leaf = Leaf(value = "[", type = token.LBRACE) leaf0 = Leaf(value = "str", type = token.STRING) node = Node(type = syms.listmaker, children=[leaf0]) mock_get_open_lsqb.return_value = leaf with mock.patch('blib2to3.pytree.Base.next_sibling', new_callable=mock.PropertyMock) as mock_next_sibling: mock_next_sibling.return_value = node mode = Mode() line = Line(mode) r = line.is_complex_subscript(leaf) self.assertFalse(r) print("Test Path: [1, 3, 5, 6, 7, 4] completed") @mock.patch('blib2to3.pytree.Leaf.pre_order') @mock.patch('black.brackets.BracketTracker.get_open_lsqb') def test_is_complex_subscript_case4(self, mock_get_open_lsqb, mock_pre_order) -> None: print("Case 4") ## Test Path: [1, 3, 5, 10, 11] leaf = Leaf(value = "[", type = token.LBRACE) leaf0 = Leaf(value = "str", type = token.STRING) node = Node(type = syms.test, children=[leaf0]) leaf0.parent = node mock_pre_order.return_value = [node] mock_get_open_lsqb.return_value = leaf with mock.patch('blib2to3.pytree.Base.next_sibling', new_callable=mock.PropertyMock) as mock_next_sibling: mock_next_sibling.return_value = leaf0 mode = Mode() line = Line(mode) r = line.is_complex_subscript(leaf) self.assertTrue(r) print("Test Path: [1, 3, 5, 10, 11] completed") @mock.patch('blib2to3.pytree.Node.pre_order') @mock.patch('black.brackets.BracketTracker.get_open_lsqb') def test_is_complex_subscript_case5(self, mock_get_open_lsqb, mock_pre_order) -> None: print("Case 5") ## Test Path: [1, 3, 5, 6, 8, 10, 11] leaf = Leaf(value = "[", type = token.LBRACE) leaf0 = Leaf(value = "str", type = token.STRING) node = Node(type = syms.test, children=[leaf0]) leaf0.parent = node mock_pre_order.return_value = [node] mock_get_open_lsqb.return_value = leaf with mock.patch('blib2to3.pytree.Base.next_sibling', new_callable=mock.PropertyMock) as mock_next_sibling: mock_next_sibling.return_value = node mode = Mode() line = Line(mode) r = line.is_complex_subscript(leaf) self.assertTrue(r) print("Test Path: [1, 3, 5, 6, 8, 10, 11] completed") @mock.patch('blib2to3.pytree.Node.pre_order') @mock.patch('black.brackets.BracketTracker.get_open_lsqb') def test_is_complex_subscript_case6(self, mock_get_open_lsqb, mock_pre_order) -> None: print("Case 6") ## Test Path: [1, 3, 5, 6, 8, 9, 10, 4] leaf = Leaf(value = "[", type = token.LBRACE) leaf0 = Leaf(value = "str", type = token.STRING) node = Node(type = syms.test, children=[leaf0]) node1 = Node(type = syms.subscriptlist, children=[leaf]) leaf.parent = node1 leaf0.parent = node mock_pre_order.return_value = [node] mock_get_open_lsqb.return_value = leaf with mock.patch('blib2to3.pytree.Base.next_sibling', new_callable=mock.PropertyMock) as mock_next_sibling: mock_next_sibling.return_value = node1 mode = Mode() line = Line(mode) r = line.is_complex_subscript(leaf) self.assertFalse(r) print("Test Path: [1, 3, 5, 6, 8, 9, 10, 4] completed") @mock.patch('black.brackets.BracketTracker.get_open_lsqb') def test_is_complex_subscript_case7(self, mock_get_open_lsqb) -> None: print("Case 7") ## Test Path: [1, 3, 5, 6, 8, 10, 4] leaf = Leaf(value = "[", type = token.LBRACE) leaf0 = Leaf(value = "str", type = token.STRING) node = Node(type = syms.tname, children=[leaf0]) leaf0.parent = node mock_get_open_lsqb.return_value = leaf with mock.patch('blib2to3.pytree.Base.next_sibling', new_callable=mock.PropertyMock) as mock_next_sibling: mock_next_sibling.return_value = node mode = Mode() line = Line(mode) r = line.is_complex_subscript(leaf) self.assertFalse(r) print("Test Path: [1, 3, 5, 6, 8, 10, 4] completed") ``` --- * **Line Class: enumerate_with_length function** ([CFG](https://i.imgur.com/9TO8fnd.png)) ```python= class Test_enumerate_with_length(unittest.TestCase): # [1,2,3,4,5] def test_anumerate_with_length_case1(self) -> None: mode = Mode() line = Line(mode) leaf0 = Leaf(value="Blackie \n", type=token.STRING) line.append(leaf0, preformatted=True) line.append(leaf0, preformatted=True) for index, leaf, leaf_length in line.enumerate_with_length(): self.assertIsNone(index) self.assertIsNone(leaf) self.assertIsNone(leaf_length) # [2,3,4,6,7] # @mock.patch("lines.Line") def test_anumerate_with_length_case2(self) -> None: mode = Mode() line = Line(mode) leaf0 = Leaf(value="Blackie", type=token.STRING) leaf1 = Leaf(value="# Comment", type=token.COMMENT) line.append(leaf0, preformatted=True) line.append(leaf0, preformatted=True) line.append(leaf1, preformatted=True) for index, leaf, leaf_length in line.enumerate_with_length(): # print(index, leaf, leaf_length) self.assertIsNotNone(index) self.assertIsNotNone(leaf) self.assertIsNotNone(leaf_length) self.assertEqual(leaf_length, len(leaf0.value) + len(leaf1.value)) ``` * **Line Class: colne function** ([CFG](https://i.imgur.com/Nfbt6U3.png)) ```python= class Test_clone(unittest.TestCase): def test_clone_case1(self) -> None: mode = Mode() line = Line(mode) line2 = line.clone() self.assertEqual(line, line2) ``` --- * **Line Class: __str__ function** ([CFG](https://i.imgur.com/xEIj1rN.png)) ```python= class test___str__(unittest.TestCase): def setUp(self): print('Tests (Edge-Pair Coverage) for "__str__" Function in Line Class: ', end=' ') def tearDown(self): print('') def test___str___case1(self) -> None: print("Case 1") # Test Path: [1, 2] mode = Mode() line = Line(mode) r = line.__str__() self.assertEqual("\n", r) print("Test Path: [1, 2] completed") def test___str___case2(self) -> None: print("Case 2") # Test Path: [1, 3, 4, 5, 4, 5, 4, 6, 8] mode = Mode() line = Line(mode) leaf0 = Leaf(value = "h", type = token.STRING) leaf1 = Leaf(value = "e", type = token.STRING) leaf2 = Leaf(value = "llo", type = token.STRING) line.leaves.append(leaf0) line.leaves.append(leaf1) line.leaves.append(leaf2) r = line.__str__() self.assertEqual("hello\n", r) print("Test Path: [1, 3, 4, 5, 4, 5, 4, 6, 8] completed") def test___str___case3(self) -> None: print("Case 3") # Test Path: [1, 3, 4, 6, 7, 6, 7, 6, 8] mode = Mode() line = Line(mode) leaf0 = Leaf(value = "hello", type = token.STRING) leaf1 = Leaf(value = "world", type = token.STRING) comment0 = Leaf(value = "# comment1", type = token.COMMENT) line.comments.setdefault(id(leaf0), []).append(comment0) line.leaves.append(leaf0) comment1 = Leaf(value = "# comment2", type = token.COMMENT) line.comments.setdefault(id(leaf1), []).append(comment1) r = line.__str__() self.assertEqual("hello# comment1# comment2\n", r) print("Test Path: [1, 3, 4, 6, 7, 6, 7, 6, 8] completed") ``` --- * **Line Class: __bool__ function** ([CFG](https://i.imgur.com/oCyNXZ7.png)) ```python= class test___bool__(unittest.TestCase): def setUp(self): print('Tests (Edge-Pair Coverage) for "__bool__" Function in Line Class: ', end=' ') def tearDown(self): print('') def test___bool___case1(self) -> None: print("Case 1") # Test Path: [1, 2] mode = Mode() line = Line(mode) leaf0 = Leaf(value = "h", type = token.STRING) line.leaves.append(leaf0) r = line.__bool__() self.assertTrue(r) print("Test Path: [1, 2] completed") def test___bool___case2(self) -> None: print("Case 2") # Test Path: [1, 3] mode = Mode() line = Line(mode) r = line.__bool__() self.assertFalse(r) print("Test Path: [1, 3] completed") ``` ---