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
|
|
|
|