diff --git a/rfx_edge_test.go b/rfx_edge_test.go index c0530f2..7f8a174 100644 --- a/rfx_edge_test.go +++ b/rfx_edge_test.go @@ -297,3 +297,40 @@ func truncate(s string, n int) string { } return s } + +// addrOf 是 unsafeptr.go 里唯一一个此前没有测试覆盖的函数, 这里补上。 +// +// 触发路径: interface 字段里装着一个 Accessor, 且它的 Raw() 返回**可寻址的 +// 非指针** reflect.Value —— 此时 fromReflect 会走 rv.CanAddr() 分支调 addrOf。 +// 老实现 refx 的 Get 结果正是这种形态(字段值可寻址, 但不是指针)。 +func TestAddrOfPathViaAddressableAccessor(t *testing.T) { + type leaf struct{ Name string } + type holder struct{ Any any } + + src := &struct{ L leaf }{L: leaf{Name: "addressable"}} + // refx.Get 返回的 R, 其 Raw() 是可寻址的非指针值 + acc := newLegacy(src).Get("L") + if k := acc.Raw().Kind(); k != reflect.Struct { + t.Fatalf("前置条件不成立: Raw().Kind() = %v, 期望 Struct", k) + } + if !acc.Raw().CanAddr() { + t.Fatal("前置条件不成立: Raw() 应该是可寻址的") + } + + h := &holder{Any: acc} + r := New(h) + + if got := r.Get("Any", "Name").String(); got != "addressable" { + t.Fatalf("经可寻址 Accessor 取值 = %q, 期望 addressable", got) + } + // 与参照实现一致 + if want := newLegacy(&holder{Any: acc}).Get("Any", "Name").String(); want != "addressable" { + t.Fatalf("参照实现结果 = %q", want) + } + + // 可寻址意味着写回去能反映到原对象上 + r.Set("Any.Name", "changed") + if src.L.Name != "changed" { + t.Fatalf("经可寻址 Accessor 写入未落到原对象: %q", src.L.Name) + } +}