package models import ( "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func Test_Annotations(t *testing.T) { t.Run("Clone", func(t *testing.T) { src := Annotations{ "str": "string", "slice": []int{1, 2, 3}, "map": map[string]string{ "str": "string", }, "struct": struct { name string age int }{ name: "John", age: 30, }, "ptrStruct": &struct { name string age int }{ name: "John", age: 30, }, } dst, err := src.Clone() require.NoErrorf(t, err, "cloning annotations must not fail") assert.Equalf(t, src, dst, "cloned annotations must be equal") src["str"] = "new string" assert.Equalf(t, "string", dst["str"], "cloned annotations must be equal") src["ptrStruct"] = nil assert.NotNilf(t, dst["ptrStruct"], "cloned annotations must be equal") }) t.Run("Merge", func(t *testing.T) { left := Annotations{ "str": "string", "slice": []int{1, 2, 3}, "map": map[string]string{ "str": "string", }, "struct": struct { name string age int }{ name: "John", age: 30, }, "ptrStruct": &struct { name string age int }{ name: "John", age: 30, }, } right := Annotations{ "str": "string2", "slice": []int{3, 2, 1}, "map": map[string]string{ "str": "string2", }, "ptrStruct": &struct { name string age int }{ name: "John", age: 50, }, } result, err := left.Merge(right) require.NoError(t, err, "merging annotations must not fail") require.NotNil(t, result, "result must not be nil") expected := Annotations{ "str": "string2", "slice": []int{3, 2, 1}, "map": map[string]string{ "str": "string2", }, "struct": struct { name string age int }{ name: "John", age: 30, }, "ptrStruct": &struct { name string age int }{ name: "John", age: 50, }, } assert.Equalf(t, expected, result, "merged annotations must be equal") left["str"] = "new string" right["str"] = "new string2" assert.Equalf(t, expected["str"], result["str"], "updating source annotations must not affect the merged annotation") }) t.Run("GetInt", func(t *testing.T) { const value = "value" tests := []struct { name string annotations Annotations expectedValue int expectedOk bool }{ { name: "Int", annotations: Annotations{ value: 1, }, expectedValue: 1, expectedOk: true, }, { name: "Float64 - whole number", annotations: Annotations{ value: 1.0, }, expectedValue: 1, expectedOk: true, }, { name: "Float64", annotations: Annotations{ value: 1.5, }, expectedValue: 0, expectedOk: false, }, } for _, test := range tests { t.Run(test.name, func(t *testing.T) { val, ok := test.annotations.GetInt(value) assert.Equalf(t, test.expectedValue, val, "value must match") assert.Equalf(t, test.expectedOk, ok, "ok must match") }) } }) }