From e594e206f0176406c2aa8f61eb4b0cf294ede57f Mon Sep 17 00:00:00 2001 From: what Date: Fri, 28 Aug 2026 16:56:08 +0800 Subject: [PATCH] =?UTF-8?q?test:=20=E8=A1=A5=E4=B8=8A=20addrOf=20=E7=9A=84?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E8=A6=86=E7=9B=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit addrOf 是 unsafeptr.go 里唯一没有测试覆盖的函数。它的触发路径比较隐蔽: interface 字段里装着一个 Accessor, 且它的 Raw() 返回**可寻址的非指针**值, 此时 fromReflect 才会走 CanAddr 分支。老实现 refx 的 Get 结果正是这种形态。 补测之后核心实现(rfx/typedesc/unsafeptr/path/generic)达到 100% 函数覆盖, unsafe 代码逐个函数都有测试经过。 --- rfx_edge_test.go | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) 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) + } +}