test: 补上 addrOf 的测试覆盖

addrOf 是 unsafeptr.go 里唯一没有测试覆盖的函数。它的触发路径比较隐蔽:
interface 字段里装着一个 Accessor, 且它的 Raw() 返回**可寻址的非指针**值,
此时 fromReflect 才会走 CanAddr 分支。老实现 refx 的 Get 结果正是这种形态。

补测之后核心实现(rfx/typedesc/unsafeptr/path/generic)达到 100% 函数覆盖,
unsafe 代码逐个函数都有测试经过。
This commit is contained in:
2026-08-28 16:56:08 +08:00
parent 9cb3ea857e
commit e594e206f0
+37
View File
@@ -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)
}
}