~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/plugins/changelog_merge/tests/test_changelog_merge.py

(spiv) Fix ValueError in changelog_merge plugin. (Andrew Bennetts)

Show diffs side-by-side

added added

removed removed

Lines of Context:
15
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
16
 
17
17
from bzrlib import (
 
18
    merge,
18
19
    tests,
19
20
    )
 
21
from bzrlib.tests import test_merge_core
20
22
from bzrlib.plugins.changelog_merge import changelog_merge
21
23
 
22
24
 
138
140
            ],
139
141
            list(result_entries))
140
142
 
 
143
    def test_too_hard(self):
 
144
        """A conflict this plugin cannot resolve raises EntryConflict.
 
145
        """
 
146
        # An entry edited in other but deleted in this is a conflict we can't
 
147
        # resolve.  (Ideally perhaps we'd generate a nice conflict file, but
 
148
        # for now we just give up.)
 
149
        self.assertRaises(changelog_merge.EntryConflict,
 
150
            changelog_merge.merge_entries,
 
151
            sample2_base_entries, [], sample2_other_entries)
 
152
 
 
153
    def test_default_guess_edits(self):
 
154
        """default_guess_edits matches a new entry only once.
 
155
        
 
156
        (Even when that entry is the best match for multiple old entries.)
 
157
        """
 
158
        new_in_other = [('AAAAA',), ('BBBBB',)]
 
159
        deleted_in_other = [('DDDDD',), ('BBBBBx',), ('BBBBBxx',)]
 
160
        # BBBBB is the best match for both BBBBBx and BBBBBxx
 
161
        result = changelog_merge.default_guess_edits(
 
162
            new_in_other, deleted_in_other)
 
163
        self.assertEqual(
 
164
            ([('AAAAA',)], # new
 
165
             [('DDDDD',), ('BBBBBxx',)], # deleted
 
166
             [(('BBBBBx',), ('BBBBB',))]), # edits
 
167
            result)
 
168
 
 
169
 
 
170
class TestChangeLogMerger(tests.TestCaseWithTransport):
 
171
    """Tests for ChangeLogMerger class.
 
172
    
 
173
    Most tests should be unit tests for merge_entries (and its helpers).
 
174
    This class is just to cover the handful of lines of code in ChangeLogMerger
 
175
    itself.
 
176
    """
 
177
 
 
178
    def make_builder(self):
 
179
        builder = test_merge_core.MergeBuilder(self.test_base_dir)
 
180
        self.addCleanup(builder.cleanup)
 
181
        return builder
 
182
 
 
183
    def make_changelog_merger(self, base_text, this_text, other_text):
 
184
        builder = self.make_builder()
 
185
        builder.add_file('clog-id', builder.tree_root, 'ChangeLog',
 
186
            base_text, True)
 
187
        builder.change_contents('clog-id', other=other_text, this=this_text)
 
188
        merger = builder.make_merger(merge.Merge3Merger, ['clog-id'])
 
189
        merger.this_branch.get_config().set_user_option(
 
190
            'changelog_merge_files', 'ChangeLog')
 
191
        merge_hook_params = merge.MergeHookParams(merger, 'clog-id', None,
 
192
            'file', 'file', 'conflict')
 
193
        changelog_merger = changelog_merge.ChangeLogMerger(merger)
 
194
        return changelog_merger, merge_hook_params
 
195
 
 
196
    def test_merge_text_returns_not_applicable(self):
 
197
        """A conflict this plugin cannot resolve returns (not_applicable, None).
 
198
        """
 
199
        # Build same example as TestMergeCoreLogic.test_too_hard: edit an entry
 
200
        # in other but delete it in this.
 
201
        def entries_as_str(entries):
 
202
            return ''.join(entry + '\n' for entry in entries)
 
203
        changelog_merger, merge_hook_params = self.make_changelog_merger(
 
204
            entries_as_str(sample2_base_entries),
 
205
            '',
 
206
            entries_as_str(sample2_other_entries))
 
207
        self.assertEqual(
 
208
            ('not_applicable', None),
 
209
            changelog_merger.merge_contents(merge_hook_params))
 
210
 
 
211
    def test_merge_text_returns_success(self):
 
212
        """A successful merge returns ('success', lines)."""
 
213
        changelog_merger, merge_hook_params = self.make_changelog_merger(
 
214
            '', 'this text\n', 'other text\n')
 
215
        status, lines = changelog_merger.merge_contents(merge_hook_params)
 
216
        self.assertEqual(
 
217
            ('success', ['other text\n', 'this text\n']),
 
218
            (status, list(lines)))
 
219