| 1 |  |  | import unittest | 
            
                                                                                                            
                            
            
                                    
            
            
                | 2 |  |  | from collections import namedtuple | 
            
                                                                                                            
                            
            
                                    
            
            
                | 3 |  |  | from os.path import abspath | 
            
                                                                                                            
                            
            
                                    
            
            
                | 4 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 5 |  |  | from coalib.results.SourcePosition import SourcePosition | 
            
                                                                                                            
                            
            
                                    
            
            
                | 6 |  |  | from coalib.results.SourceRange import SourceRange | 
            
                                                                                                            
                            
            
                                    
            
            
                | 7 |  |  | from coalib.results.AbsolutePosition import AbsolutePosition | 
            
                                                                                                            
                            
            
                                    
            
            
                | 8 |  |  | from coalib.results.Diff import Diff | 
            
                                                                                                            
                            
            
                                    
            
            
                | 9 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 10 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 11 |  |  | class SourceRangeTest(unittest.TestCase): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 12 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 13 |  |  |     def setUp(self): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 14 |  |  |         self.result_fileA_noline = SourcePosition("A") | 
            
                                                                                                            
                            
            
                                    
            
            
                | 15 |  |  |         self.result_fileA_line2 = SourcePosition("A", 2) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 16 |  |  |         self.result_fileB_noline = SourcePosition("B") | 
            
                                                                                                            
                            
            
                                    
            
            
                | 17 |  |  |         self.result_fileB_line2 = SourcePosition("B", 2) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 18 |  |  |         self.result_fileB_line4 = SourcePosition("B", 4) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 19 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 20 |  |  |     def test_construction(self): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 21 |  |  |         uut1 = SourceRange(self.result_fileA_noline) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 22 |  |  |         self.assertEqual(uut1.end, self.result_fileA_noline) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 23 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 24 |  |  |         uut2 = SourceRange.from_values("A") | 
            
                                                                                                            
                            
            
                                    
            
            
                | 25 |  |  |         self.assertEqual(uut1, uut2) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 26 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 27 |  |  |         uut = SourceRange.from_values("B", start_line=2, end_line=4) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 28 |  |  |         self.assertEqual(uut.start, self.result_fileB_line2) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 29 |  |  |         self.assertEqual(uut.end, self.result_fileB_line4) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 30 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 31 |  |  |     def test_from_clang_range(self): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 32 |  |  |         # Simulating a clang SourceRange is easier than setting one up without | 
            
                                                                                                            
                            
            
                                    
            
            
                | 33 |  |  |         # actually parsing a complete C file. | 
            
                                                                                                            
                            
            
                                    
            
            
                | 34 |  |  |         ClangRange = namedtuple("ClangRange", "start end") | 
            
                                                                                                            
                            
            
                                    
            
            
                | 35 |  |  |         ClangPosition = namedtuple("ClangPosition", "file line column") | 
            
                                                                                                            
                            
            
                                    
            
            
                | 36 |  |  |         ClangFile = namedtuple("ClangFile", "name") | 
            
                                                                                                            
                            
            
                                    
            
            
                | 37 |  |  |         file = ClangFile("t.c") | 
            
                                                                                                            
                            
            
                                    
            
            
                | 38 |  |  |         start = ClangPosition(file, 1, 2) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 39 |  |  |         end = ClangPosition(file, 3, 4) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 40 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 41 |  |  |         uut = SourceRange.from_clang_range(ClangRange(start, end)) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 42 |  |  |         compare = SourceRange.from_values("t.c", 1, 2, 3, 4) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 43 |  |  |         self.assertEqual(uut, compare) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 44 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 45 |  |  |     def test_from_absolute_position(self): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 46 |  |  |         text = ("a\n", "b\n") | 
            
                                                                                                            
                            
            
                                    
            
            
                | 47 |  |  |         start = AbsolutePosition(text, 0) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 48 |  |  |         end = AbsolutePosition(text, 2) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 49 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 50 |  |  |         uut = SourceRange.from_absolute_position("F", start, end) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 51 |  |  |         compare = SourceRange.from_values("F", 1, 1, 2, 1) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 52 |  |  |         self.assertEqual(uut, compare) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 53 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 54 |  |  |         uut = SourceRange.from_absolute_position("F", start, None) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 55 |  |  |         compare = SourceRange(SourcePosition("F", 1, 1), None) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 56 |  |  |         self.assertEqual(uut, compare) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 57 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 58 |  |  |     def test_file_property(self): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 59 |  |  |         uut = SourceRange(self.result_fileA_line2) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 60 |  |  |         self.assertRegex(uut.file, ".*A") | 
            
                                                                                                            
                            
            
                                    
            
            
                | 61 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 62 |  |  |     def test_invalid_arguments(self): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 63 |  |  |         # arguments must be SourceRanges | 
            
                                                                                                            
                            
            
                                    
            
            
                | 64 |  |  |         with self.assertRaises(TypeError): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 65 |  |  |             SourceRange(1, self.result_fileA_noline) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 66 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 67 |  |  |         with self.assertRaises(TypeError): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 68 |  |  |             SourceRange(self.result_fileA_line2, 1) | 
            
                                                                                                            
                                                                
            
                                    
            
            
                | 69 |  |  |  | 
            
                                                                        
                            
            
                                    
            
            
                | 70 |  |  |     def test_argument_file(self): | 
            
                                                                        
                            
            
                                    
            
            
                | 71 |  |  |         # both Source_Positions should describe the same file | 
            
                                                                        
                            
            
                                    
            
            
                | 72 |  |  |         with self.assertRaises(ValueError): | 
            
                                                                        
                            
            
                                    
            
            
                | 73 |  |  |             SourceRange(self.result_fileA_noline, self.result_fileB_noline) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 74 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 75 |  |  |     def test_argument_order(self): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 76 |  |  |         # end should come after the start | 
            
                                                                                                            
                            
            
                                    
            
            
                | 77 |  |  |         with self.assertRaises(ValueError): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 78 |  |  |             SourceRange(self.result_fileA_line2, self.result_fileA_noline) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 79 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 80 |  |  |     def test_invalid_comparison(self): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 81 |  |  |         with self.assertRaises(TypeError): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 82 |  |  |             SourceRange(self.result_fileB_noline, self.result_fileB_line2) < 1 | 
            
                                                                                                            
                            
            
                                    
            
            
                | 83 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 84 |  |  |     def test_json(self): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 85 |  |  |         uut = SourceRange.from_values("B", start_line=2, | 
            
                                                                                                            
                            
            
                                    
            
            
                | 86 |  |  |                                       end_line=4).__json__(use_relpath=True) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 87 |  |  |         self.assertEqual(uut['start'], self.result_fileB_line2) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 88 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 89 |  |  |     def test_renamed_file(self): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 90 |  |  |         src_range = SourceRange(SourcePosition("test_file")) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 91 |  |  |         self.assertEqual(src_range.renamed_file({}), abspath('test_file')) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 92 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 93 |  |  |         self.assertEqual( | 
            
                                                                                                            
                            
            
                                    
            
            
                | 94 |  |  |             src_range.renamed_file({abspath('test_file'): Diff([])}), | 
            
                                                                                                            
                            
            
                                    
            
            
                | 95 |  |  |             abspath('test_file')) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 96 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 97 |  |  |         self.assertEqual( | 
            
                                                                                                            
                            
            
                                    
            
            
                | 98 |  |  |             src_range.renamed_file( | 
            
                                                                                                            
                            
            
                                    
            
            
                | 99 |  |  |                 {abspath('test_file'): Diff([], rename='another_file')}), | 
            
                                                                                                            
                            
            
                                    
            
            
                | 100 |  |  |             'another_file') | 
            
                                                                                                            
                            
            
                                    
            
            
                | 101 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 102 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 103 |  |  | class SourceRangeExpandTest(unittest.TestCase): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 104 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 105 |  |  |     def test_expand(self): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 106 |  |  |         empty_position = SourcePosition("filename") | 
            
                                                                                                            
                            
            
                                    
            
            
                | 107 |  |  |         file = ["abc\n", "def\n", "ghi\n"] | 
            
                                                                                                            
                            
            
                                    
            
            
                | 108 |  |  |         empty_range = SourceRange(empty_position, empty_position) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 109 |  |  |         full_range = SourceRange.from_values("filename", 1, 1, 3, 4) | 
            
                                                                                                            
                                                                
            
                                    
            
            
                | 110 |  |  |         self.assertEqual(empty_range.expand(file), full_range) | 
            
                                                        
            
                                    
            
            
                | 111 |  |  |  |