github.com/ndau/noms@v1.0.5/go/merge/three_way_set_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/ndau/noms/go/types" 11 "github.com/stretchr/testify/suite" 12 ) 13 14 func TestThreeWaySetMerge(t *testing.T) { 15 suite.Run(t, &ThreeWaySetMergeSuite{}) 16 } 17 18 type items []interface{} 19 20 func (kv items) items() []interface{} { 21 return kv 22 } 23 24 type ThreeWaySetMergeSuite struct { 25 ThreeWayMergeSuite 26 } 27 28 func (s *ThreeWaySetMergeSuite) SetupSuite() { 29 s.create = func(i seq) (val types.Value) { 30 if i != nil { 31 keyValues := valsToTypesValues(s.create, i.items()...) 32 val = types.NewSet(s.vs, keyValues...) 33 } 34 return 35 } 36 s.typeStr = "Set" 37 } 38 39 var ( 40 flat = items{"a1", "a2", "a3", "a4"} 41 flatA = items{"a1", "a2", "a5", "a6"} 42 flatB = items{"a1", "a4", "a7", "a5"} 43 flatM = items{"a1", "a5", "a6", "a7"} 44 45 ss1 = items{} 46 ss1a = items{"k1", flatA, items{"a", 0}} 47 ss1b = items{"k1", items{"a", 0}, flatB} 48 ss1Merged = items{"k1", items{"a", 0}, flatA, flatB} 49 ) 50 51 func (s *ThreeWaySetMergeSuite) TestThreeWayMerge_DoNothing() { 52 s.tryThreeWayMerge(nil, nil, flat, flat) 53 } 54 55 func (s *ThreeWaySetMergeSuite) TestThreeWayMerge_Primitives() { 56 s.tryThreeWayMerge(flatA, flatB, flat, flatM) 57 s.tryThreeWayMerge(flatB, flatA, flat, flatM) 58 } 59 60 func (s *ThreeWaySetMergeSuite) TestThreeWayMerge_HandleEmpty() { 61 s.tryThreeWayMerge(ss1a, ss1b, ss1, ss1Merged) 62 s.tryThreeWayMerge(ss1b, ss1a, ss1, ss1Merged) 63 } 64 65 func (s *ThreeWaySetMergeSuite) TestThreeWayMerge_HandleNil() { 66 s.tryThreeWayMerge(ss1a, ss1b, nil, ss1Merged) 67 s.tryThreeWayMerge(ss1b, ss1a, nil, ss1Merged) 68 } 69 70 func (s *ThreeWaySetMergeSuite) TestThreeWayMerge_Refs() { 71 strRef := s.vs.WriteValue(types.NewStruct("Foo", types.StructData{"life": types.Number(42)})) 72 73 m := items{s.vs.WriteValue(s.create(flatA)), s.vs.WriteValue(s.create(flatB))} 74 ma := items{"r1", s.vs.WriteValue(s.create(flatA))} 75 mb := items{"r1", strRef, s.vs.WriteValue(s.create(flatA))} 76 mMerged := items{"r1", strRef, s.vs.WriteValue(s.create(flatA))} 77 78 s.tryThreeWayMerge(ma, mb, m, mMerged) 79 s.tryThreeWayMerge(mb, ma, m, mMerged) 80 } 81 82 func (s *ThreeWaySetMergeSuite) TestThreeWayMerge_ImmediateConflict() { 83 s.tryThreeWayConflict(types.NewMap(s.vs), s.create(ss1b), s.create(ss1), "Cannot merge Map<> with "+s.typeStr) 84 s.tryThreeWayConflict(s.create(ss1b), types.NewMap(s.vs), s.create(ss1), "Cannot merge "+s.typeStr) 85 }