github.com/jbendotnet/noms@v0.0.0-20190904222105-c43e4293ea92/go/merge/three_way_list_test.go (about)

     1  // Copyright 2016 Attic Labs, Inc. All rights reserved.
     2  // Licensed under the Apache License, version 2.0:
     3  // http://www.apache.org/licenses/LICENSE-2.0
     4  
     5  package merge
     6  
     7  import (
     8  	"testing"
     9  
    10  	"github.com/attic-labs/noms/go/types"
    11  	"github.com/stretchr/testify/suite"
    12  )
    13  
    14  func TestThreeWayListMerge(t *testing.T) {
    15  	suite.Run(t, &ThreeWayListMergeSuite{})
    16  }
    17  
    18  type ThreeWayListMergeSuite struct {
    19  	ThreeWayMergeSuite
    20  }
    21  
    22  func (s *ThreeWayListMergeSuite) SetupSuite() {
    23  	s.create = func(i seq) (val types.Value) {
    24  		if i != nil {
    25  			items := valsToTypesValues(s.create, i.items()...)
    26  			val = types.NewList(s.vs, items...)
    27  		}
    28  		return
    29  	}
    30  	s.typeStr = "List"
    31  }
    32  
    33  var p = items{"a", "b", "c", "d", "e"}
    34  
    35  func (s *ThreeWayListMergeSuite) TestThreeWayMerge_DoNothing() {
    36  	s.tryThreeWayMerge(nil, nil, p, p)
    37  }
    38  
    39  func (s *ThreeWayListMergeSuite) TestThreeWayMerge_NoLengthChange() {
    40  	a := items{"a", 1, "c", "d", "e"}
    41  	b := items{"a", "b", "c", 2, "e"}
    42  	m := items{"a", 1, "c", 2, "e"}
    43  	s.tryThreeWayMerge(a, b, p, m)
    44  	s.tryThreeWayMerge(b, a, p, m)
    45  }
    46  
    47  func (s *ThreeWayListMergeSuite) TestThreeWayMerge_HandleEmpty() {
    48  	s.tryThreeWayMerge(p, items{}, items{}, p)
    49  	s.tryThreeWayMerge(items{}, p, items{}, p)
    50  	s.tryThreeWayMerge(p, p, items{}, p)
    51  }
    52  
    53  func (s *ThreeWayListMergeSuite) TestThreeWayMerge_HandleNil() {
    54  	s.tryThreeWayMerge(p, items{}, nil, p)
    55  }
    56  
    57  func (s *ThreeWayListMergeSuite) TestThreeWayMerge_MakeLonger() {
    58  	a := items{"a", 1, 2, "c", "d", "e"}
    59  	b := items{"a", "b", "c", 3, "e"}
    60  	m := items{"a", 1, 2, "c", 3, "e"}
    61  	s.tryThreeWayMerge(a, b, p, m)
    62  	s.tryThreeWayMerge(b, a, p, m)
    63  
    64  }
    65  
    66  func (s *ThreeWayListMergeSuite) TestThreeWayMerge_MakeShorter() {
    67  	a := items{"a", "c", "d", "e"}
    68  	b := items{"a", "b", "c", 3, "e"}
    69  	m := items{"a", "c", 3, "e"}
    70  	s.tryThreeWayMerge(a, b, p, m)
    71  	s.tryThreeWayMerge(b, a, p, m)
    72  }
    73  
    74  func (s *ThreeWayListMergeSuite) TestThreeWayMerge_BothSidesRemove() {
    75  	a := items{"a", "c", "d", "e"}
    76  	b := items{"a", "b", "c", "e"}
    77  	m := items{"a", "c", "e"}
    78  	s.tryThreeWayMerge(a, b, p, m)
    79  	s.tryThreeWayMerge(b, a, p, m)
    80  }
    81  
    82  func (s *ThreeWayListMergeSuite) TestThreeWayMerge_OverlapSameRemoveNoInsert() {
    83  	a := items{"a", "d", "e"}
    84  	b := items{"a", "d", "e"}
    85  	m := items{"a", "d", "e"}
    86  	s.tryThreeWayMerge(a, b, p, m)
    87  	s.tryThreeWayMerge(b, a, p, m)
    88  }
    89  
    90  func (s *ThreeWayListMergeSuite) TestThreeWayMerge_OverlapSameRemoveSameInsert() {
    91  	a := items{"a", 1, 2, 3, "d", "e"}
    92  	b := items{"a", 1, 2, 3, "d", "e"}
    93  	m := items{"a", 1, 2, 3, "d", "e"}
    94  	s.tryThreeWayMerge(a, b, p, m)
    95  	s.tryThreeWayMerge(b, a, p, m)
    96  }
    97  
    98  func (s *ThreeWayListMergeSuite) TestThreeWayMerge_RemoveUpToOtherSideInsertionPoint() {
    99  	a := items{"a", 1, 2, "c", "d", "e"}
   100  	b := items{"a", "b", 3, "c", "d", "e"}
   101  	m := items{"a", 1, 2, 3, "c", "d", "e"}
   102  	s.tryThreeWayMerge(a, b, p, m)
   103  	s.tryThreeWayMerge(b, a, p, m)
   104  }
   105  
   106  func (s *ThreeWayListMergeSuite) TestThreeWayMerge_ConflictingAppends() {
   107  	a := append(p, 1)
   108  	b := append(p, 2)
   109  	s.tryThreeWayConflict(s.create(a), s.create(b), s.create(p), "Overlapping splices: 0 elements removed at 5; adding 1 elements")
   110  	s.tryThreeWayConflict(s.create(b), s.create(a), s.create(p), "Overlapping splices: 0 elements removed at 5; adding 1 elements")
   111  }
   112  
   113  func (s *ThreeWayListMergeSuite) TestThreeWayMerge_OverlappingRemoves() {
   114  	a := p[:4]
   115  	b := p[:3]
   116  	s.tryThreeWayConflict(s.create(a), s.create(b), s.create(p), "Overlapping splices: 1 elements removed at 4")
   117  	s.tryThreeWayConflict(s.create(b), s.create(a), s.create(p), "Overlapping splices: 2 elements removed at 3")
   118  }
   119  
   120  func (s *ThreeWayListMergeSuite) TestThreeWayMerge_SameRemoveAddPrefix() {
   121  	a := items{"a", "b", "c", 1}
   122  	b := items{"a", "b", "c", 1, 2}
   123  	s.tryThreeWayConflict(s.create(a), s.create(b), s.create(p), "Overlapping splices: 2 elements removed at 3; adding 1 elements")
   124  	s.tryThreeWayConflict(s.create(b), s.create(a), s.create(p), "Overlapping splices: 2 elements removed at 3; adding 2 elements")
   125  }
   126  
   127  func (s *ThreeWayListMergeSuite) TestThreeWayMerge_RemoveSupersetAddPrefix() {
   128  	a := items{"a", "b", "c", 1, 2}
   129  	b := items{"a", "b", "c", "d", 1}
   130  	s.tryThreeWayConflict(s.create(a), s.create(b), s.create(p), "Overlapping splices: 2 elements removed at 3; adding 2 elements")
   131  	s.tryThreeWayConflict(s.create(b), s.create(a), s.create(p), "Overlapping splices: 1 elements removed at 4; adding 1 elements")
   132  }
   133  
   134  func (s *ThreeWayListMergeSuite) TestThreeWayMerge_RemoveOtherSideInsertionPoint() {
   135  	a := items{"a", "c", "d", "e"}
   136  	b := items{"a", 1, "b", "c", "d", "e"}
   137  	s.tryThreeWayConflict(s.create(a), s.create(b), s.create(p), "Overlapping splices: 1 elements removed at 1; adding 0 elements")
   138  	s.tryThreeWayConflict(s.create(b), s.create(a), s.create(p), "Overlapping splices: 0 elements removed at 1; adding 1 elements")
   139  }