~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_weave.py

  • Committer: Aaron Bentley
  • Date: 2006-04-18 23:42:34 UTC
  • mto: This revision was merged to the branch mainline in revision 1672.
  • Revision ID: aaron.bentley@utoronto.ca-20060418234234-d3d230b99ba70b9f
Ported weave merge test to versionedfile

Show diffs side-by-side

added added

removed removed

Lines of Context:
682
682
        self.check_read_write(k)
683
683
 
684
684
 
685
 
class MergeCases(TestBase):
686
 
    def doMerge(self, base, a, b, mp):
687
 
        from cStringIO import StringIO
688
 
        from textwrap import dedent
689
 
 
690
 
        def addcrlf(x):
691
 
            return x + '\n'
692
 
        
693
 
        w = Weave()
694
 
        w.add_lines('text0', [], map(addcrlf, base))
695
 
        w.add_lines('text1', ['text0'], map(addcrlf, a))
696
 
        w.add_lines('text2', ['text0'], map(addcrlf, b))
697
 
 
698
 
        self.log('weave is:')
699
 
        tmpf = StringIO()
700
 
        write_weave(w, tmpf)
701
 
        self.log(tmpf.getvalue())
702
 
 
703
 
        self.log('merge plan:')
704
 
        p = list(w.plan_merge('text1', 'text2'))
705
 
        for state, line in p:
706
 
            if line:
707
 
                self.log('%12s | %s' % (state, line[:-1]))
708
 
 
709
 
        self.log('merge:')
710
 
        mt = StringIO()
711
 
        mt.writelines(w.weave_merge(p))
712
 
        mt.seek(0)
713
 
        self.log(mt.getvalue())
714
 
 
715
 
        mp = map(addcrlf, mp)
716
 
        self.assertEqual(mt.readlines(), mp)
717
 
        
718
 
        
719
 
    def testOneInsert(self):
720
 
        self.doMerge([],
721
 
                     ['aa'],
722
 
                     [],
723
 
                     ['aa'])
724
 
 
725
 
    def testSeparateInserts(self):
726
 
        self.doMerge(['aaa', 'bbb', 'ccc'],
727
 
                     ['aaa', 'xxx', 'bbb', 'ccc'],
728
 
                     ['aaa', 'bbb', 'yyy', 'ccc'],
729
 
                     ['aaa', 'xxx', 'bbb', 'yyy', 'ccc'])
730
 
 
731
 
    def testSameInsert(self):
732
 
        self.doMerge(['aaa', 'bbb', 'ccc'],
733
 
                     ['aaa', 'xxx', 'bbb', 'ccc'],
734
 
                     ['aaa', 'xxx', 'bbb', 'yyy', 'ccc'],
735
 
                     ['aaa', 'xxx', 'bbb', 'yyy', 'ccc'])
736
 
 
737
 
    def testOverlappedInsert(self):
738
 
        self.doMerge(['aaa', 'bbb'],
739
 
                     ['aaa', 'xxx', 'yyy', 'bbb'],
740
 
                     ['aaa', 'xxx', 'bbb'],
741
 
                     ['aaa', '<<<<<<< ', 'xxx', 'yyy', '=======', 'xxx', 
742
 
                      '>>>>>>> ', 'bbb'])
743
 
 
744
 
        # really it ought to reduce this to 
745
 
        # ['aaa', 'xxx', 'yyy', 'bbb']
746
 
 
747
 
 
748
 
    def testClashReplace(self):
749
 
        self.doMerge(['aaa'],
750
 
                     ['xxx'],
751
 
                     ['yyy', 'zzz'],
752
 
                     ['<<<<<<< ', 'xxx', '=======', 'yyy', 'zzz', 
753
 
                      '>>>>>>> '])
754
 
 
755
 
    def testNonClashInsert(self):
756
 
        self.doMerge(['aaa'],
757
 
                     ['xxx', 'aaa'],
758
 
                     ['yyy', 'zzz'],
759
 
                     ['<<<<<<< ', 'xxx', 'aaa', '=======', 'yyy', 'zzz', 
760
 
                      '>>>>>>> '])
761
 
 
762
 
        self.doMerge(['aaa'],
763
 
                     ['aaa'],
764
 
                     ['yyy', 'zzz'],
765
 
                     ['yyy', 'zzz'])
766
 
 
767
 
 
768
 
    def testDeleteAndModify(self):
769
 
        """Clashing delete and modification.
770
 
 
771
 
        If one side modifies a region and the other deletes it then
772
 
        there should be a conflict with one side blank.
773
 
        """
774
 
 
775
 
        #######################################
776
 
        # skippd, not working yet
777
 
        return
778
 
        
779
 
        self.doMerge(['aaa', 'bbb', 'ccc'],
780
 
                     ['aaa', 'ddd', 'ccc'],
781
 
                     ['aaa', 'ccc'],
782
 
                     ['<<<<<<<< ', 'aaa', '=======', '>>>>>>> ', 'ccc'])
783
 
 
784
 
    def _test_merge_from_strings(self, base, a, b, expected):
785
 
        w = Weave()
786
 
        w.add_lines('text0', [], base.splitlines(True))
787
 
        w.add_lines('text1', ['text0'], a.splitlines(True))
788
 
        w.add_lines('text2', ['text0'], b.splitlines(True))
789
 
        self.log('merge plan:')
790
 
        p = list(w.plan_merge('text1', 'text2'))
791
 
        for state, line in p:
792
 
            if line:
793
 
                self.log('%12s | %s' % (state, line[:-1]))
794
 
        self.log('merge result:')
795
 
        result_text = ''.join(w.weave_merge(p))
796
 
        self.log(result_text)
797
 
        self.assertEqualDiff(result_text, expected)
798
 
 
799
 
    def test_weave_merge_conflicts(self):
800
 
        # does weave merge properly handle plans that end with unchanged?
801
 
        result = ''.join(Weave().weave_merge([('new-a', 'hello\n')]))
802
 
        self.assertEqual(result, 'hello\n')
803
 
 
804
 
    def test_deletion_extended(self):
805
 
        """One side deletes, the other deletes more.
806
 
        """
807
 
        base = """\
808
 
            line 1
809
 
            line 2
810
 
            line 3
811
 
            """
812
 
        a = """\
813
 
            line 1
814
 
            line 2
815
 
            """
816
 
        b = """\
817
 
            line 1
818
 
            """
819
 
        result = """\
820
 
            line 1
821
 
            """
822
 
        self._test_merge_from_strings(base, a, b, result)
823
 
 
824
 
    def test_deletion_overlap(self):
825
 
        """Delete overlapping regions with no other conflict.
826
 
 
827
 
        Arguably it'd be better to treat these as agreement, rather than 
828
 
        conflict, but for now conflict is safer.
829
 
        """
830
 
        base = """\
831
 
            start context
832
 
            int a() {}
833
 
            int b() {}
834
 
            int c() {}
835
 
            end context
836
 
            """
837
 
        a = """\
838
 
            start context
839
 
            int a() {}
840
 
            end context
841
 
            """
842
 
        b = """\
843
 
            start context
844
 
            int c() {}
845
 
            end context
846
 
            """
847
 
        result = """\
848
 
            start context
849
 
<<<<<<< 
850
 
            int a() {}
851
 
=======
852
 
            int c() {}
853
 
>>>>>>> 
854
 
            end context
855
 
            """
856
 
        self._test_merge_from_strings(base, a, b, result)
857
 
 
858
 
    def test_agreement_deletion(self):
859
 
        """Agree to delete some lines, without conflicts."""
860
 
        base = """\
861
 
            start context
862
 
            base line 1
863
 
            base line 2
864
 
            end context
865
 
            """
866
 
        a = """\
867
 
            start context
868
 
            base line 1
869
 
            end context
870
 
            """
871
 
        b = """\
872
 
            start context
873
 
            base line 1
874
 
            end context
875
 
            """
876
 
        result = """\
877
 
            start context
878
 
            base line 1
879
 
            end context
880
 
            """
881
 
        self._test_merge_from_strings(base, a, b, result)
882
 
 
883
 
    def test_sync_on_deletion(self):
884
 
        """Specific case of merge where we can synchronize incorrectly.
885
 
        
886
 
        A previous version of the weave merge concluded that the two versions
887
 
        agreed on deleting line 2, and this could be a synchronization point.
888
 
        Line 1 was then considered in isolation, and thought to be deleted on 
889
 
        both sides.
890
 
 
891
 
        It's better to consider the whole thing as a disagreement region.
892
 
        """
893
 
        base = """\
894
 
            start context
895
 
            base line 1
896
 
            base line 2
897
 
            end context
898
 
            """
899
 
        a = """\
900
 
            start context
901
 
            base line 1
902
 
            a's replacement line 2
903
 
            end context
904
 
            """
905
 
        b = """\
906
 
            start context
907
 
            b replaces
908
 
            both lines
909
 
            end context
910
 
            """
911
 
        result = """\
912
 
            start context
913
 
<<<<<<< 
914
 
            base line 1
915
 
            a's replacement line 2
916
 
=======
917
 
            b replaces
918
 
            both lines
919
 
>>>>>>> 
920
 
            end context
921
 
            """
922
 
        self._test_merge_from_strings(base, a, b, result)
923
 
 
924
 
 
925
685
class JoinWeavesTests(TestBase):
926
686
    def setUp(self):
927
687
        super(JoinWeavesTests, self).setUp()