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