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

ApplyPatchActionTest.test_apply_rename()   B

Complexity

Conditions 2

Size

Total Lines 28

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 2
c 1
b 0
f 0
dl 0
loc 28
rs 8.8571
1
import unittest
2
import os
3
from os.path import isfile
4
5
from coalib.misc.ContextManagers import make_temp
6
from coalib.results.Diff import Diff
7
from coalib.results.Result import Result
8
from coalib.results.result_actions.ApplyPatchAction import ApplyPatchAction
9
from coalib.settings.Section import Section
10
11
12
class ApplyPatchActionTest(unittest.TestCase):
13
14
    def test_apply(self):
15
        uut = ApplyPatchAction()
16
        with make_temp() as f_a, make_temp() as f_b, make_temp() as f_c:
17
18
            file_dict = {
19
                f_a: ["1\n", "2\n", "3\n"],
20
                f_b: ["1\n", "2\n", "3\n"],
21
                f_c: ["1\n", "2\n", "3\n"]
22
            }
23
            expected_file_dict = {
24
                f_a: ["1\n", "3_changed\n"],
25
                f_b: ["1\n", "2\n", "3_changed\n"],
26
                f_c: ["1\n", "2\n", "3\n"]
27
            }
28
29
            file_diff_dict = {}
30
31
            diff = Diff(file_dict[f_a])
32
            diff.delete_line(2)
33
            uut.apply_from_section(Result("origin", "msg", diffs={f_a: diff}),
34
                                   file_dict,
35
                                   file_diff_dict,
36
                                   Section("t"))
37
38
            diff = Diff(file_dict[f_a])
39
            diff.change_line(3, "3\n", "3_changed\n")
40
            uut.apply_from_section(Result("origin", "msg", diffs={f_a: diff}),
41
                                   file_dict,
42
                                   file_diff_dict,
43
                                   Section("t"))
44
45
            diff = Diff(file_dict[f_b])
46
            diff.change_line(3, "3\n", "3_changed\n")
47
            uut.apply(Result("origin", "msg", diffs={f_b: diff}),
48
                      file_dict,
49
                      file_diff_dict)
50
51
            for filename in file_diff_dict:
52
                file_dict[filename] = file_diff_dict[filename].modified
53
54
            self.assertEqual(file_dict, expected_file_dict)
55
            with open(f_a) as fa:
56
                self.assertEqual(file_dict[f_a], fa.readlines())
57
            with open(f_b) as fb:
58
                self.assertEqual(file_dict[f_b], fb.readlines())
59
            with open(f_c) as fc:
60
                # File c is unchanged and should be untouched
61
                self.assertEqual([], fc.readlines())
62
63
    def test_apply_orig_option(self):
64
        uut = ApplyPatchAction()
65
        with make_temp() as f_a, make_temp() as f_b:
66
            file_dict = {
67
                f_a: ["1\n", "2\n", "3\n"],
68
                f_b: ["1\n", "2\n", "3\n"]
69
                }
70
            expected_file_dict = {
71
                f_a: ["1\n", "2\n", "3_changed\n"],
72
                f_b: ["1\n", "2\n", "3_changed\n"]
73
                }
74
            file_diff_dict = {}
75
            diff = Diff(file_dict[f_a])
76
            diff.change_line(3, "3\n", "3_changed\n")
77
            uut.apply(Result("origin", "msg", diffs={f_a: diff}),
78
                      file_dict,
79
                      file_diff_dict,
80
                      no_orig=True)
81
            diff = Diff(file_dict[f_b])
82
            diff.change_line(3, "3\n", "3_changed\n")
83
            uut.apply(Result("origin", "msg", diffs={f_b: diff}),
84
                      file_dict,
85
                      file_diff_dict,
86
                      no_orig=False)
87
            self.assertFalse(isfile(f_a+".orig"))
88
            self.assertTrue(isfile(f_b+".orig"))
89
90
            for filename in file_diff_dict:
91
                file_dict[filename] = file_diff_dict[filename].modified
92
93
            self.assertEqual(file_dict, expected_file_dict)
94
95
    def test_apply_rename(self):
96
        uut = ApplyPatchAction()
97
        with make_temp() as f_a:
98
            file_dict = {f_a: ["1\n", "2\n", "3\n"]}
99
            expected_file_dict = {f_a+".renamed":
100
                                      ["1\n", "2_changed\n", "3_changed\n"]}
101
            file_diff_dict = {}
102
            diff = Diff(file_dict[f_a], rename=f_a+".renamed")
103
            diff.change_line(3, "3\n", "3_changed\n")
104
            uut.apply(Result("origin", "msg", diffs={f_a: diff}),
105
                      file_dict,
106
                      file_diff_dict)
107
            self.assertTrue(isfile(f_a+".orig"))
108
            self.assertTrue(isfile(f_a+".renamed"))
109
            self.assertFalse(isfile(f_a))
110
111
            diff = Diff(file_dict[f_a])
112
            diff.change_line(2, "2\n", "2_changed\n")
113
            uut.apply(Result("origin", "msg", diffs={f_a: diff}),
114
                      file_dict,
115
                      file_diff_dict)
116
            self.assertTrue(isfile(f_a+".renamed.orig"))
117
118
            file_dict = {f_a+".renamed": open(f_a+".renamed").readlines()}
119
120
            self.assertEqual(file_dict, expected_file_dict)
121
            # Recreate file so that context manager make_temp() can delete it
122
            open(f_a, 'w').close()
123
124
    def test_apply_delete(self):
125
        uut = ApplyPatchAction()
126
        with make_temp() as f_a:
127
            file_dict = {f_a: ["1\n", "2\n", "3\n"]}
128
            file_diff_dict = {}
129
            diff = Diff(file_dict[f_a], delete=True)
130
            uut.apply(Result("origin", "msg", diffs={f_a: diff}),
131
                      file_dict,
132
                      file_diff_dict)
133
            self.assertFalse(isfile(f_a))
134
            self.assertTrue(isfile(f_a+".orig"))
135
            os.remove(f_a+".orig")
136
137
            diff = Diff(file_dict[f_a])
138
            diff.change_line(3, "3\n", "3_changed\n")
139
            uut.apply(Result("origin", "msg", diffs={f_a: diff}),
140
                      file_dict,
141
                      file_diff_dict)
142
            self.assertFalse(isfile(f_a+".orig"))
143
            # Recreate file so that context manager make_temp() can delete it
144
            open(f_a, 'w').close()
145
146
    def test_is_applicable(self):
147
        diff = Diff(["1\n", "2\n", "3\n"])
148
        diff.delete_line(2)
149
        patch_result = Result("", "", diffs={'f': diff})
150
        self.assertTrue(
151
            ApplyPatchAction.is_applicable(patch_result, {}, {}))
152
153
    def test_is_applicable_conflict(self):
154
        diff = Diff(["1\n", "2\n", "3\n"])
155
        diff.add_lines(2, ['a line'])
156
157
        conflict_result = Result("", "", diffs={'f': diff})
158
        # Applying the same diff twice will result in a conflict
159
        self.assertFalse(
160
            ApplyPatchAction.is_applicable(conflict_result, {}, {'f': diff}))
161
162
    def test_is_applicable_empty_patch(self):
163
        empty_patch_result = Result("", "", diffs={})
164
        self.assertFalse(
165
            ApplyPatchAction.is_applicable(empty_patch_result, {}, {}))
166
167
    def test_is_applicable_without_patch(self):
168
        result = Result("", "")
169
        self.assertFalse(ApplyPatchAction.is_applicable(result, {}, {}))
170