##// END OF EJS Templates
tests: port test-simplemerge.py to Python 3...
Augie Fackler -
r37909:c1bc196e default
parent child Browse files
Show More
@@ -1,465 +1,466
1 1 test-abort-checkin.t
2 2 test-add.t
3 3 test-addremove-similar.t
4 4 test-addremove.t
5 5 test-amend-subrepo.t
6 6 test-amend.t
7 7 test-ancestor.py
8 8 test-annotate.py
9 9 test-annotate.t
10 10 test-archive-symlinks.t
11 11 test-atomictempfile.py
12 12 test-audit-path.t
13 13 test-audit-subrepo.t
14 14 test-automv.t
15 15 test-backout.t
16 16 test-backwards-remove.t
17 17 test-basic.t
18 18 test-bheads.t
19 19 test-bisect.t
20 20 test-bisect2.t
21 21 test-bisect3.t
22 22 test-blackbox.t
23 23 test-bookmarks-current.t
24 24 test-bookmarks-merge.t
25 25 test-bookmarks-rebase.t
26 26 test-bookmarks-strip.t
27 27 test-bookmarks.t
28 28 test-branch-change.t
29 29 test-branch-option.t
30 30 test-branch-tag-confict.t
31 31 test-branches.t
32 32 test-bundle-phases.t
33 33 test-bundle-type.t
34 34 test-bundle-vs-outgoing.t
35 35 test-bundle2-multiple-changegroups.t
36 36 test-cappedreader.py
37 37 test-casecollision.t
38 38 test-cat.t
39 39 test-censor.t
40 40 test-changelog-exec.t
41 41 test-check-commit.t
42 42 test-check-execute.t
43 43 test-check-interfaces.py
44 44 test-check-module-imports.t
45 45 test-check-pyflakes.t
46 46 test-check-pylint.t
47 47 test-check-shbang.t
48 48 test-children.t
49 49 test-clone-cgi.t
50 50 test-clone-pull-corruption.t
51 51 test-clone-r.t
52 52 test-clone-update-order.t
53 53 test-command-template.t
54 54 test-commit-amend.t
55 55 test-commit-interactive.t
56 56 test-commit-multiple.t
57 57 test-commit-unresolved.t
58 58 test-commit.t
59 59 test-committer.t
60 60 test-completion.t
61 61 test-config-env.py
62 62 test-config.t
63 63 test-conflict.t
64 64 test-confused-revert.t
65 65 test-contrib-check-code.t
66 66 test-contrib-check-commit.t
67 67 test-convert-authormap.t
68 68 test-convert-clonebranches.t
69 69 test-convert-datesort.t
70 70 test-convert-filemap.t
71 71 test-convert-hg-sink.t
72 72 test-convert-hg-source.t
73 73 test-convert-hg-startrev.t
74 74 test-convert-splicemap.t
75 75 test-convert-tagsbranch-topology.t
76 76 test-copy-move-merge.t
77 77 test-copy.t
78 78 test-copytrace-heuristics.t
79 79 test-debugbuilddag.t
80 80 test-debugbundle.t
81 81 test-debugextensions.t
82 82 test-debugindexdot.t
83 83 test-debugrename.t
84 84 test-default-push.t
85 85 test-diff-binary-file.t
86 86 test-diff-change.t
87 87 test-diff-copy-depth.t
88 88 test-diff-hashes.t
89 89 test-diff-ignore-whitespace.t
90 90 test-diff-indent-heuristic.t
91 91 test-diff-issue2761.t
92 92 test-diff-newlines.t
93 93 test-diff-reverse.t
94 94 test-diff-subdir.t
95 95 test-diff-unified.t
96 96 test-diff-upgrade.t
97 97 test-diffdir.t
98 98 test-diffstat.t
99 99 test-directaccess.t
100 100 test-dirstate-backup.t
101 101 test-dirstate-nonnormalset.t
102 102 test-dirstate.t
103 103 test-doctest.py
104 104 test-double-merge.t
105 105 test-drawdag.t
106 106 test-duplicateoptions.py
107 107 test-editor-filename.t
108 108 test-empty-dir.t
109 109 test-empty-file.t
110 110 test-empty-group.t
111 111 test-empty.t
112 112 test-encode.t
113 113 test-encoding-func.py
114 114 test-encoding.t
115 115 test-eol-add.t
116 116 test-eol-clone.t
117 117 test-eol-hook.t
118 118 test-eol-tag.t
119 119 test-eol-update.t
120 120 test-excessive-merge.t
121 121 test-exchange-obsmarkers-case-A1.t
122 122 test-exchange-obsmarkers-case-A2.t
123 123 test-exchange-obsmarkers-case-A3.t
124 124 test-exchange-obsmarkers-case-A4.t
125 125 test-exchange-obsmarkers-case-A5.t
126 126 test-exchange-obsmarkers-case-A6.t
127 127 test-exchange-obsmarkers-case-A7.t
128 128 test-exchange-obsmarkers-case-B1.t
129 129 test-exchange-obsmarkers-case-B2.t
130 130 test-exchange-obsmarkers-case-B3.t
131 131 test-exchange-obsmarkers-case-B4.t
132 132 test-exchange-obsmarkers-case-B5.t
133 133 test-exchange-obsmarkers-case-B6.t
134 134 test-exchange-obsmarkers-case-B7.t
135 135 test-exchange-obsmarkers-case-C1.t
136 136 test-exchange-obsmarkers-case-C2.t
137 137 test-exchange-obsmarkers-case-C3.t
138 138 test-exchange-obsmarkers-case-C4.t
139 139 test-exchange-obsmarkers-case-D1.t
140 140 test-exchange-obsmarkers-case-D2.t
141 141 test-exchange-obsmarkers-case-D3.t
142 142 test-exchange-obsmarkers-case-D4.t
143 143 test-execute-bit.t
144 144 test-export.t
145 145 test-extdata.t
146 146 test-extdiff.t
147 147 test-extra-filelog-entry.t
148 148 test-filebranch.t
149 149 test-fileset-generated.t
150 150 test-fix-topology.t
151 151 test-flags.t
152 152 test-generaldelta.t
153 153 test-getbundle.t
154 154 test-git-export.t
155 155 test-glog-topological.t
156 156 test-gpg.t
157 157 test-graft.t
158 158 test-hg-parseurl.py
159 159 test-hghave.t
160 160 test-hgignore.t
161 161 test-hgk.t
162 162 test-hgweb-bundle.t
163 163 test-hgweb-descend-empties.t
164 164 test-hgweb-empty.t
165 165 test-hgweb-removed.t
166 166 test-hgwebdir-paths.py
167 167 test-hgwebdirsym.t
168 168 test-histedit-arguments.t
169 169 test-histedit-base.t
170 170 test-histedit-bookmark-motion.t
171 171 test-histedit-commute.t
172 172 test-histedit-drop.t
173 173 test-histedit-edit.t
174 174 test-histedit-fold-non-commute.t
175 175 test-histedit-fold.t
176 176 test-histedit-no-change.t
177 177 test-histedit-non-commute-abort.t
178 178 test-histedit-non-commute.t
179 179 test-histedit-obsolete.t
180 180 test-histedit-outgoing.t
181 181 test-histedit-templates.t
182 182 test-http-branchmap.t
183 183 test-http-bundle1.t
184 184 test-http-clone-r.t
185 185 test-http.t
186 186 test-hybridencode.py
187 187 test-identify.t
188 188 test-import-unknown.t
189 189 test-import.t
190 190 test-imports-checker.t
191 191 test-incoming-outgoing.t
192 192 test-inherit-mode.t
193 193 test-issue1089.t
194 194 test-issue1102.t
195 195 test-issue1175.t
196 196 test-issue1306.t
197 197 test-issue1438.t
198 198 test-issue1502.t
199 199 test-issue1802.t
200 200 test-issue1877.t
201 201 test-issue1993.t
202 202 test-issue2137.t
203 203 test-issue3084.t
204 204 test-issue4074.t
205 205 test-issue522.t
206 206 test-issue586.t
207 207 test-issue612.t
208 208 test-issue619.t
209 209 test-issue660.t
210 210 test-issue672.t
211 211 test-issue842.t
212 212 test-journal-exists.t
213 213 test-journal-share.t
214 214 test-journal.t
215 215 test-largefiles-cache.t
216 216 test-largefiles-misc.t
217 217 test-largefiles-small-disk.t
218 218 test-largefiles-update.t
219 219 test-largefiles.t
220 220 test-lfs-largefiles.t
221 221 test-linerange.py
222 222 test-locate.t
223 223 test-lock-badness.t
224 224 test-log-linerange.t
225 225 test-log.t
226 226 test-logexchange.t
227 227 test-lrucachedict.py
228 228 test-mactext.t
229 229 test-mailmap.t
230 230 test-manifest-merging.t
231 231 test-manifest.py
232 232 test-manifest.t
233 233 test-match.py
234 234 test-mdiff.py
235 235 test-merge-changedelete.t
236 236 test-merge-closedheads.t
237 237 test-merge-commit.t
238 238 test-merge-criss-cross.t
239 239 test-merge-default.t
240 240 test-merge-force.t
241 241 test-merge-halt.t
242 242 test-merge-internal-tools-pattern.t
243 243 test-merge-local.t
244 244 test-merge-remove.t
245 245 test-merge-revert.t
246 246 test-merge-revert2.t
247 247 test-merge-subrepos.t
248 248 test-merge-symlinks.t
249 249 test-merge-tools.t
250 250 test-merge-types.t
251 251 test-merge1.t
252 252 test-merge10.t
253 253 test-merge2.t
254 254 test-merge4.t
255 255 test-merge5.t
256 256 test-merge6.t
257 257 test-merge7.t
258 258 test-merge8.t
259 259 test-merge9.t
260 260 test-minifileset.py
261 261 test-minirst.py
262 262 test-mq-git.t
263 263 test-mq-header-date.t
264 264 test-mq-header-from.t
265 265 test-mq-merge.t
266 266 test-mq-pull-from-bundle.t
267 267 test-mq-qclone-http.t
268 268 test-mq-qdelete.t
269 269 test-mq-qdiff.t
270 270 test-mq-qfold.t
271 271 test-mq-qgoto.t
272 272 test-mq-qimport-fail-cleanup.t
273 273 test-mq-qnew.t
274 274 test-mq-qpush-exact.t
275 275 test-mq-qqueue.t
276 276 test-mq-qrefresh-interactive.t
277 277 test-mq-qrefresh-replace-log-message.t
278 278 test-mq-qrefresh.t
279 279 test-mq-qrename.t
280 280 test-mq-qsave.t
281 281 test-mq-safety.t
282 282 test-mq-subrepo.t
283 283 test-mq-symlinks.t
284 284 test-mv-cp-st-diff.t
285 285 test-narrow-archive.t
286 286 test-narrow-clone-no-ellipsis.t
287 287 test-narrow-clone-non-narrow-server.t
288 288 test-narrow-clone-nonlinear.t
289 289 test-narrow-clone.t
290 290 test-narrow-commit.t
291 291 test-narrow-copies.t
292 292 test-narrow-debugcommands.t
293 293 test-narrow-debugrebuilddirstate.t
294 294 test-narrow-exchange-merges.t
295 295 test-narrow-exchange.t
296 296 test-narrow-expanddirstate.t
297 297 test-narrow-merge.t
298 298 test-narrow-patch.t
299 299 test-narrow-patterns.t
300 300 test-narrow-pull.t
301 301 test-narrow-rebase.t
302 302 test-narrow-shallow-merges.t
303 303 test-narrow-shallow.t
304 304 test-narrow-strip.t
305 305 test-narrow-update.t
306 306 test-nested-repo.t
307 307 test-newbranch.t
308 308 test-obshistory.t
309 309 test-obsmarker-template.t
310 310 test-obsmarkers-effectflag.t
311 311 test-obsolete-bundle-strip.t
312 312 test-obsolete-changeset-exchange.t
313 313 test-obsolete-checkheads.t
314 314 test-obsolete-distributed.t
315 315 test-obsolete-tag-cache.t
316 316 test-parents.t
317 317 test-pathconflicts-merge.t
318 318 test-pathconflicts-update.t
319 319 test-pathencode.py
320 320 test-pending.t
321 321 test-permissions.t
322 322 test-phases.t
323 323 test-pull-branch.t
324 324 test-pull-http.t
325 325 test-pull-permission.t
326 326 test-pull-pull-corruption.t
327 327 test-pull-r.t
328 328 test-pull-update.t
329 329 test-purge.t
330 330 test-push-checkheads-partial-C1.t
331 331 test-push-checkheads-partial-C2.t
332 332 test-push-checkheads-partial-C3.t
333 333 test-push-checkheads-partial-C4.t
334 334 test-push-checkheads-pruned-B1.t
335 335 test-push-checkheads-pruned-B2.t
336 336 test-push-checkheads-pruned-B3.t
337 337 test-push-checkheads-pruned-B4.t
338 338 test-push-checkheads-pruned-B5.t
339 339 test-push-checkheads-pruned-B6.t
340 340 test-push-checkheads-pruned-B7.t
341 341 test-push-checkheads-pruned-B8.t
342 342 test-push-checkheads-superceed-A1.t
343 343 test-push-checkheads-superceed-A2.t
344 344 test-push-checkheads-superceed-A3.t
345 345 test-push-checkheads-superceed-A4.t
346 346 test-push-checkheads-superceed-A5.t
347 347 test-push-checkheads-superceed-A6.t
348 348 test-push-checkheads-superceed-A7.t
349 349 test-push-checkheads-superceed-A8.t
350 350 test-push-checkheads-unpushed-D1.t
351 351 test-push-checkheads-unpushed-D2.t
352 352 test-push-checkheads-unpushed-D3.t
353 353 test-push-checkheads-unpushed-D4.t
354 354 test-push-checkheads-unpushed-D5.t
355 355 test-push-checkheads-unpushed-D6.t
356 356 test-push-checkheads-unpushed-D7.t
357 357 test-push-http.t
358 358 test-push-warn.t
359 359 test-pushvars.t
360 360 test-rebase-abort.t
361 361 test-rebase-base-flag.t
362 362 test-rebase-bookmarks.t
363 363 test-rebase-brute-force.t
364 364 test-rebase-cache.t
365 365 test-rebase-check-restore.t
366 366 test-rebase-collapse.t
367 367 test-rebase-conflicts.t
368 368 test-rebase-dest.t
369 369 test-rebase-detach.t
370 370 test-rebase-emptycommit.t
371 371 test-rebase-inmemory.t
372 372 test-rebase-interruptions.t
373 373 test-rebase-issue-noparam-single-rev.t
374 374 test-rebase-legacy.t
375 375 test-rebase-mq-skip.t
376 376 test-rebase-mq.t
377 377 test-rebase-named-branches.t
378 378 test-rebase-newancestor.t
379 379 test-rebase-obsolete.t
380 380 test-rebase-parameters.t
381 381 test-rebase-partial.t
382 382 test-rebase-pull.t
383 383 test-rebase-rename.t
384 384 test-rebase-scenario-global.t
385 385 test-rebase-templates.t
386 386 test-rebase-transaction.t
387 387 test-record.t
388 388 test-relink.t
389 389 test-remove.t
390 390 test-rename-after-merge.t
391 391 test-rename-dir-merge.t
392 392 test-rename-merge1.t
393 393 test-rename.t
394 394 test-repair-strip.t
395 395 test-repo-compengines.t
396 396 test-resolve.t
397 397 test-revert-flags.t
398 398 test-revert-unknown.t
399 399 test-revlog-ancestry.py
400 400 test-revlog-group-emptyiter.t
401 401 test-revlog-mmapindex.t
402 402 test-revlog-packentry.t
403 403 test-revset-dirstate-parents.t
404 404 test-revset-legacy-lookup.t
405 405 test-revset-outgoing.t
406 406 test-rollback.t
407 407 test-run-tests.py
408 408 test-run-tests.t
409 409 test-schemes.t
410 410 test-serve.t
411 411 test-setdiscovery.t
412 412 test-share.t
413 413 test-shelve.t
414 414 test-show-stack.t
415 415 test-show-work.t
416 416 test-show.t
417 417 test-simple-update.t
418 test-simplemerge.py
418 419 test-single-head.t
419 420 test-sparse-clear.t
420 421 test-sparse-import.t
421 422 test-sparse-merges.t
422 423 test-sparse-profiles.t
423 424 test-sparse-requirement.t
424 425 test-sparse-verbose-json.t
425 426 test-ssh-clone-r.t
426 427 test-ssh-proto.t
427 428 test-sshserver.py
428 429 test-stack.t
429 430 test-status-rev.t
430 431 test-status-terse.t
431 432 test-strip-cross.t
432 433 test-strip.t
433 434 test-subrepo-deep-nested-change.t
434 435 test-subrepo-missing.t
435 436 test-subrepo-recursion.t
436 437 test-subrepo-relative-path.t
437 438 test-subrepo.t
438 439 test-symlinks.t
439 440 test-tag.t
440 441 test-tags.t
441 442 test-template-engine.t
442 443 test-treemanifest.t
443 444 test-unamend.t
444 445 test-uncommit.t
445 446 test-unified-test.t
446 447 test-unrelated-pull.t
447 448 test-up-local-change.t
448 449 test-update-branches.t
449 450 test-update-dest.t
450 451 test-update-issue1456.t
451 452 test-update-names.t
452 453 test-update-reverse.t
453 454 test-upgrade-repo.t
454 455 test-url-download.t
455 456 test-url-rev.t
456 457 test-url.py
457 458 test-username-newline.t
458 459 test-verify.t
459 460 test-walkrepo.py
460 461 test-websub.t
461 462 test-win32text.t
462 463 test-wireproto-clientreactor.py
463 464 test-wireproto-framing.py
464 465 test-wireproto-serverreactor.py
465 466 test-xdg.t
@@ -1,365 +1,365
1 1 # Copyright (C) 2004, 2005 Canonical Ltd
2 2 #
3 3 # This program is free software; you can redistribute it and/or modify
4 4 # it under the terms of the GNU General Public License as published by
5 5 # the Free Software Foundation; either version 2 of the License, or
6 6 # (at your option) any later version.
7 7 #
8 8 # This program is distributed in the hope that it will be useful,
9 9 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 11 # GNU General Public License for more details.
12 12 #
13 13 # You should have received a copy of the GNU General Public License
14 14 # along with this program; if not, see <http://www.gnu.org/licenses/>.
15 15
16 16 from __future__ import absolute_import
17 17
18 18 import unittest
19 19 from mercurial import (
20 20 error,
21 21 simplemerge,
22 22 util,
23 23 )
24 24
25 25 from mercurial.utils import (
26 26 stringutil,
27 27 )
28 28
29 29 TestCase = unittest.TestCase
30 30 # bzr compatible interface, for the tests
31 31 class Merge3(simplemerge.Merge3Text):
32 32 """3-way merge of texts.
33 33
34 34 Given BASE, OTHER, THIS, tries to produce a combined text
35 35 incorporating the changes from both BASE->OTHER and BASE->THIS.
36 36 All three will typically be sequences of lines."""
37 37 def __init__(self, base, a, b):
38 basetext = '\n'.join([i.strip('\n') for i in base] + [''])
39 atext = '\n'.join([i.strip('\n') for i in a] + [''])
40 btext = '\n'.join([i.strip('\n') for i in b] + [''])
38 basetext = b'\n'.join([i.strip(b'\n') for i in base] + [b''])
39 atext = b'\n'.join([i.strip(b'\n') for i in a] + [b''])
40 btext = b'\n'.join([i.strip(b'\n') for i in b] + [b''])
41 41 if (stringutil.binary(basetext) or stringutil.binary(atext)
42 42 or stringutil.binary(btext)):
43 raise error.Abort("don't know how to merge binary files")
43 raise error.Abort(b"don't know how to merge binary files")
44 44 simplemerge.Merge3Text.__init__(self, basetext, atext, btext,
45 45 base, a, b)
46 46
47 47 CantReprocessAndShowBase = simplemerge.CantReprocessAndShowBase
48 48
49 49 def split_lines(t):
50 50 return util.stringio(t).readlines()
51 51
52 52 ############################################################
53 53 # test case data from the gnu diffutils manual
54 54 # common base
55 TZU = split_lines(""" The Nameless is the origin of Heaven and Earth;
55 TZU = split_lines(b""" The Nameless is the origin of Heaven and Earth;
56 56 The named is the mother of all things.
57 57
58 58 Therefore let there always be non-being,
59 59 so we may see their subtlety,
60 60 And let there always be being,
61 61 so we may see their outcome.
62 62 The two are the same,
63 63 But after they are produced,
64 64 they have different names.
65 65 They both may be called deep and profound.
66 66 Deeper and more profound,
67 67 The door of all subtleties!
68 68 """)
69 69
70 LAO = split_lines(""" The Way that can be told of is not the eternal Way;
70 LAO = split_lines(b""" The Way that can be told of is not the eternal Way;
71 71 The name that can be named is not the eternal name.
72 72 The Nameless is the origin of Heaven and Earth;
73 73 The Named is the mother of all things.
74 74 Therefore let there always be non-being,
75 75 so we may see their subtlety,
76 76 And let there always be being,
77 77 so we may see their outcome.
78 78 The two are the same,
79 79 But after they are produced,
80 80 they have different names.
81 81 """)
82 82
83 83
84 TAO = split_lines(""" The Way that can be told of is not the eternal Way;
84 TAO = split_lines(b""" The Way that can be told of is not the eternal Way;
85 85 The name that can be named is not the eternal name.
86 86 The Nameless is the origin of Heaven and Earth;
87 87 The named is the mother of all things.
88 88
89 89 Therefore let there always be non-being,
90 90 so we may see their subtlety,
91 91 And let there always be being,
92 92 so we may see their result.
93 93 The two are the same,
94 94 But after they are produced,
95 95 they have different names.
96 96
97 97 -- The Way of Lao-Tzu, tr. Wing-tsit Chan
98 98
99 99 """)
100 100
101 MERGED_RESULT = split_lines("""\
101 MERGED_RESULT = split_lines(b"""\
102 102 The Way that can be told of is not the eternal Way;
103 103 The name that can be named is not the eternal name.
104 104 The Nameless is the origin of Heaven and Earth;
105 105 The Named is the mother of all things.
106 106 Therefore let there always be non-being,
107 107 so we may see their subtlety,
108 108 And let there always be being,
109 109 so we may see their result.
110 110 The two are the same,
111 111 But after they are produced,
112 112 they have different names.
113 113 <<<<<<< LAO
114 114 =======
115 115
116 116 -- The Way of Lao-Tzu, tr. Wing-tsit Chan
117 117
118 118 >>>>>>> TAO
119 119 """)
120 120
121 121 class TestMerge3(TestCase):
122 122 def log(self, msg):
123 123 pass
124 124
125 125 def test_no_changes(self):
126 126 """No conflicts because nothing changed"""
127 m3 = Merge3(['aaa', 'bbb'],
128 ['aaa', 'bbb'],
129 ['aaa', 'bbb'])
127 m3 = Merge3([b'aaa', b'bbb'],
128 [b'aaa', b'bbb'],
129 [b'aaa', b'bbb'])
130 130
131 131 self.assertEqual(m3.find_unconflicted(),
132 132 [(0, 2)])
133 133
134 134 self.assertEqual(list(m3.find_sync_regions()),
135 135 [(0, 2,
136 136 0, 2,
137 137 0, 2),
138 138 (2, 2, 2, 2, 2, 2)])
139 139
140 140 self.assertEqual(list(m3.merge_regions()),
141 [('unchanged', 0, 2)])
141 [(b'unchanged', 0, 2)])
142 142
143 143 self.assertEqual(list(m3.merge_groups()),
144 [('unchanged', ['aaa', 'bbb'])])
144 [(b'unchanged', [b'aaa', b'bbb'])])
145 145
146 146 def test_front_insert(self):
147 m3 = Merge3(['zz'],
148 ['aaa', 'bbb', 'zz'],
149 ['zz'])
147 m3 = Merge3([b'zz'],
148 [b'aaa', b'bbb', b'zz'],
149 [b'zz'])
150 150
151 151 # todo: should use a sentinel at end as from get_matching_blocks
152 152 # to match without zz
153 153 self.assertEqual(list(m3.find_sync_regions()),
154 154 [(0, 1, 2, 3, 0, 1),
155 155 (1, 1, 3, 3, 1, 1)])
156 156
157 157 self.assertEqual(list(m3.merge_regions()),
158 [('a', 0, 2),
159 ('unchanged', 0, 1)])
158 [(b'a', 0, 2),
159 (b'unchanged', 0, 1)])
160 160
161 161 self.assertEqual(list(m3.merge_groups()),
162 [('a', ['aaa', 'bbb']),
163 ('unchanged', ['zz'])])
162 [(b'a', [b'aaa', b'bbb']),
163 (b'unchanged', [b'zz'])])
164 164
165 165 def test_null_insert(self):
166 166 m3 = Merge3([],
167 ['aaa', 'bbb'],
167 [b'aaa', b'bbb'],
168 168 [])
169 169 # todo: should use a sentinel at end as from get_matching_blocks
170 170 # to match without zz
171 171 self.assertEqual(list(m3.find_sync_regions()),
172 172 [(0, 0, 2, 2, 0, 0)])
173 173
174 174 self.assertEqual(list(m3.merge_regions()),
175 [('a', 0, 2)])
175 [(b'a', 0, 2)])
176 176
177 177 self.assertEqual(list(m3.merge_lines()),
178 ['aaa', 'bbb'])
178 [b'aaa', b'bbb'])
179 179
180 180 def test_no_conflicts(self):
181 181 """No conflicts because only one side changed"""
182 m3 = Merge3(['aaa', 'bbb'],
183 ['aaa', '111', 'bbb'],
184 ['aaa', 'bbb'])
182 m3 = Merge3([b'aaa', b'bbb'],
183 [b'aaa', b'111', b'bbb'],
184 [b'aaa', b'bbb'])
185 185
186 186 self.assertEqual(m3.find_unconflicted(),
187 187 [(0, 1), (1, 2)])
188 188
189 189 self.assertEqual(list(m3.find_sync_regions()),
190 190 [(0, 1, 0, 1, 0, 1),
191 191 (1, 2, 2, 3, 1, 2),
192 192 (2, 2, 3, 3, 2, 2)])
193 193
194 194 self.assertEqual(list(m3.merge_regions()),
195 [('unchanged', 0, 1),
196 ('a', 1, 2),
197 ('unchanged', 1, 2)])
195 [(b'unchanged', 0, 1),
196 (b'a', 1, 2),
197 (b'unchanged', 1, 2)])
198 198
199 199 def test_append_a(self):
200 m3 = Merge3(['aaa\n', 'bbb\n'],
201 ['aaa\n', 'bbb\n', '222\n'],
202 ['aaa\n', 'bbb\n'])
200 m3 = Merge3([b'aaa\n', b'bbb\n'],
201 [b'aaa\n', b'bbb\n', b'222\n'],
202 [b'aaa\n', b'bbb\n'])
203 203
204 self.assertEqual(''.join(m3.merge_lines()),
205 'aaa\nbbb\n222\n')
204 self.assertEqual(b''.join(m3.merge_lines()),
205 b'aaa\nbbb\n222\n')
206 206
207 207 def test_append_b(self):
208 m3 = Merge3(['aaa\n', 'bbb\n'],
209 ['aaa\n', 'bbb\n'],
210 ['aaa\n', 'bbb\n', '222\n'])
208 m3 = Merge3([b'aaa\n', b'bbb\n'],
209 [b'aaa\n', b'bbb\n'],
210 [b'aaa\n', b'bbb\n', b'222\n'])
211 211
212 self.assertEqual(''.join(m3.merge_lines()),
213 'aaa\nbbb\n222\n')
212 self.assertEqual(b''.join(m3.merge_lines()),
213 b'aaa\nbbb\n222\n')
214 214
215 215 def test_append_agreement(self):
216 m3 = Merge3(['aaa\n', 'bbb\n'],
217 ['aaa\n', 'bbb\n', '222\n'],
218 ['aaa\n', 'bbb\n', '222\n'])
216 m3 = Merge3([b'aaa\n', b'bbb\n'],
217 [b'aaa\n', b'bbb\n', b'222\n'],
218 [b'aaa\n', b'bbb\n', b'222\n'])
219 219
220 self.assertEqual(''.join(m3.merge_lines()),
221 'aaa\nbbb\n222\n')
220 self.assertEqual(b''.join(m3.merge_lines()),
221 b'aaa\nbbb\n222\n')
222 222
223 223 def test_append_clash(self):
224 m3 = Merge3(['aaa\n', 'bbb\n'],
225 ['aaa\n', 'bbb\n', '222\n'],
226 ['aaa\n', 'bbb\n', '333\n'])
224 m3 = Merge3([b'aaa\n', b'bbb\n'],
225 [b'aaa\n', b'bbb\n', b'222\n'],
226 [b'aaa\n', b'bbb\n', b'333\n'])
227 227
228 ml = m3.merge_lines(name_a='a',
229 name_b='b',
230 start_marker='<<',
231 mid_marker='--',
232 end_marker='>>')
233 self.assertEqual(''.join(ml),
234 'aaa\n'
235 'bbb\n'
236 '<< a\n'
237 '222\n'
238 '--\n'
239 '333\n'
240 '>> b\n'
228 ml = m3.merge_lines(name_a=b'a',
229 name_b=b'b',
230 start_marker=b'<<',
231 mid_marker=b'--',
232 end_marker=b'>>')
233 self.assertEqual(b''.join(ml),
234 b'aaa\n'
235 b'bbb\n'
236 b'<< a\n'
237 b'222\n'
238 b'--\n'
239 b'333\n'
240 b'>> b\n'
241 241 )
242 242
243 243 def test_insert_agreement(self):
244 m3 = Merge3(['aaa\n', 'bbb\n'],
245 ['aaa\n', '222\n', 'bbb\n'],
246 ['aaa\n', '222\n', 'bbb\n'])
244 m3 = Merge3([b'aaa\n', b'bbb\n'],
245 [b'aaa\n', b'222\n', b'bbb\n'],
246 [b'aaa\n', b'222\n', b'bbb\n'])
247 247
248 ml = m3.merge_lines(name_a='a',
249 name_b='b',
250 start_marker='<<',
251 mid_marker='--',
252 end_marker='>>')
253 self.assertEqual(''.join(ml), 'aaa\n222\nbbb\n')
248 ml = m3.merge_lines(name_a=b'a',
249 name_b=b'b',
250 start_marker=b'<<',
251 mid_marker=b'--',
252 end_marker=b'>>')
253 self.assertEqual(b''.join(ml), b'aaa\n222\nbbb\n')
254 254
255 255
256 256 def test_insert_clash(self):
257 257 """Both try to insert lines in the same place."""
258 m3 = Merge3(['aaa\n', 'bbb\n'],
259 ['aaa\n', '111\n', 'bbb\n'],
260 ['aaa\n', '222\n', 'bbb\n'])
258 m3 = Merge3([b'aaa\n', b'bbb\n'],
259 [b'aaa\n', b'111\n', b'bbb\n'],
260 [b'aaa\n', b'222\n', b'bbb\n'])
261 261
262 262 self.assertEqual(m3.find_unconflicted(),
263 263 [(0, 1), (1, 2)])
264 264
265 265 self.assertEqual(list(m3.find_sync_regions()),
266 266 [(0, 1, 0, 1, 0, 1),
267 267 (1, 2, 2, 3, 2, 3),
268 268 (2, 2, 3, 3, 3, 3)])
269 269
270 270 self.assertEqual(list(m3.merge_regions()),
271 [('unchanged', 0, 1),
272 ('conflict', 1, 1, 1, 2, 1, 2),
273 ('unchanged', 1, 2)])
271 [(b'unchanged', 0, 1),
272 (b'conflict', 1, 1, 1, 2, 1, 2),
273 (b'unchanged', 1, 2)])
274 274
275 275 self.assertEqual(list(m3.merge_groups()),
276 [('unchanged', ['aaa\n']),
277 ('conflict', [], ['111\n'], ['222\n']),
278 ('unchanged', ['bbb\n']),
276 [(b'unchanged', [b'aaa\n']),
277 (b'conflict', [], [b'111\n'], [b'222\n']),
278 (b'unchanged', [b'bbb\n']),
279 279 ])
280 280
281 ml = m3.merge_lines(name_a='a',
282 name_b='b',
283 start_marker='<<',
284 mid_marker='--',
285 end_marker='>>')
286 self.assertEqual(''.join(ml),
287 '''aaa
281 ml = m3.merge_lines(name_a=b'a',
282 name_b=b'b',
283 start_marker=b'<<',
284 mid_marker=b'--',
285 end_marker=b'>>')
286 self.assertEqual(b''.join(ml),
287 b'''aaa
288 288 << a
289 289 111
290 290 --
291 291 222
292 292 >> b
293 293 bbb
294 294 ''')
295 295
296 296 def test_replace_clash(self):
297 297 """Both try to insert lines in the same place."""
298 m3 = Merge3(['aaa', '000', 'bbb'],
299 ['aaa', '111', 'bbb'],
300 ['aaa', '222', 'bbb'])
298 m3 = Merge3([b'aaa', b'000', b'bbb'],
299 [b'aaa', b'111', b'bbb'],
300 [b'aaa', b'222', b'bbb'])
301 301
302 302 self.assertEqual(m3.find_unconflicted(),
303 303 [(0, 1), (2, 3)])
304 304
305 305 self.assertEqual(list(m3.find_sync_regions()),
306 306 [(0, 1, 0, 1, 0, 1),
307 (2, 3, 2, 3, 2, 3),
308 (3, 3, 3, 3, 3, 3)])
307 (2, 3, 2, 3, 2, 3),
308 (3, 3, 3, 3, 3, 3)])
309 309
310 310 def test_replace_multi(self):
311 311 """Replacement with regions of different size."""
312 m3 = Merge3(['aaa', '000', '000', 'bbb'],
313 ['aaa', '111', '111', '111', 'bbb'],
314 ['aaa', '222', '222', '222', '222', 'bbb'])
312 m3 = Merge3([b'aaa', b'000', b'000', b'bbb'],
313 [b'aaa', b'111', b'111', b'111', b'bbb'],
314 [b'aaa', b'222', b'222', b'222', b'222', b'bbb'])
315 315
316 316 self.assertEqual(m3.find_unconflicted(),
317 317 [(0, 1), (3, 4)])
318 318
319 319
320 320 self.assertEqual(list(m3.find_sync_regions()),
321 321 [(0, 1, 0, 1, 0, 1),
322 322 (3, 4, 4, 5, 5, 6),
323 323 (4, 4, 5, 5, 6, 6)])
324 324
325 325 def test_merge_poem(self):
326 326 """Test case from diff3 manual"""
327 327 m3 = Merge3(TZU, LAO, TAO)
328 ml = list(m3.merge_lines('LAO', 'TAO'))
329 self.log('merge result:')
330 self.log(''.join(ml))
328 ml = list(m3.merge_lines(b'LAO', b'TAO'))
329 self.log(b'merge result:')
330 self.log(b''.join(ml))
331 331 self.assertEqual(ml, MERGED_RESULT)
332 332
333 333 def test_binary(self):
334 334 with self.assertRaises(error.Abort):
335 Merge3(['\x00'], ['a'], ['b'])
335 Merge3([b'\x00'], [b'a'], [b'b'])
336 336
337 337 def test_dos_text(self):
338 base_text = 'a\r\n'
339 this_text = 'b\r\n'
340 other_text = 'c\r\n'
338 base_text = b'a\r\n'
339 this_text = b'b\r\n'
340 other_text = b'c\r\n'
341 341 m3 = Merge3(base_text.splitlines(True), other_text.splitlines(True),
342 342 this_text.splitlines(True))
343 m_lines = m3.merge_lines('OTHER', 'THIS')
344 self.assertEqual('<<<<<<< OTHER\r\nc\r\n=======\r\nb\r\n'
345 '>>>>>>> THIS\r\n'.splitlines(True), list(m_lines))
343 m_lines = m3.merge_lines(b'OTHER', b'THIS')
344 self.assertEqual(b'<<<<<<< OTHER\r\nc\r\n=======\r\nb\r\n'
345 b'>>>>>>> THIS\r\n'.splitlines(True), list(m_lines))
346 346
347 347 def test_mac_text(self):
348 base_text = 'a\r'
349 this_text = 'b\r'
350 other_text = 'c\r'
348 base_text = b'a\r'
349 this_text = b'b\r'
350 other_text = b'c\r'
351 351 m3 = Merge3(base_text.splitlines(True), other_text.splitlines(True),
352 352 this_text.splitlines(True))
353 m_lines = m3.merge_lines('OTHER', 'THIS')
354 self.assertEqual('<<<<<<< OTHER\rc\r=======\rb\r'
355 '>>>>>>> THIS\r'.splitlines(True), list(m_lines))
353 m_lines = m3.merge_lines(b'OTHER', b'THIS')
354 self.assertEqual(b'<<<<<<< OTHER\rc\r=======\rb\r'
355 b'>>>>>>> THIS\r'.splitlines(True), list(m_lines))
356 356
357 357 if __name__ == '__main__':
358 358 # hide the timer
359 359 import time
360 360 orig = time.time
361 361 try:
362 362 time.time = lambda: 0
363 363 unittest.main()
364 364 finally:
365 365 time.time = orig
General Comments 0
You need to be logged in to leave comments. Login now