feat: 完善 normalizeInputValue 支持 valuex.Accessor 并优化代码

- 在 valuex.Accessor 接口中添加 Raw() 方法
- normalizeInputValue 支持 valuex.Accessor 和 []valuex.Accessor 类型
- 提取 normalizeAccessorSlice 泛型函数消除重复代码
- 使用 switch 语句替代 if-else 链提高可读性
- 添加相关测试用例确保功能正确性
This commit is contained in:
2025-12-16 16:14:46 +08:00
parent 7d17293df3
commit baad0cadfc
4 changed files with 118 additions and 38 deletions

View File

@@ -2,7 +2,10 @@ package reflux
import (
"encoding/json"
"reflect"
"testing"
"git.fsdpf.net/go/reflux/valuex"
)
// 测试用的结构体
@@ -1422,3 +1425,53 @@ func TestSetValueChainWithCast(t *testing.T) {
t.Errorf("Expected Score to be 95.5, got %f", user.Score)
}
}
// TestNormalizeValuexAccessor 测试 normalizeInputValue 对 valuex.Accessor 的支持
func TestNormalizeValuexAccessor(t *testing.T) {
// 创建一个 R 实例
data := map[string]any{
"name": "Alice",
"age": 30,
}
r := New(data)
// 测试 valuex.Accessor 类型
rv, isPtr, err := normalizeInputValue(r)
if err != nil {
t.Fatalf("normalizeInputValue failed: %v", err)
}
if !isPtr {
t.Error("Expected isPtr to be true for valuex.Accessor")
}
if !rv.IsValid() {
t.Error("Expected valid reflect.Value")
}
}
// TestNormalizeValuexAccessorSlice 测试 normalizeInputValue 对 []valuex.Accessor 的支持
func TestNormalizeValuexAccessorSlice(t *testing.T) {
// 创建多个 R 实例
r1 := New(map[string]any{"id": 1, "name": "Alice"})
r2 := New(map[string]any{"id": 2, "name": "Bob"})
// 创建 []valuex.Accessor
slice := []valuex.Accessor{r1, r2}
// 测试 []valuex.Accessor 类型
rv, isPtr, err := normalizeInputValue(slice)
if err != nil {
t.Fatalf("normalizeInputValue failed: %v", err)
}
if !isPtr {
t.Error("Expected isPtr to be true for []valuex.Accessor")
}
if !rv.IsValid() {
t.Error("Expected valid reflect.Value")
}
if rv.Kind() != reflect.Slice {
t.Errorf("Expected Slice kind, got %v", rv.Kind())
}
if rv.Len() != 2 {
t.Errorf("Expected slice length 2, got %d", rv.Len())
}
}