Files
marka/parser/utils/set_path_value_test.go
Max Richter c687eff53d big tings
2025-08-17 15:16:17 +02:00

133 lines
2.9 KiB
Go

package utils
import (
"fmt"
"reflect"
"testing"
)
func TestSetPathValue_SingleKey(t *testing.T) {
input := map[string]any{}
got := SetPathValue("name", "Max", input)
want := map[string]any{"name": "Max"}
if !reflect.DeepEqual(got, want) {
t.Fatalf("unexpected map.\n got: %#v\nwant: %#v", got, want)
}
}
func TestSetPathValue_DotSyntax(t *testing.T) {
input := map[string]any{}
meta := map[string]any{
"name": "Max",
}
got := SetPathValue(".", meta, input)
want := map[string]any{"name": "Max"}
fmt.Printf("%+v\n", got)
if !reflect.DeepEqual(got, want) {
t.Fatalf("unexpected map.\n got: %#v\nwant: %#v", got, want)
}
}
func TestSetPathValue_DotSyntaxString(t *testing.T) {
var input any
meta := "flour"
got := SetPathValue(".", meta, input)
want := "flour"
fmt.Printf("%+v\n", got)
if !reflect.DeepEqual(got, want) {
t.Fatalf("unexpected map.\n got: %#v\nwant: %#v", got, want)
}
}
func TestSetPathValue_NestedKeys_CreateMissingMaps(t *testing.T) {
input := map[string]any{}
got := SetPathValue("user.profile.name", "Max", input)
// Desired behavior: create nested maps and set the value.
// NOTE: If this test fails, your implementation likely isn't descending into nested maps.
want := map[string]any{
"user": map[string]any{
"profile": map[string]any{
"name": "Max",
},
},
}
if !reflect.DeepEqual(got, want) {
t.Fatalf("unexpected map for nested keys.\n got: %#v\nwant: %#v", got, want)
}
}
func TestSetPathValue_OverwriteExistingValue(t *testing.T) {
input := map[string]any{"foo": "old"}
got := SetPathValue("foo", "new", input)
want := map[string]any{"foo": "new"}
if !reflect.DeepEqual(got, want) {
t.Fatalf("unexpected map after overwrite.\n got: %#v\nwant: %#v", got, want)
}
}
func TestSetPathValue_PartiallyExistingPath(t *testing.T) {
input := map[string]any{
"user": map[string]any{
"profile": map[string]any{},
},
}
got := SetPathValue("user.profile.age", 28, input)
want := map[string]any{
"user": map[string]any{
"profile": map[string]any{
"age": 28,
},
},
}
if !reflect.DeepEqual(got, want) {
t.Fatalf("unexpected map with partially existing path.\n got: %#v\nwant: %#v", got, want)
}
}
func TestSetPathValue_EmptySegmentsAreIgnored(t *testing.T) {
input := map[string]any{}
got := SetPathValue("a..b", 1, input)
// Expected behavior (common-sense): treat empty segments as no-op and still set a.b = 1
want := map[string]any{
"a": map[string]any{
"b": 1,
},
}
if !reflect.DeepEqual(got, want) {
t.Fatalf("unexpected map with empty segments.\n got: %#v\nwant: %#v", got, want)
}
}
func TestSetPathValue_ComplexValueTypes(t *testing.T) {
input := map[string]any{}
val := []int{1, 2, 3}
got := SetPathValue("nums.list", val, input)
want := map[string]any{
"nums": map[string]any{
"list": []int{1, 2, 3},
},
}
if !reflect.DeepEqual(got, want) {
t.Fatalf("unexpected map with complex value types.\n got: %#v\nwant: %#v", got, want)
}
}