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
|
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