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

DiffTest.test_rename()   A

Complexity

Conditions 3

Size

Total Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 3
c 1
b 0
f 0
dl 0
loc 7
rs 9.4285
1
import json
2
import unittest
3
from unittest.case import SkipTest
4
5
from coalib.output.JSONEncoder import create_json_encoder
6
from coalib.results.Diff import ConflictError, Diff, SourceRange
7
8
9
class DiffTest(unittest.TestCase):
10
11
    def setUp(self):
12
        self.file = ["1", "2", "3", "4"]
13
        self.uut = Diff(self.file)
14
15
    def test_add_lines(self):
16
        self.uut.add_lines(0, [])
17
        self.uut.add_lines(0, ["t"])
18
        self.uut.add_lines(0, [])
19
20
        # No double addition allowed
21
        self.assertRaises(ConflictError, self.uut.add_lines, 0, ["t"])
22
        self.assertRaises(ValueError, self.uut.add_lines, -1, ["t"])
23
        self.assertRaises(TypeError, self.uut.add_lines, "str", ["t"])
24
25
    def test_delete_line(self):
26
        self.uut.delete_line(1)
27
        self.uut.delete_line(1)  # Double deletion possible without conflict
28
        self.assertRaises(ValueError, self.uut.delete_line, 0)
29
30
    def test_change_line(self):
31
        self.assertEqual(len(self.uut), 0)
32
        self.uut.change_line(2, "1", "2")
33
        self.assertEqual(len(self.uut), 2)
34
        self.assertRaises(ConflictError, self.uut.change_line, 2, "1", "3")
35
        self.assertRaises(ValueError, self.uut.change_line, 0, "1", "2")
36
37
        self.uut.delete_line(1)
38
        # Line was deleted, unchangeable
39
        self.assertRaises(ConflictError, self.uut.change_line, 1, "1", "2")
40
41
    def test_affected_code(self):
42
        self.assertEqual(self.uut.affected_code("file"), [])
43
44
        self.uut.add_lines(0, ["test"])
45
        affected_code = [
46
            SourceRange.from_values("file", start_line=1)]
47
        self.assertEqual(self.uut.affected_code("file"), affected_code)
48
49
        self.uut.delete_line(2)
50
        affected_code = [
51
            SourceRange.from_values("file", start_line=1),
52
            SourceRange.from_values("file", start_line=2)]
53
        self.assertEqual(self.uut.affected_code("file"), affected_code)
54
55
        self.uut.delete_line(3)
56
        affected_code = [
57
            SourceRange.from_values("file", start_line=1),
58
            SourceRange.from_values("file", start_line=2, end_line=3)]
59
        self.assertEqual(self.uut.affected_code("file"), affected_code)
60
61
        self.uut.delete_line(6)
62
        affected_code = [
63
            SourceRange.from_values("file", start_line=1),
64
            SourceRange.from_values("file", start_line=2, end_line=3),
65
            SourceRange.from_values('file', start_line=6)]
66
        self.assertEqual(self.uut.affected_code("file"), affected_code)
67
68
    def test_len(self):
69
        self.uut.delete_line(2)
70
        self.assertEqual(len(self.uut), 1)
71
        self.uut.add_lines(2, ["2.3", "2.5", "2.6"])
72
        self.assertEqual(len(self.uut), 4)
73
        self.uut.change_line(1, "1", "1.1")
74
        self.assertEqual(len(self.uut), 6)
75
76
    def test_stats(self):
77
        self.uut.delete_line(2)
78
        self.assertEqual(self.uut.stats(), (0, 1))
79
        self.uut.add_lines(2, ["2.3", "2.5", "2.6"])
80
        self.assertEqual(self.uut.stats(), (3, 1))
81
        self.uut.change_line(1, "1", "1.1")
82
        self.assertEqual(self.uut.stats(), (4, 2))
83
84
    def test_modified(self):
85
        result_file = ["0.1",
86
                       "0.2",
87
                       "1",
88
                       "1.1",
89
                       "3.changed",
90
                       "4"]
91
92
        self.uut.delete_line(2)
93
        self.uut.add_lines(0, ["0.1", "0.2"])
94
        self.uut.add_lines(1, ["1.1"])
95
        self.uut.change_line(3, "3", "3.changed")
96
97
        self.assertEqual(self.uut.modified, result_file)
98
        self.assertEqual(self.uut.original, self.file)
99
100
        self.uut.delete_line(len(self.file))
101
        del result_file[len(result_file) - 1]
102
        self.assertEqual(self.uut.modified, result_file)
103
104
        self.uut.delete_line(1)
105
        del result_file[2]
106
        self.assertEqual(self.uut.modified, result_file)
107
108
    def test_addition(self):
109
        self.assertRaises(TypeError, self.uut.__add__, 5)
110
111
        result_file = ["1",
112
                       "2",
113
                       "2"]
114
115
        other = Diff(self.file)
116
        other.delete_line(1)
117
        other.change_line(2, "1", "2")
118
        other.add_lines(0, ["1"])
119
120
        self.uut.delete_line(1)
121
        self.uut.delete_line(3)
122
        self.uut.change_line(4, "4", "2")
123
        result = self.uut + other
124
125
        self.assertEqual(result.modified, result_file)
126
        # Make sure it didn't happen in place!
127
        self.assertNotEqual(self.uut.modified, result_file)
128
129
    def test_addition_rename(self):
130
        uut = Diff(self.file, rename=False)
131
        other = Diff(self.file, rename=False)
132
        self.assertEqual((other + uut).rename, False)
133
134
        other.rename = "some.py"
135
        self.assertEqual((other + uut).rename, "some.py")
136
137
        uut.rename = "some.py"
138
        self.assertEqual((other + uut).rename, "some.py")
139
140
        uut.rename = "other.py"
141
        self.assertRaises(ConflictError, other.__add__, uut)
142
143
    def test_from_string_arrays(self):
144
        a = ["q", "a", "b", "x", "c", "d"]
145
        b = ["a", "b", "y", "c", "d", "f"]
146
        self.uut = Diff.from_string_arrays(a, b)
147
        self.assertEqual(self.uut.modified, b)
148
149
        a = ["first", "fourth"]
150
        b = ["first", "second", "third", "fourth"]
151
        self.uut = Diff.from_string_arrays(a, b)
152
        self.assertEqual(self.uut.modified, b)
153
154
        a = ["first", "fourth"]
155
        b = ["first_changed", "second", "third", "fourth"]
156
        self.uut = Diff.from_string_arrays(a, b)
157
        self.assertEqual(self.uut.modified, b)
158
159
        a = ["first", "second", "third", "fourth"]
160
        b = ["first", "fourth"]
161
        self.uut = Diff.from_string_arrays(a, b)
162
        self.assertEqual(self.uut.modified, b)
163
164
        a = ["first", "second", "third", "fourth"]
165
        b = ["first_changed", "second_changed", "fourth"]
166
        self.uut = Diff.from_string_arrays(a, b)
167
        self.assertEqual(self.uut.modified, b)
168
169
    def test_from_clang_fixit(self):
170
        try:
171
            from clang.cindex import Index, LibclangError
172
        except ImportError as err:
173
            raise SkipTest(str(err))
174
175
        joined_file = 'struct { int f0; }\nx = { f0 :1 };\n'
176
        file = joined_file.splitlines(True)
177
        fixed_file = ['struct { int f0; }\n', 'x = { .f0 = 1 };\n']
178
        try:
179
            tu = Index.create().parse('t.c', unsaved_files=[
180
                ('t.c', joined_file)])
181
        except LibclangError as err:
182
            raise SkipTest(str(err))
183
184
        fixit = tu.diagnostics[0].fixits[0]
185
        clang_fixed_file = Diff.from_clang_fixit(fixit, file).modified
186
        self.assertEqual(fixed_file, clang_fixed_file)
187
188
    def test_equality(self):
189
        a = ["first", "second", "third"]
190
        b = ["first", "third"]
191
        diff_1 = Diff.from_string_arrays(a, b)
192
193
        a[1] = "else"
194
        diff_2 = Diff.from_string_arrays(a, b)
195
        self.assertEqual(diff_1, diff_2)
196
197
        diff_1.rename = "abcd"
198
        self.assertNotEqual(diff_1, diff_2)
199
        diff_1.rename = False
200
201
        diff_1.delete = True
202
        self.assertNotEqual(diff_1, diff_2)
203
        diff_1.delete = False
204
205
        diff_1.add_lines(1, ["1"])
206
        self.assertNotEqual(diff_1, diff_2)
207
208
    def test_json_export(self):
209
        JSONEncoder = create_json_encoder()
210
        a = ["first\n", "second\n", "third\n"]
211
        b = ["first\n", "third\n"]
212
        diff = Diff.from_string_arrays(a, b)
213
        self.assertEqual(
214
            json.dumps(diff, cls=JSONEncoder, sort_keys=True),
215
            '"--- \\n'
216
            '+++ \\n'
217
            '@@ -1,3 +1,2 @@\\n'
218
            ' first\\n'
219
            '-second\\n'
220
            ' third\\n"')
221
222
    def test_rename(self):
223
        self.uut.rename = False
224
        self.uut.rename = "1234"
225
        with self.assertRaises(TypeError):
226
            self.uut.rename = True
227
        with self.assertRaises(TypeError):
228
            self.uut.rename = 1234
229
230
    def test_delete(self):
231
        self.uut.delete = True
232
        self.uut.delete = False
233
        # Double deletion is allowed
234
        self.uut.delete = False
235
        with self.assertRaises(TypeError):
236
            self.uut.delete = "abcd"
237
238
        # If delete is True then modified returns an empty list
239
        self.uut.delete = True
240
        self.assertEqual(self.uut.modified, [])
241
        self.uut.delete = False
242