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  }