Completed
Pull Request — master (#2132)
by Udayan
01:48
created

SourceRangeTest.test_renamed_file()   A

Complexity

Conditions 1

Size

Total Lines 11

Duplication

Lines 0
Ratio 0 %

Importance

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