This commit is contained in:
@@ -0,0 +1,367 @@
|
||||
package reflectext
|
||||
|
||||
import (
|
||||
"reflect"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"go.mongodb.org/mongo-driver/v2/bson"
|
||||
)
|
||||
|
||||
func TestPSS_String(t *testing.T) {
|
||||
pss := PrimitiveStringSerializer{}
|
||||
|
||||
s, err := pss.ValueToString("hello")
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
if s != "hello" {
|
||||
t.Errorf("expected hello, got %q", s)
|
||||
}
|
||||
|
||||
v, err := pss.ValueFromString("world", reflect.TypeFor[string]())
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
if v.(string) != "world" {
|
||||
t.Errorf("expected world, got %v", v)
|
||||
}
|
||||
}
|
||||
|
||||
func TestPSS_Int(t *testing.T) {
|
||||
pss := PrimitiveStringSerializer{}
|
||||
|
||||
s, err := pss.ValueToString(42)
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
if s != "42" {
|
||||
t.Errorf("expected 42, got %q", s)
|
||||
}
|
||||
|
||||
v, err := pss.ValueFromString("42", reflect.TypeFor[int]())
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
if v.(int) != 42 {
|
||||
t.Errorf("expected 42, got %v", v)
|
||||
}
|
||||
}
|
||||
|
||||
func TestPSS_Int64(t *testing.T) {
|
||||
pss := PrimitiveStringSerializer{}
|
||||
|
||||
s, err := pss.ValueToString(int64(-100))
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
if s != "-100" {
|
||||
t.Errorf("expected -100, got %q", s)
|
||||
}
|
||||
|
||||
v, err := pss.ValueFromString("-100", reflect.TypeFor[int64]())
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
if v.(int64) != -100 {
|
||||
t.Errorf("expected -100, got %v", v)
|
||||
}
|
||||
}
|
||||
|
||||
func TestPSS_Uint(t *testing.T) {
|
||||
pss := PrimitiveStringSerializer{}
|
||||
|
||||
s, err := pss.ValueToString(uint(123))
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
if s != "123" {
|
||||
t.Errorf("expected 123, got %q", s)
|
||||
}
|
||||
|
||||
v, err := pss.ValueFromString("123", reflect.TypeFor[uint]())
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
if v.(uint) != 123 {
|
||||
t.Errorf("expected 123, got %v", v)
|
||||
}
|
||||
}
|
||||
|
||||
func TestPSS_Float(t *testing.T) {
|
||||
pss := PrimitiveStringSerializer{}
|
||||
|
||||
s, err := pss.ValueToString(3.14)
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
if s != "3.14" {
|
||||
t.Errorf("expected 3.14, got %q", s)
|
||||
}
|
||||
|
||||
v, err := pss.ValueFromString("3.14", reflect.TypeFor[float64]())
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
if v.(float64) != 3.14 {
|
||||
t.Errorf("expected 3.14, got %v", v)
|
||||
}
|
||||
}
|
||||
|
||||
func TestPSS_Float32(t *testing.T) {
|
||||
pss := PrimitiveStringSerializer{}
|
||||
|
||||
v, err := pss.ValueFromString("1.5", reflect.TypeFor[float32]())
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
if v.(float32) != 1.5 {
|
||||
t.Errorf("expected 1.5, got %v", v)
|
||||
}
|
||||
}
|
||||
|
||||
func TestPSS_Bool(t *testing.T) {
|
||||
pss := PrimitiveStringSerializer{}
|
||||
|
||||
s, err := pss.ValueToString(true)
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
if s != "true" {
|
||||
t.Errorf("expected true, got %q", s)
|
||||
}
|
||||
|
||||
s, err = pss.ValueToString(false)
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
if s != "false" {
|
||||
t.Errorf("expected false, got %q", s)
|
||||
}
|
||||
|
||||
v, err := pss.ValueFromString("true", reflect.TypeFor[bool]())
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
if v.(bool) != true {
|
||||
t.Errorf("expected true, got %v", v)
|
||||
}
|
||||
}
|
||||
|
||||
func TestPSS_BoolInvalid(t *testing.T) {
|
||||
pss := PrimitiveStringSerializer{}
|
||||
|
||||
_, err := pss.ValueFromString("notabool", reflect.TypeFor[bool]())
|
||||
if err == nil {
|
||||
t.Errorf("expected error for invalid bool")
|
||||
}
|
||||
}
|
||||
|
||||
func TestPSS_IntInvalid(t *testing.T) {
|
||||
pss := PrimitiveStringSerializer{}
|
||||
|
||||
_, err := pss.ValueFromString("notanint", reflect.TypeFor[int]())
|
||||
if err == nil {
|
||||
t.Errorf("expected error for invalid int")
|
||||
}
|
||||
}
|
||||
|
||||
func TestPSS_FloatInvalid(t *testing.T) {
|
||||
pss := PrimitiveStringSerializer{}
|
||||
|
||||
_, err := pss.ValueFromString("notafloat", reflect.TypeFor[float64]())
|
||||
if err == nil {
|
||||
t.Errorf("expected error for invalid float")
|
||||
}
|
||||
}
|
||||
|
||||
func TestPSS_Time(t *testing.T) {
|
||||
pss := PrimitiveStringSerializer{}
|
||||
|
||||
tm := time.Date(2023, 4, 5, 12, 30, 45, 0, time.UTC)
|
||||
s, err := pss.ValueToString(tm)
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
|
||||
v, err := pss.ValueFromString(s, reflect.TypeFor[time.Time]())
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
if !v.(time.Time).Equal(tm) {
|
||||
t.Errorf("expected %v, got %v", tm, v)
|
||||
}
|
||||
}
|
||||
|
||||
func TestPSS_TimeInvalid(t *testing.T) {
|
||||
pss := PrimitiveStringSerializer{}
|
||||
|
||||
_, err := pss.ValueFromString("not-a-time", reflect.TypeFor[time.Time]())
|
||||
if err == nil {
|
||||
t.Errorf("expected error for invalid time")
|
||||
}
|
||||
}
|
||||
|
||||
func TestPSS_ObjectID(t *testing.T) {
|
||||
pss := PrimitiveStringSerializer{}
|
||||
|
||||
oid := bson.NewObjectID()
|
||||
s, err := pss.ValueToString(oid)
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
if s != oid.Hex() {
|
||||
t.Errorf("expected %v, got %v", oid.Hex(), s)
|
||||
}
|
||||
|
||||
v, err := pss.ValueFromString(oid.Hex(), reflect.TypeFor[bson.ObjectID]())
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
if v.(bson.ObjectID) != oid {
|
||||
t.Errorf("expected %v, got %v", oid, v)
|
||||
}
|
||||
}
|
||||
|
||||
func TestPSS_ObjectIDInvalid(t *testing.T) {
|
||||
pss := PrimitiveStringSerializer{}
|
||||
|
||||
_, err := pss.ValueFromString("not-a-hex-id", reflect.TypeFor[bson.ObjectID]())
|
||||
if err == nil {
|
||||
t.Errorf("expected error for invalid object id")
|
||||
}
|
||||
}
|
||||
|
||||
func TestPSS_PointerNil(t *testing.T) {
|
||||
pss := PrimitiveStringSerializer{}
|
||||
|
||||
var p *int
|
||||
s, err := pss.ValueToString(p)
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
if s != "" {
|
||||
t.Errorf("expected empty string, got %q", s)
|
||||
}
|
||||
}
|
||||
|
||||
func TestPSS_PointerSet(t *testing.T) {
|
||||
pss := PrimitiveStringSerializer{}
|
||||
|
||||
x := 99
|
||||
p := &x
|
||||
s, err := pss.ValueToString(p)
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
if s != "99" {
|
||||
t.Errorf("expected 99, got %q", s)
|
||||
}
|
||||
}
|
||||
|
||||
func TestPSS_FromStringEmptyToPointer(t *testing.T) {
|
||||
pss := PrimitiveStringSerializer{}
|
||||
|
||||
v, err := pss.ValueFromString("", reflect.TypeFor[*int]())
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
pInt, ok := v.(*int)
|
||||
if !ok {
|
||||
t.Fatalf("expected *int, got %T", v)
|
||||
}
|
||||
if pInt != nil {
|
||||
t.Errorf("expected nil pointer, got %v", *pInt)
|
||||
}
|
||||
}
|
||||
|
||||
func TestPSS_FromStringPointer(t *testing.T) {
|
||||
pss := PrimitiveStringSerializer{}
|
||||
|
||||
v, err := pss.ValueFromString("55", reflect.TypeFor[*int]())
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
pInt, ok := v.(*int)
|
||||
if !ok {
|
||||
t.Fatalf("expected *int, got %T", v)
|
||||
}
|
||||
if pInt == nil || *pInt != 55 {
|
||||
t.Errorf("expected pointer to 55, got %v", pInt)
|
||||
}
|
||||
}
|
||||
|
||||
func TestPSS_FromStringEmptyToInt(t *testing.T) {
|
||||
pss := PrimitiveStringSerializer{}
|
||||
|
||||
v, err := pss.ValueFromString("", reflect.TypeFor[int]())
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
if v.(int) != 0 {
|
||||
t.Errorf("expected 0, got %v", v)
|
||||
}
|
||||
}
|
||||
|
||||
type psAliasInt int
|
||||
type psAliasString string
|
||||
|
||||
func TestPSS_AliasToString(t *testing.T) {
|
||||
pss := PrimitiveStringSerializer{}
|
||||
|
||||
v := psAliasInt(77)
|
||||
s, err := pss.ValueToString(v)
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
if s != "77" {
|
||||
t.Errorf("expected 77, got %q", s)
|
||||
}
|
||||
}
|
||||
|
||||
func TestPSS_AliasFromString(t *testing.T) {
|
||||
pss := PrimitiveStringSerializer{}
|
||||
|
||||
v, err := pss.ValueFromString("77", reflect.TypeFor[psAliasInt]())
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
if v.(psAliasInt) != psAliasInt(77) {
|
||||
t.Errorf("expected 77, got %v", v)
|
||||
}
|
||||
}
|
||||
|
||||
func TestPSS_AliasStringToString(t *testing.T) {
|
||||
pss := PrimitiveStringSerializer{}
|
||||
|
||||
v := psAliasString("hello")
|
||||
s, err := pss.ValueToString(v)
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
if s != "hello" {
|
||||
t.Errorf("expected hello, got %q", s)
|
||||
}
|
||||
}
|
||||
|
||||
func TestPSS_AliasStringFromString(t *testing.T) {
|
||||
pss := PrimitiveStringSerializer{}
|
||||
|
||||
v, err := pss.ValueFromString("hello", reflect.TypeFor[psAliasString]())
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
if v.(psAliasString) != psAliasString("hello") {
|
||||
t.Errorf("expected hello, got %v", v)
|
||||
}
|
||||
}
|
||||
|
||||
func TestPSS_UnknownTypeToString(t *testing.T) {
|
||||
pss := PrimitiveStringSerializer{}
|
||||
|
||||
type unknownStruct struct{ X int }
|
||||
_, err := pss.ValueToString(unknownStruct{X: 1})
|
||||
if err == nil {
|
||||
t.Errorf("expected error for unknown type")
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user