~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_conflicts.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2010-11-11 08:45:19 UTC
  • mfrom: (4597.9.22 reports-conflict-resolved)
  • Revision ID: pqm@pqm.ubuntu.com-20101111084519-bmk1zmblp7kex41a
(vila) More feedback about the conflicts just resolved and the remaining
 ones. (Vincent Ladeuil)

Show diffs side-by-side

added added

removed removed

Lines of Context:
26
26
    tests,
27
27
    workingtree,
28
28
    )
29
 
from bzrlib.tests import script
30
 
 
31
 
 
32
 
def load_tests(standard_tests, module, loader):
33
 
    result = loader.suiteClass()
34
 
 
35
 
    sp_tests, remaining_tests = tests.split_suite_by_condition(
36
 
        standard_tests, tests.condition_isinstance((
37
 
                TestParametrizedResolveConflicts,
38
 
                )))
39
 
    # Each test class defines its own scenarios. This is needed for
40
 
    # TestResolvePathConflictBefore531967 that verifies that the same tests as
41
 
    # TestResolvePathConflict still pass.
42
 
    for test in tests.iter_suite_tests(sp_tests):
43
 
        tests.apply_scenarios(test, test.scenarios(), result)
44
 
 
45
 
    # No parametrization for the remaining tests
46
 
    result.addTests(remaining_tests)
47
 
 
48
 
    return result
 
29
from bzrlib.tests import (
 
30
    script,
 
31
    scenarios,
 
32
    )
 
33
 
 
34
 
 
35
load_tests = scenarios.load_tests_apply_scenarios
49
36
 
50
37
 
51
38
# TODO: Test commit with some added, and added-but-missing files
293
280
    _this = None
294
281
    _other = None
295
282
 
296
 
    @staticmethod
297
 
    def scenarios():
298
 
        """Return the scenario list for the conflict type defined by the class.
299
 
 
300
 
        Each scenario is of the form:
301
 
        (common, (left_name, left_dict), (right_name, right_dict))
302
 
 
303
 
        * common is a dict
304
 
 
305
 
        * left_name and right_name are the scenario names that will be combined
306
 
 
307
 
        * left_dict and right_dict are the attributes specific to each half of
308
 
          the scenario. They should include at least 'actions' and 'check' and
309
 
          will be available as '_this' and '_other' test instance attributes.
310
 
 
311
 
        Daughters classes are free to add their specific attributes as they see
312
 
        fit in any of the three dicts.
313
 
 
314
 
        This is a class method so that load_tests can find it.
315
 
 
316
 
        '_base_actions' in the common dict, 'actions' and 'check' in the left
317
 
        and right dicts use names that map to methods in the test classes. Some
318
 
        prefixes are added to these names to get the correspong methods (see
319
 
        _get_actions() and _get_check()). The motivation here is to avoid
320
 
        collisions in the class namespace.
321
 
        """
322
 
        # Only concrete classes return actual scenarios
323
 
        return []
 
283
    scenarios = []
 
284
    """The scenario list for the conflict type defined by the class.
 
285
 
 
286
    Each scenario is of the form:
 
287
    (common, (left_name, left_dict), (right_name, right_dict))
 
288
 
 
289
    * common is a dict
 
290
 
 
291
    * left_name and right_name are the scenario names that will be combined
 
292
 
 
293
    * left_dict and right_dict are the attributes specific to each half of
 
294
      the scenario. They should include at least 'actions' and 'check' and
 
295
      will be available as '_this' and '_other' test instance attributes.
 
296
 
 
297
    Daughters classes are free to add their specific attributes as they see
 
298
    fit in any of the three dicts.
 
299
 
 
300
    This is a class method so that load_tests can find it.
 
301
 
 
302
    '_base_actions' in the common dict, 'actions' and 'check' in the left
 
303
    and right dicts use names that map to methods in the test classes. Some
 
304
    prefixes are added to these names to get the correspong methods (see
 
305
    _get_actions() and _get_check()). The motivation here is to avoid
 
306
    collisions in the class namespace.
 
307
    """
324
308
 
325
309
    def setUp(self):
326
310
        super(TestParametrizedResolveConflicts, self).setUp()
390
374
 
391
375
class TestResolveContentsConflict(TestParametrizedResolveConflicts):
392
376
 
393
 
    _conflict_type = conflicts.ContentsConflict,
 
377
    _conflict_type = conflicts.ContentsConflict
394
378
 
395
 
    # Set by load_tests from scenarios()
 
379
    # Set by the scenarios
396
380
    # path and file-id for the file involved in the conflict
397
381
    _path = None
398
382
    _file_id = None
399
383
 
400
 
    @staticmethod
401
 
    def scenarios():
402
 
        base_scenarios = [
 
384
    scenarios = mirror_scenarios(
 
385
        [
403
386
            # File modified/deleted
404
387
            (dict(_base_actions='create_file',
405
388
                  _path='file', _file_id='file-id'),
407
390
              dict(actions='modify_file', check='file_has_more_content')),
408
391
             ('file_deleted',
409
392
              dict(actions='delete_file', check='file_doesnt_exist')),),
410
 
            ]
411
 
        return mirror_scenarios(base_scenarios)
 
393
            ])
412
394
 
413
395
    def do_create_file(self):
414
396
        return [('add', ('file', 'file-id', 'file', 'trunk content\n'))]
436
418
 
437
419
class TestResolvePathConflict(TestParametrizedResolveConflicts):
438
420
 
439
 
    _conflict_type = conflicts.PathConflict,
 
421
    _conflict_type = conflicts.PathConflict
440
422
 
441
423
    def do_nothing(self):
442
424
        return []
443
425
 
444
 
    @staticmethod
445
 
    def scenarios():
446
 
        # Each side dict additionally defines:
447
 
        # - path path involved (can be '<deleted>')
448
 
        # - file-id involved
449
 
        base_scenarios = [
 
426
    # Each side dict additionally defines:
 
427
    # - path path involved (can be '<deleted>')
 
428
    # - file-id involved
 
429
    scenarios = mirror_scenarios(
 
430
        [
450
431
            # File renamed/deleted
451
432
            (dict(_base_actions='create_file'),
452
433
             ('file_renamed',
483
464
             ('dir_renamed2',
484
465
              dict(actions='rename_dir2', check='dir_renamed2',
485
466
                   path='new-dir2', file_id='dir-id')),),
486
 
        ]
487
 
        return mirror_scenarios(base_scenarios)
 
467
            ])
488
468
 
489
469
    def do_create_file(self):
490
470
        return [('add', ('file', 'file-id', 'file', 'trunk content\n'))]
568
548
 
569
549
class TestResolveDuplicateEntry(TestParametrizedResolveConflicts):
570
550
 
571
 
    _conflict_type = conflicts.DuplicateEntry,
 
551
    _conflict_type = conflicts.DuplicateEntry
572
552
 
573
 
    @staticmethod
574
 
    def scenarios():
575
 
        # Each side dict additionally defines:
576
 
        # - path involved
577
 
        # - file-id involved
578
 
        base_scenarios = [
 
553
    scenarios = mirror_scenarios(
 
554
        [
579
555
            # File created with different file-ids
580
556
            (dict(_base_actions='nothing'),
581
557
             ('filea_created',
584
560
             ('fileb_created',
585
561
              dict(actions='create_file_b', check='file_content_b',
586
562
                   path='file', file_id='file-b-id')),),
587
 
            ]
588
 
        return mirror_scenarios(base_scenarios)
 
563
            ])
589
564
 
590
565
    def do_nothing(self):
591
566
        return []
649
624
        self.run_script("""
650
625
$ bzr rm -q dir  --force
651
626
$ bzr resolve dir
 
627
2>2 conflict(s) resolved, 0 remaining
652
628
$ bzr commit -q --strict -m 'No more conflicts nor unknown files'
653
629
""")
654
630
 
655
631
    def test_take_other(self):
656
632
        self.run_script("""
657
633
$ bzr resolve dir
 
634
2>2 conflict(s) resolved, 0 remaining
658
635
$ bzr commit -q --strict -m 'No more conflicts nor unknown files'
659
636
""")
660
637
 
688
665
    def test_keep_them_all(self):
689
666
        self.run_script("""
690
667
$ bzr resolve dir
 
668
2>2 conflict(s) resolved, 0 remaining
691
669
$ bzr commit -q --strict -m 'No more conflicts nor unknown files'
692
670
""")
693
671
 
696
674
$ bzr mv -q dir/file2 file2
697
675
$ bzr rm -q dir --force
698
676
$ bzr resolve dir
 
677
2>2 conflict(s) resolved, 0 remaining
699
678
$ bzr commit -q --strict -m 'No more conflicts nor unknown files'
700
679
""")
701
680
 
703
682
        self.run_script("""
704
683
$ bzr rm -q dir --force
705
684
$ bzr resolve dir
 
685
2>2 conflict(s) resolved, 0 remaining
706
686
$ bzr commit -q --strict -m 'No more conflicts nor unknown files'
707
687
""")
708
688
 
749
729
    def test_keep_them_all(self):
750
730
        self.run_script("""
751
731
$ bzr resolve dir
 
732
2>2 conflict(s) resolved, 0 remaining
752
733
$ bzr commit -q --strict -m 'No more conflicts nor unknown files'
753
734
""")
754
735
 
757
738
$ bzr mv -q dir/file2 file2
758
739
$ bzr rm -q dir --force
759
740
$ bzr resolve dir
 
741
2>2 conflict(s) resolved, 0 remaining
760
742
$ bzr commit -q --strict -m 'No more conflicts nor unknown files'
761
743
""")
762
744
 
764
746
        self.run_script("""
765
747
$ bzr rm -q dir --force
766
748
$ bzr resolve dir
 
749
2>2 conflict(s) resolved, 0 remaining
767
750
$ bzr commit -q --strict -m 'No more conflicts nor unknown files'
768
751
""")
769
752
 
770
753
    def test_resolve_taking_this(self):
771
754
        self.run_script("""
772
755
$ bzr resolve --take-this dir
 
756
2>2 conflict(s) resolved, 0 remaining
773
757
$ bzr commit -q --strict -m 'No more conflicts nor unknown files'
774
758
""")
775
759
 
778
762
$ bzr resolve --take-other dir
779
763
2>deleted dir/file2
780
764
2>deleted dir
 
765
2>2 conflict(s) resolved, 0 remaining
781
766
$ bzr commit -q --strict -m 'No more conflicts nor unknown files'
782
767
""")
783
768
 
784
769
 
785
770
class TestResolveParentLoop(TestParametrizedResolveConflicts):
786
771
 
787
 
    _conflict_type = conflicts.ParentLoop,
 
772
    _conflict_type = conflicts.ParentLoop
788
773
 
789
774
    _this_args = None
790
775
    _other_args = None
791
776
 
792
 
    @staticmethod
793
 
    def scenarios():
794
 
        # Each side dict additionally defines:
795
 
        # - dir_id: the directory being moved
796
 
        # - target_id: The target directory
797
 
        # - xfail: whether the test is expected to fail if the action is
798
 
        #     involved as 'other'
799
 
        base_scenarios = [
 
777
    # Each side dict additionally defines:
 
778
    # - dir_id: the directory being moved
 
779
    # - target_id: The target directory
 
780
    # - xfail: whether the test is expected to fail if the action is
 
781
    #   involved as 'other'
 
782
    scenarios = mirror_scenarios(
 
783
        [
800
784
            # Dirs moved into each other
801
785
            (dict(_base_actions='create_dir1_dir2'),
802
786
             ('dir1_into_dir2',
813
797
             ('dir3_into_dir2',
814
798
              dict(actions='move_dir3_into_dir2', check='dir3_4_moved',
815
799
                   dir_id='dir3-id', target_id='dir2-id', xfail=True))),
816
 
            ]
817
 
        return mirror_scenarios(base_scenarios)
 
800
            ])
818
801
 
819
802
    def do_create_dir1_dir2(self):
820
803
        return [('add', ('dir1', 'dir1-id', 'directory', '')),
909
892
# aside ? -- vila 090916
910
893
$ bzr add -q foo
911
894
$ bzr resolve foo.new
 
895
2>1 conflict(s) resolved, 0 remaining
912
896
$ bzr commit -q --strict -m 'No more conflicts nor unknown files'
913
897
""")
914
898
 
917
901
$ bzr rm -q foo --force
918
902
$ bzr mv -q foo.new foo
919
903
$ bzr resolve foo
 
904
2>1 conflict(s) resolved, 0 remaining
920
905
$ bzr commit -q --strict -m 'No more conflicts nor unknown files'
921
906
""")
922
907