cast/semantic_test.go

92 lines
2.2 KiB
Go
Raw Normal View History

package cast_test
import (
"testing"
"apigo.cc/go/cast"
)
func TestToAs(t *testing.T) {
// Basic types
if v, err := cast.To[int]("123"); err != nil || v != 123 {
t.Errorf("To[int] failed: %v, %v", v, err)
}
if v := cast.As[int]("123"); v != 123 {
t.Errorf("As[int] failed: %v", v)
}
if v := cast.As[int]("abc"); v != 0 {
t.Errorf("As[int] for invalid input should be 0, got %v", v)
}
// Slice
s, err := cast.To[[]int]([]string{"1", "2", "3"})
if err != nil || len(s) != 3 || s[0] != 1 || s[1] != 2 || s[2] != 3 {
t.Errorf("To[[]int] failed: %v, %v", s, err)
}
// Map
m, err := cast.To[map[string]int](map[string]string{"a": "1", "b": "2"})
if err != nil || len(m) != 2 || m["a"] != 1 || m["b"] != 2 {
t.Errorf("To[map[string]int] failed: %v, %v", m, err)
}
// JSON Auto conversion (Struct to String)
type User struct {
Name string `json:"name"`
}
u := User{Name: "Alice"}
js, err := cast.To[string](u)
if err != nil || js != `{"name":"Alice"}` {
t.Errorf("To[string] for struct failed: %v, %v", js, err)
}
// JSON Auto conversion (String to Struct)
u2, err := cast.To[User](`{"name":"Bob"}`)
if err != nil || u2.Name != "Bob" {
t.Errorf("To[User] from string failed: %v, %v", u2, err)
}
}
func TestQuietMust(t *testing.T) {
// Quiet
if v := cast.Quiet(cast.To[int]("abc")); v != 0 {
t.Errorf("Quiet failed: %v", v)
}
if v := cast.Quiet(cast.To[int]("123")); v != 123 {
t.Errorf("Quiet failed: %v", v)
}
// Must
defer func() {
if r := recover(); r == nil {
t.Errorf("Must should panic on error")
}
}()
cast.Must(cast.To[int]("abc"))
}
func TestMapSliceAPIs(t *testing.T) {
// ToMap
m, err := cast.ToMap[string, int]([]any{"a", "1", "b", 2})
if err != nil || m["a"] != 1 || m["b"] != 2 {
t.Errorf("ToMap failed: %v, %v", m, err)
}
// As[map...]
m2 := cast.As[map[string]int]([]any{"c", "3"})
if m2["c"] != 3 {
t.Errorf("As[map] failed: %v", m2)
}
// ToSlice
s, err := cast.ToSlice[int]([]string{"10", "20"})
if err != nil || len(s) != 2 || s[0] != 10 || s[1] != 20 {
t.Errorf("ToSlice failed: %v, %v", s, err)
}
// As[[]...]
s2 := cast.As[[]string]([]int{1, 2})
if len(s2) != 2 || s2[0] != "1" || s2[1] != "2" {
t.Errorf("As[[]string] failed: %v", s2)
}
}