test: 补上 addrOf 的测试覆盖
addrOf 是 unsafeptr.go 里唯一没有测试覆盖的函数。它的触发路径比较隐蔽: interface 字段里装着一个 Accessor, 且它的 Raw() 返回**可寻址的非指针**值, 此时 fromReflect 才会走 CanAddr 分支。老实现 refx 的 Get 结果正是这种形态。 补测之后核心实现(rfx/typedesc/unsafeptr/path/generic)达到 100% 函数覆盖, unsafe 代码逐个函数都有测试经过。
This commit is contained in:
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user