mirror of
https://github.com/projectcapsule/capsule.git
synced 2026-03-04 02:30:23 +00:00
184 lines
4.2 KiB
Go
184 lines
4.2 KiB
Go
// Copyright 2020-2026 Project Capsule Authors
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
package utils_test
|
|
|
|
import (
|
|
"reflect"
|
|
"testing"
|
|
|
|
. "github.com/onsi/gomega"
|
|
|
|
"github.com/projectcapsule/capsule/pkg/utils"
|
|
)
|
|
|
|
func TestMapMergeNoOverrite_AddsNonOverlapping(t *testing.T) {
|
|
dst := map[string]string{"a": "1"}
|
|
src := map[string]string{"b": "2"}
|
|
|
|
utils.MapMergeNoOverrite(dst, src)
|
|
|
|
if got, want := dst["a"], "1"; got != want {
|
|
t.Fatalf("dst[a] = %q, want %q", got, want)
|
|
}
|
|
if got, want := dst["b"], "2"; got != want {
|
|
t.Fatalf("dst[b] = %q, want %q", got, want)
|
|
}
|
|
if len(dst) != 2 {
|
|
t.Fatalf("len(dst) = %d, want 2", len(dst))
|
|
}
|
|
}
|
|
|
|
func TestMapMergeNoOverrite_DoesNotOverwriteExisting(t *testing.T) {
|
|
dst := map[string]string{"a": "1"}
|
|
src := map[string]string{"a": "X"} // overlapping key
|
|
|
|
utils.MapMergeNoOverrite(dst, src)
|
|
|
|
if got, want := dst["a"], "1"; got != want {
|
|
t.Fatalf("dst[a] overwritten: got %q, want %q", got, want)
|
|
}
|
|
}
|
|
|
|
func TestMapMergeNoOverrite_EmptySrc_NoChange(t *testing.T) {
|
|
dst := map[string]string{"a": "1"}
|
|
src := map[string]string{} // empty
|
|
|
|
before := make(map[string]string, len(dst))
|
|
for k, v := range dst {
|
|
before[k] = v
|
|
}
|
|
|
|
utils.MapMergeNoOverrite(dst, src)
|
|
|
|
if !reflect.DeepEqual(dst, before) {
|
|
t.Fatalf("dst changed with empty src: got %#v, want %#v", dst, before)
|
|
}
|
|
}
|
|
|
|
func TestMapMergeNoOverrite_NilSrc_NoChange(t *testing.T) {
|
|
dst := map[string]string{"a": "1"}
|
|
var src map[string]string // nil
|
|
|
|
before := make(map[string]string, len(dst))
|
|
for k, v := range dst {
|
|
before[k] = v
|
|
}
|
|
|
|
utils.MapMergeNoOverrite(dst, src)
|
|
|
|
if !reflect.DeepEqual(dst, before) {
|
|
t.Fatalf("dst changed with nil src: got %#v, want %#v", dst, before)
|
|
}
|
|
}
|
|
|
|
func TestMapMergeNoOverrite_Idempotent(t *testing.T) {
|
|
dst := map[string]string{"a": "1"}
|
|
src := map[string]string{"b": "2"}
|
|
|
|
utils.MapMergeNoOverrite(dst, src)
|
|
first := map[string]string{}
|
|
for k, v := range dst {
|
|
first[k] = v
|
|
}
|
|
|
|
// Call again; result should be identical
|
|
utils.MapMergeNoOverrite(dst, src)
|
|
|
|
if !reflect.DeepEqual(dst, first) {
|
|
t.Fatalf("non-idempotent merge: after second merge got %#v, want %#v", dst, first)
|
|
}
|
|
}
|
|
|
|
func TestMapMergeNoOverrite_NilDst_Panics(t *testing.T) {
|
|
defer func() {
|
|
if r := recover(); r == nil {
|
|
t.Fatalf("expected panic when dst is nil, but did not panic")
|
|
}
|
|
}()
|
|
|
|
var dst map[string]string // nil destination map
|
|
src := map[string]string{"a": "1"}
|
|
|
|
// Writing to a nil map panics; document current behavior via this test.
|
|
utils.MapMergeNoOverrite(dst, src)
|
|
}
|
|
|
|
func TestMapEqual(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
a map[string]string
|
|
b map[string]string
|
|
want bool
|
|
}{
|
|
{
|
|
name: "both nil => equal",
|
|
a: nil,
|
|
b: nil,
|
|
want: true,
|
|
},
|
|
{
|
|
name: "nil vs empty => equal (len==0 in both)",
|
|
a: nil,
|
|
b: map[string]string{},
|
|
want: true,
|
|
},
|
|
{
|
|
name: "empty vs nil => equal (len==0 in both)",
|
|
a: map[string]string{},
|
|
b: nil,
|
|
want: true,
|
|
},
|
|
{
|
|
name: "different lengths => not equal",
|
|
a: map[string]string{"a": "1"},
|
|
b: map[string]string{},
|
|
want: false,
|
|
},
|
|
{
|
|
name: "same length but missing key => not equal",
|
|
a: map[string]string{"a": "1"},
|
|
b: map[string]string{"b": "1"},
|
|
want: false,
|
|
},
|
|
{
|
|
name: "same keys but different value => not equal",
|
|
a: map[string]string{"a": "1"},
|
|
b: map[string]string{"a": "2"},
|
|
want: false,
|
|
},
|
|
{
|
|
name: "same keys and values => equal",
|
|
a: map[string]string{"a": "1", "b": "2"},
|
|
b: map[string]string{"b": "2", "a": "1"},
|
|
want: true,
|
|
},
|
|
{
|
|
name: "both empty => equal",
|
|
a: map[string]string{},
|
|
b: map[string]string{},
|
|
want: true,
|
|
},
|
|
{
|
|
name: "extra key on b (length differs) => not equal",
|
|
a: map[string]string{"a": "1"},
|
|
b: map[string]string{"a": "1", "b": "2"},
|
|
want: false,
|
|
},
|
|
{
|
|
name: "same length but b has different key (no overlap) => not equal",
|
|
a: map[string]string{"a": "1", "b": "2"},
|
|
b: map[string]string{"c": "1", "d": "2"},
|
|
want: false,
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
tt := tt
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
g := NewWithT(t)
|
|
g.Expect(utils.MapEqual(tt.a, tt.b)).To(Equal(tt.want))
|
|
})
|
|
}
|
|
}
|