2026-05-04 10:41:34 +08:00
|
|
|
package cast_test
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"testing"
|
|
|
|
|
"apigo.cc/go/cast"
|
|
|
|
|
)
|
|
|
|
|
|
2026-05-04 11:11:37 +08:00
|
|
|
func TestTo(t *testing.T) {
|
2026-05-04 10:41:34 +08:00
|
|
|
// Basic types
|
2026-05-04 11:11:37 +08:00
|
|
|
if v := cast.To[int]("123"); v != 123 {
|
|
|
|
|
t.Errorf("To[int] failed: %v", v)
|
2026-05-04 10:41:34 +08:00
|
|
|
}
|
2026-05-04 11:11:37 +08:00
|
|
|
if v := cast.To[int]("abc"); v != 0 {
|
|
|
|
|
t.Errorf("To[int] for invalid input should be 0, got %v", v)
|
2026-05-04 10:41:34 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Slice
|
2026-05-04 11:11:37 +08:00
|
|
|
s := cast.To[[]int]([]string{"1", "2", "3"})
|
|
|
|
|
if len(s) != 3 || s[0] != 1 || s[1] != 2 || s[2] != 3 {
|
|
|
|
|
t.Errorf("To[[]int] failed: %v", s)
|
2026-05-04 10:41:34 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Map
|
2026-05-04 11:11:37 +08:00
|
|
|
m := cast.To[map[string]int](map[string]string{"a": "1", "b": "2"})
|
|
|
|
|
if len(m) != 2 || m["a"] != 1 || m["b"] != 2 {
|
|
|
|
|
t.Errorf("To[map[string]int] failed: %v", m)
|
2026-05-04 10:41:34 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// JSON Auto conversion (Struct to String)
|
|
|
|
|
type User struct {
|
|
|
|
|
Name string `json:"name"`
|
|
|
|
|
}
|
|
|
|
|
u := User{Name: "Alice"}
|
2026-05-04 11:11:37 +08:00
|
|
|
js := cast.To[string](u)
|
|
|
|
|
if js != `{"name":"Alice"}` {
|
|
|
|
|
t.Errorf("To[string] for struct failed: %v", js)
|
2026-05-04 10:41:34 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// JSON Auto conversion (String to Struct)
|
2026-05-04 11:11:37 +08:00
|
|
|
u2 := cast.To[User](`{"name":"Bob"}`)
|
|
|
|
|
if u2.Name != "Bob" {
|
|
|
|
|
t.Errorf("To[User] from string failed: %v", u2)
|
2026-05-04 10:41:34 +08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2026-05-04 11:11:37 +08:00
|
|
|
func TestAsWrapper(t *testing.T) {
|
|
|
|
|
// As
|
|
|
|
|
if v := cast.As(123, nil); v != 123 {
|
|
|
|
|
t.Errorf("As failed: %v", v)
|
2026-05-04 10:52:15 +08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2026-05-04 10:41:34 +08:00
|
|
|
func TestMapSliceAPIs(t *testing.T) {
|
|
|
|
|
// ToMap
|
2026-05-04 11:24:07 +08:00
|
|
|
m := cast.As(cast.ToMap[string, int]([]any{"a", "1", "b", 2}))
|
2026-05-04 11:11:37 +08:00
|
|
|
if m["a"] != 1 || m["b"] != 2 {
|
|
|
|
|
t.Errorf("ToMap failed: %v", m)
|
2026-05-04 10:41:34 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ToSlice
|
2026-05-04 11:24:07 +08:00
|
|
|
s := cast.As(cast.ToSlice[int]([]string{"10", "20"}))
|
2026-05-04 11:11:37 +08:00
|
|
|
if len(s) != 2 || s[0] != 10 || s[1] != 20 {
|
|
|
|
|
t.Errorf("ToSlice failed: %v", s)
|
2026-05-04 10:41:34 +08:00
|
|
|
}
|
|
|
|
|
}
|