1
0
bind/type_test.go

279 lines
4.9 KiB
Go
Raw Normal View History

2025-08-27 21:03:25 +02:00
package bind_test
import (
"code.squareroundforest.org/arpio/bind"
"testing"
)
func TestTypeChecks(t *testing.T) {
t.Run("accepts scalar", func(t *testing.T) {
t.Run("bool", func(t *testing.T) {
if !bind.AcceptsScalar[bool]() {
t.Fatal()
}
})
t.Run("int", func(t *testing.T) {
if !bind.AcceptsScalar[int]() {
t.Fatal()
}
})
t.Run("uint", func(t *testing.T) {
if !bind.AcceptsScalar[uint]() {
t.Fatal()
}
})
t.Run("float", func(t *testing.T) {
if !bind.AcceptsScalar[int]() {
t.Fatal()
}
})
t.Run("string", func(t *testing.T) {
if !bind.AcceptsScalar[bool]() {
t.Fatal()
}
})
t.Run("any", func(t *testing.T) {
if !bind.AcceptsScalar[any]() {
t.Fatal()
}
})
t.Run("pointer", func(t *testing.T) {
type p *int
if !bind.AcceptsScalar[p]() {
t.Fatal()
}
})
t.Run("slice", func(t *testing.T) {
type s []int
if !bind.AcceptsScalar[s]() {
t.Fatal()
}
})
t.Run("pointer and slice combined", func(t *testing.T) {
type c *[]*[]int
if !bind.AcceptsScalar[c]() {
t.Fatal()
}
})
t.Run("struct", func(t *testing.T) {
type s struct{ Foo int }
if bind.AcceptsScalar[s]() {
t.Fatal()
}
})
t.Run("map", func(t *testing.T) {
if bind.AcceptsScalar[map[string]int]() {
t.Fatal()
}
})
t.Run("interface with methods", func(t *testing.T) {
type i interface{ Foo(int) }
if bind.AcceptsScalar[i]() {
t.Fatal()
}
})
t.Run("func", func(t *testing.T) {
if bind.AcceptsScalar[func(int)]() {
t.Fatal()
}
})
t.Run("chan", func(t *testing.T) {
if bind.AcceptsScalar[chan int]() {
t.Fatal()
}
})
})
t.Run("accepts fields", func(t *testing.T) {
t.Run("struct", func(t *testing.T) {
type s struct{ Foo int }
if !bind.AcceptsFields[s]() {
t.Fatal()
}
})
t.Run("map", func(t *testing.T) {
if !bind.AcceptsFields[map[string]int]() {
t.Fatal()
}
})
t.Run("map with interface fields", func(t *testing.T) {
if !bind.AcceptsFields[map[string]any]() {
t.Fatal()
}
})
t.Run("map with list fields", func(t *testing.T) {
if !bind.AcceptsFields[map[string][]int]() {
t.Fatal()
}
})
t.Run("pointer", func(t *testing.T) {
type p *struct{ Foo int }
if !bind.AcceptsFields[p]() {
t.Fatal()
}
})
t.Run("slice", func(t *testing.T) {
type s []struct{ Foo int }
if !bind.AcceptsFields[s]() {
t.Fatal()
}
})
t.Run("pointer and slice combined", func(t *testing.T) {
type c *[]*[]struct{ Foo int }
if !bind.AcceptsFields[c]() {
t.Fatal()
}
})
t.Run("wrong map key", func(t *testing.T) {
if bind.AcceptsFields[map[int]int]() {
t.Fatal()
}
})
t.Run("wrong map value", func(t *testing.T) {
if bind.AcceptsFields[map[string]struct{ Foo int }]() {
t.Fatal()
}
})
t.Run("scalar", func(t *testing.T) {
if bind.AcceptsFields[int]() {
t.Fatal()
}
})
t.Run("interface", func(t *testing.T) {
type i interface{ Foo(int) }
if bind.AcceptsFields[i]() {
t.Fatal()
}
})
t.Run("any type", func(t *testing.T) {
if bind.AcceptsFields[any]() {
t.Fatal()
}
})
t.Run("func", func(t *testing.T) {
if bind.AcceptsFields[func(int)]() {
t.Fatal()
}
})
t.Run("chan", func(t *testing.T) {
if bind.AcceptsFields[chan int]() {
t.Fatal()
}
})
})
t.Run("accepts list", func(t *testing.T) {
t.Run("scalars", func(t *testing.T) {
if !bind.AcceptsList[[]int]() {
t.Fatal()
}
})
t.Run("structs", func(t *testing.T) {
if !bind.AcceptsList[[]struct{ Foo int }]() {
t.Fatal()
}
})
t.Run("maps", func(t *testing.T) {
if !bind.AcceptsList[[]map[string]int]() {
t.Fatal()
}
})
t.Run("pointer to list", func(t *testing.T) {
if !bind.AcceptsList[*[]int]() {
t.Fatal()
}
})
t.Run("scalar", func(t *testing.T) {
if bind.AcceptsList[int]() {
t.Fatal()
}
})
t.Run("struct", func(t *testing.T) {
if bind.AcceptsList[struct{ Foo int }]() {
t.Fatal()
}
})
t.Run("map", func(t *testing.T) {
if bind.AcceptsList[map[string]int]() {
t.Fatal()
}
})
t.Run("map", func(t *testing.T) {
if bind.AcceptsList[map[string]int]() {
t.Fatal()
}
})
t.Run("struct pointer", func(t *testing.T) {
if bind.AcceptsList[*struct{ Foo int }]() {
t.Fatal()
}
})
t.Run("wrong elem type", func(t *testing.T) {
if bind.AcceptsList[map[string]struct{ Foo int }]() {
t.Fatal()
}
})
})
t.Run("bindable", func(t *testing.T) {
t.Run("scalar", func(t *testing.T) {
if !bind.Bindable[int]() {
t.Fatal()
}
})
t.Run("struct", func(t *testing.T) {
if !bind.Bindable[struct{ Foo int }]() {
t.Fatal()
}
})
t.Run("func", func(t *testing.T) {
if bind.Bindable[func()]() {
t.Fatal()
}
})
t.Run("chan", func(t *testing.T) {
if bind.Bindable[chan int]() {
t.Fatal()
}
})
})
}