Failed Conditions
Pull Request — master (#1135)
by Lasse
01:54
created

coalib.tests.results.LocalTestBear   A

Complexity

Total Complexity 1

Size/Duplication

Total Lines 6
Duplicated Lines 0 %
Metric Value
dl 0
loc 6
rs 10
wmc 1
1
import sys
2
import unittest
3
import json
4
5
sys.path.insert(0, ".")
6
from coalib.results.Diff import Diff, ConflictError, SourceRange
7
from coalib.bearlib.parsing.clang.cindex import Index, LibclangError
8
from coalib.output.JSONEncoder import JSONEncoder
9
10
11
class DiffTest(unittest.TestCase):
12
    def setUp(self):
13
        self.file = ["1", "2", "3", "4"]
14
        self.uut = Diff(self.file)
15
16
    def test_add_lines(self):
17
        self.uut.add_lines(0, [])
18
        self.uut.add_lines(0, ["t"])
19
        self.uut.add_lines(0, [])
20
21
        # No double addition allowed
22
        self.assertRaises(ConflictError, self.uut.add_lines, 0, ["t"])
23
        self.assertRaises(ValueError, self.uut.add_lines, -1, ["t"])
24
        self.assertRaises(TypeError, self.uut.add_lines, "str", ["t"])
25
26
    def test_delete_line(self):
27
        self.uut.delete_line(1)
28
        self.uut.delete_line(1)  # Double deletion possible without conflict
29
        self.assertRaises(ValueError, self.uut.delete_line, 0)
30
31
    def test_change_line(self):
32
        self.assertEqual(len(self.uut), 0)
33
        self.uut.change_line(2, "1", "2")
34
        self.assertEqual(len(self.uut), 1)
35
        self.assertRaises(ConflictError, self.uut.change_line, 2, "1", "3")
36
        self.assertRaises(ValueError, self.uut.change_line, 0, "1", "2")
37
38
        self.uut.delete_line(1)
39
        # Line was deleted, unchangeable
40
        self.assertRaises(AssertionError, self.uut.change_line, 1, "1", "2")
41
42
    def test_affected_code(self):
43
        self.assertEqual(self.uut.affected_code("file"), [])
44
45
        self.uut.add_lines(0, ["test"])
46
        affected_code = [
47
            SourceRange.from_values("file", start_line=1),]
48
        self.assertEqual(self.uut.affected_code("file"), affected_code)
49
50
        self.uut.delete_line(2)
51
        affected_code = [
52
            SourceRange.from_values("file", start_line=1),
53
            SourceRange.from_values("file", start_line=2)]
54
        self.assertEqual(self.uut.affected_code("file"), affected_code)
55
56
        self.uut.delete_line(3)
57
        affected_code = [
58
            SourceRange.from_values("file", start_line=1),
59
            SourceRange.from_values("file", start_line=2, end_line=3)]
60
        self.assertEqual(self.uut.affected_code("file"), affected_code)
61
62
        self.uut.delete_line(6)
63
        affected_code = [
64
            SourceRange.from_values("file", start_line=1),
65
            SourceRange.from_values("file", start_line=2, end_line=3),
66
            SourceRange.from_values('file', start_line=6)]
67
        self.assertEqual(self.uut.affected_code("file"), affected_code)
68
69
    def test_modified(self):
70
        result_file = ["0.1",
71
                       "0.2",
72
                       "1",
73
                       "1.1",
74
                       "3.changed",
75
                       "4"]
76
77
        self.uut.delete_line(2)
78
        self.uut.add_lines(0, ["0.1", "0.2"])
79
        self.uut.add_lines(1, ["1.1"])
80
        self.uut.change_line(3, "3", "3.changed")
81
        self.assertEqual(self.uut.modified, result_file)
82
        self.assertEqual(self.uut.original, self.file)
83
84
        self.uut.delete_line(len(self.file))
85
        del result_file[len(result_file) - 1]
86
        self.assertEqual(self.uut.modified, result_file)
87
88
        self.uut.delete_line(1)
89
        del result_file[2]
90
        self.assertEqual(self.uut.modified, result_file)
91
92
    def test_addition(self):
93
        self.assertRaises(TypeError, self.uut.__add__, 5)
94
95
        result_file = ["1",
96
                       "2",
97
                       "2"]
98
99
        other = Diff(self.file)
100
        other.delete_line(1)
101
        other.change_line(2, "1", "2")
102
        other.add_lines(0, ["1"])
103
104
        self.uut.delete_line(1)
105
        self.uut.delete_line(3)
106
        self.uut.change_line(4, "4", "2")
107
        result = self.uut + other
108
109
        self.assertEqual(result.modified, result_file)
110
        # Make sure it didn't happen in place!
111
        self.assertNotEqual(self.uut.modified, result_file)
112
113
    def test_from_string_arrays(self):
114
        a = ["q", "a", "b", "x", "c", "d"]
115
        b = ["a", "b", "y", "c", "d", "f"]
116
        self.uut = Diff.from_string_arrays(a, b)
117
        self.assertEqual(self.uut.modified, b)
118
119
        a = ["first", "fourth"]
120
        b = ["first", "second", "third", "fourth"]
121
        self.uut = Diff.from_string_arrays(a, b)
122
        self.assertEqual(self.uut.modified, b)
123
124
        a = ["first", "fourth"]
125
        b = ["first_changed", "second", "third", "fourth"]
126
        self.uut = Diff.from_string_arrays(a, b)
127
        self.assertEqual(self.uut.modified, b)
128
129
        a = ["first", "second", "third", "fourth"]
130
        b = ["first", "fourth"]
131
        self.uut = Diff.from_string_arrays(a, b)
132
        self.assertEqual(self.uut.modified, b)
133
134
        a = ["first", "second", "third", "fourth"]
135
        b = ["first_changed", "second_changed", "fourth"]
136
        self.uut = Diff.from_string_arrays(a, b)
137
        self.assertEqual(self.uut.modified, b)
138
139
    def test_from_clang_fixit(self):
140
        joined_file = 'struct { int f0; }\nx = { f0 :1 };\n'
141
        file = joined_file.splitlines(True)
142
        fixed_file = ['struct { int f0; }\n', 'x = { .f0 = 1 };\n']
143
144
        tu = Index.create().parse('t.c', unsaved_files=[
145
            ('t.c'.encode(), joined_file.encode())])
146
        fixit = tu.diagnostics[0].fixits[0]
147
148
        clang_fixed_file = Diff.from_clang_fixit(fixit, file).modified
149
        self.assertEqual(fixed_file, clang_fixed_file)
150
151
    def test_equality(self):
152
        a = ["first", "second", "third"]
153
        b = ["first", "third"]
154
        diff_1 = Diff.from_string_arrays(a, b)
155
156
        a[1] = "else"
157
        diff_2 = Diff.from_string_arrays(a, b)
158
        self.assertEqual(diff_1, diff_2)
159
160
        diff_1.add_lines(1, ["1"])
161
        self.assertNotEqual(diff_1, diff_2)
162
163
    def test_json_export(self):
164
        a = ["first\n", "second\n", "third\n"]
165
        b = ["first\n", "third\n"]
166
        diff = Diff.from_string_arrays(a, b)
167
        self.assertEqual(
168
            json.dumps(diff, cls=JSONEncoder, sort_keys=True),
169
            '"--- \\n'
170
            '+++ \\n'
171
            '@@ -1,3 +1,2 @@\\n'
172
            ' first\\n'
173
            '-second\\n'
174
            ' third\\n"')
175
176
177
def skip_test():
178
    try:
179
        Index.create()
180
        return False
181
    except LibclangError as error:
182
        return str(error)
183
184
185
if __name__ == '__main__':
186
    unittest.main(verbosity=2)
187