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 }