github.com/enbility/spine-go@v0.7.0/model/collection_operations_test.go (about)

     1  package model
     2  
     3  import (
     4  	"fmt"
     5  	"testing"
     6  
     7  	"github.com/enbility/spine-go/util"
     8  	"github.com/stretchr/testify/assert"
     9  )
    10  
    11  type testStruct struct {
    12  	Id         *uint `eebus:"key"`
    13  	Changeable *bool `eebus:"writecheck"`
    14  	Active     *bool
    15  	Data       *string
    16  }
    17  
    18  type testInvalidStruct struct {
    19  	Id         *uint   `eebus:"key"`
    20  	Changeable *string `eebus:"writecheck"`
    21  	Data       *string
    22  }
    23  
    24  func (r testStruct) HashKey() string {
    25  	return fmt.Sprintf("%d", r.Id)
    26  }
    27  
    28  func TestUnion_NewData(t *testing.T) {
    29  	existingData := []testStruct{
    30  		{Id: util.Ptr(uint(1)), Changeable: util.Ptr(true), Data: util.Ptr(string("data1"))},
    31  	}
    32  
    33  	newData := []testStruct{
    34  		{Id: util.Ptr(uint(2)), Data: util.Ptr(string("data2"))},
    35  	}
    36  
    37  	// Act
    38  	result, boolV := Merge(false, existingData, newData)
    39  	assert.True(t, boolV)
    40  
    41  	if assert.Equal(t, 2, len(result)) {
    42  		assert.Equal(t, 1, int(*result[0].Id))
    43  		assert.Equal(t, "data1", string(*result[0].Data))
    44  		assert.Equal(t, 2, int(*result[1].Id))
    45  		assert.Equal(t, "data2", string(*result[1].Data))
    46  	}
    47  }
    48  
    49  func TestUnion_NewAndUpdateData(t *testing.T) {
    50  	existingData := []testStruct{
    51  		{Id: util.Ptr(uint(0)), Changeable: util.Ptr(true), Active: util.Ptr(true), Data: util.Ptr(string("data1"))},
    52  		{Id: util.Ptr(uint(1)), Changeable: util.Ptr(true), Active: util.Ptr(false), Data: util.Ptr(string("data2"))},
    53  		{Id: util.Ptr(uint(2)), Changeable: util.Ptr(false), Active: util.Ptr(false), Data: util.Ptr(string("data3"))},
    54  		{Id: util.Ptr(uint(3)), Active: util.Ptr(true), Data: util.Ptr(string("data4"))},
    55  	}
    56  
    57  	newData := []testStruct{
    58  		{Id: util.Ptr(uint(1)), Changeable: util.Ptr(false), Active: util.Ptr(true), Data: util.Ptr(string("data22"))},
    59  		{Id: util.Ptr(uint(2)), Data: util.Ptr(string("data33"))},
    60  		{Id: util.Ptr(uint(3)), Data: util.Ptr(string("data44"))},
    61  	}
    62  
    63  	// Act
    64  	result, boolV := Merge(false, existingData, newData)
    65  	assert.True(t, boolV)
    66  
    67  	if assert.Equal(t, 4, len(result)) {
    68  		assert.Equal(t, 0, int(*result[0].Id))
    69  		assert.Equal(t, "data1", string(*result[0].Data))
    70  		assert.Equal(t, true, bool(*result[0].Active))
    71  		assert.Equal(t, 1, int(*result[1].Id))
    72  		assert.Equal(t, "data22", string(*result[1].Data))
    73  		assert.Equal(t, false, bool(*result[1].Changeable))
    74  		assert.Equal(t, true, bool(*result[1].Active))
    75  		assert.Equal(t, 2, int(*result[2].Id))
    76  		assert.Equal(t, "data33", string(*result[2].Data))
    77  		assert.Equal(t, false, bool(*result[2].Active))
    78  		assert.Equal(t, 3, int(*result[3].Id))
    79  		assert.Equal(t, "data44", string(*result[3].Data))
    80  		assert.Equal(t, true, bool(*result[3].Active))
    81  	}
    82  }
    83  
    84  func TestUnion_NewAndUpdateDataRemoteWrite(t *testing.T) {
    85  	existingData := []testStruct{
    86  		{Id: util.Ptr(uint(0)), Changeable: util.Ptr(true), Active: util.Ptr(true), Data: util.Ptr(string("data1"))},
    87  		{Id: util.Ptr(uint(1)), Changeable: util.Ptr(true), Active: util.Ptr(false), Data: util.Ptr(string("data2"))},
    88  		{Id: util.Ptr(uint(2)), Changeable: util.Ptr(false), Active: util.Ptr(false), Data: util.Ptr(string("data3"))},
    89  		{Id: util.Ptr(uint(3)), Active: util.Ptr(true), Data: util.Ptr(string("data4"))},
    90  	}
    91  
    92  	newData := []testStruct{
    93  		{Id: util.Ptr(uint(1)), Changeable: util.Ptr(false), Active: util.Ptr(true), Data: util.Ptr(string("data22"))},
    94  		{Id: util.Ptr(uint(2)), Data: util.Ptr(string("data33"))},
    95  		{Id: util.Ptr(uint(3)), Data: util.Ptr(string("data44"))},
    96  	}
    97  
    98  	// Act
    99  	result, boolV := Merge(true, existingData, newData)
   100  	assert.False(t, boolV)
   101  
   102  	if assert.Equal(t, 4, len(result)) {
   103  		assert.Equal(t, 0, int(*result[0].Id))
   104  		assert.Equal(t, "data1", string(*result[0].Data))
   105  		assert.Equal(t, true, bool(*result[0].Active))
   106  		assert.Equal(t, 1, int(*result[1].Id))
   107  		assert.Equal(t, "data22", string(*result[1].Data))
   108  		assert.Equal(t, true, bool(*result[1].Changeable))
   109  		assert.Equal(t, true, bool(*result[1].Active))
   110  		assert.Equal(t, 2, int(*result[2].Id))
   111  		assert.Equal(t, "data3", string(*result[2].Data))
   112  		assert.Equal(t, false, bool(*result[2].Active))
   113  		assert.Equal(t, 3, int(*result[3].Id))
   114  		assert.Equal(t, "data4", string(*result[3].Data))
   115  		assert.Equal(t, true, bool(*result[3].Active))
   116  	}
   117  }
   118  
   119  func TestUnion_InvalidData(t *testing.T) {
   120  	existingData := []testInvalidStruct{
   121  		{Id: util.Ptr(uint(0)), Changeable: util.Ptr("true"), Data: util.Ptr(string("data1"))},
   122  		{Id: util.Ptr(uint(1)), Changeable: util.Ptr("true"), Data: util.Ptr(string("data2"))},
   123  		{Id: util.Ptr(uint(2)), Changeable: util.Ptr("true"), Data: util.Ptr(string("data3"))},
   124  		{Id: util.Ptr(uint(3)), Data: util.Ptr(string("data4"))},
   125  	}
   126  
   127  	newData := []testInvalidStruct{
   128  		{Id: util.Ptr(uint(1)), Data: util.Ptr(string("data22"))},
   129  		{Id: util.Ptr(uint(2)), Data: util.Ptr(string("data33"))},
   130  		{Id: util.Ptr(uint(3)), Data: util.Ptr(string("data44"))},
   131  	}
   132  
   133  	// Act
   134  	result, boolV := Merge(true, existingData, newData)
   135  	assert.False(t, boolV)
   136  
   137  	if assert.Equal(t, 4, len(result)) {
   138  		assert.Equal(t, 0, int(*result[0].Id))
   139  		assert.Equal(t, "data1", string(*result[0].Data))
   140  		assert.Equal(t, 1, int(*result[1].Id))
   141  		assert.Equal(t, "data22", string(*result[1].Data))
   142  		assert.Equal(t, 2, int(*result[2].Id))
   143  		assert.Equal(t, "data33", string(*result[2].Data))
   144  		assert.Equal(t, 3, int(*result[3].Id))
   145  		assert.Equal(t, "data4", string(*result[3].Data))
   146  	}
   147  }