package dataext import ( "gogs.mikescher.com/BlackForestBytes/goext/langext" "gogs.mikescher.com/BlackForestBytes/goext/tst" "testing" ) func TestObjectMerge(t *testing.T) { type A struct { Field1 *int Field2 *string Field3 *float64 Field4 *bool OnlyA int64 DiffType int } type B struct { Field1 *int Field2 *string Field3 *float64 Field4 *bool OnlyB int64 DiffType string } valueA := A{ Field1: nil, Field2: langext.Ptr("99"), Field3: langext.Ptr(12.2), Field4: nil, OnlyA: 1, DiffType: 2, } valueB := B{ Field1: langext.Ptr(12), Field2: nil, Field3: langext.Ptr(13.2), Field4: nil, OnlyB: 1, DiffType: "X", } valueMerge := ObjectMerge(valueA, valueB) tst.AssertIdentPtrEqual(t, "Field1", valueMerge.Field1, valueB.Field1) tst.AssertIdentPtrEqual(t, "Field2", valueMerge.Field2, valueA.Field2) tst.AssertIdentPtrEqual(t, "Field3", valueMerge.Field3, valueB.Field3) tst.AssertIdentPtrEqual(t, "Field4", valueMerge.Field4, nil) } func assertPtrEqual[T1 comparable](t *testing.T, ident string, actual *T1, expected *T1) { if actual == nil && expected == nil { return } if actual != nil && expected != nil { if *actual != *expected { t.Errorf("[%s] values differ: Actual: '%v', Expected: '%v'", ident, *actual, *expected) } else { return } } if actual == nil && expected != nil { t.Errorf("[%s] values differ: Actual: nil, Expected: not-nil", ident) } if actual != nil && expected == nil { t.Errorf("[%s] values differ: Actual: not-nil, Expected: nil", ident) } }