Completed
Pull Request — master (#1183)
by Lasse
02:01 queued 10s
created

coalib.tests.results.skip_test()   A

Complexity

Conditions 2

Size

Total Lines 6

Duplication

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