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 }