github.com/jbendotnet/noms@v0.0.0-20190904222105-c43e4293ea92/go/merge/three_way_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/chunks" 11 "github.com/attic-labs/noms/go/types" 12 "github.com/stretchr/testify/assert" 13 "github.com/stretchr/testify/suite" 14 ) 15 16 type seq interface { 17 items() []interface{} 18 } 19 20 type ThreeWayMergeSuite struct { 21 suite.Suite 22 vs *types.ValueStore 23 create func(seq) types.Value 24 typeStr string 25 } 26 27 func (s *ThreeWayMergeSuite) SetupTest() { 28 storage := &chunks.MemoryStorage{} 29 s.vs = types.NewValueStore(storage.NewView()) 30 } 31 32 func (s *ThreeWayMergeSuite) TearDownTest() { 33 s.vs.Close() 34 } 35 36 func (s *ThreeWayMergeSuite) tryThreeWayMerge(a, b, p, exp seq) { 37 merged, err := ThreeWay(s.create(a), s.create(b), s.create(p), s.vs, nil, nil) 38 if s.NoError(err) { 39 expected := s.create(exp) 40 s.True(expected.Equals(merged), "%s != %s", types.EncodedValue(expected), types.EncodedValue(merged)) 41 } 42 } 43 44 func (s *ThreeWayMergeSuite) tryThreeWayConflict(a, b, p types.Value, contained string) { 45 m, err := ThreeWay(a, b, p, s.vs, nil, nil) 46 if s.Error(err) { 47 s.Contains(err.Error(), contained) 48 return 49 } 50 s.Fail("Expected error!", "Got successful merge: %s", types.EncodedValue(m)) 51 } 52 53 func valsToTypesValues(f func(seq) types.Value, items ...interface{}) []types.Value { 54 keyValues := []types.Value{} 55 for _, e := range items { 56 v := valToTypesValue(f, e) 57 keyValues = append(keyValues, v) 58 } 59 return keyValues 60 } 61 62 func valToTypesValue(f func(seq) types.Value, v interface{}) types.Value { 63 var v1 types.Value 64 switch t := v.(type) { 65 case string: 66 v1 = types.String(t) 67 case int: 68 v1 = types.Number(t) 69 case seq: 70 v1 = f(t) 71 case types.Value: 72 v1 = t 73 } 74 return v1 75 } 76 77 func TestThreeWayMerge_PrimitiveConflict(t *testing.T) { 78 threeWayConflict := func(a, b, p types.Value, contained string) { 79 mrgr := &merger{} 80 m, err := mrgr.threeWay(a, b, p, nil) 81 if assert.Error(t, err) { 82 assert.Contains(t, err.Error(), contained) 83 return 84 } 85 assert.Fail(t, "Expected error!", "Got successful merge: %s", types.EncodedValue(m)) 86 } 87 88 a, b, p := types.Number(7), types.String("nope"), types.String("parent") 89 90 threeWayConflict(a, b, p, "Number and String on top of") 91 threeWayConflict(b, a, p, "String and Number on top of") 92 }