12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- package sqlite3
- import (
- "errors"
- "math"
- "reflect"
- "testing"
- )
- func TestCallbackArgCast(t *testing.T) {
- intConv := callbackSyntheticForTests(reflect.ValueOf(int64(math.MaxInt64)), nil)
- floatConv := callbackSyntheticForTests(reflect.ValueOf(float64(math.MaxFloat64)), nil)
- errConv := callbackSyntheticForTests(reflect.Value{}, errors.New("test"))
- tests := []struct {
- f callbackArgConverter
- o reflect.Value
- }{
- {intConv, reflect.ValueOf(int8(-1))},
- {intConv, reflect.ValueOf(int16(-1))},
- {intConv, reflect.ValueOf(int32(-1))},
- {intConv, reflect.ValueOf(uint8(math.MaxUint8))},
- {intConv, reflect.ValueOf(uint16(math.MaxUint16))},
- {intConv, reflect.ValueOf(uint32(math.MaxUint32))},
- // Special case, int64->uint64 is only 1<<63 - 1, not 1<<64 - 1
- {intConv, reflect.ValueOf(uint64(math.MaxInt64))},
- {floatConv, reflect.ValueOf(float32(math.Inf(1)))},
- }
- for _, test := range tests {
- conv := callbackArgCast{test.f, test.o.Type()}
- val, err := conv.Run(nil)
- if err != nil {
- t.Errorf("Couldn't convert to %s: %s", test.o.Type(), err)
- } else if !reflect.DeepEqual(val.Interface(), test.o.Interface()) {
- t.Errorf("Unexpected result from converting to %s: got %v, want %v", test.o.Type(), val.Interface(), test.o.Interface())
- }
- }
- conv := callbackArgCast{errConv, reflect.TypeOf(int8(0))}
- _, err := conv.Run(nil)
- if err == nil {
- t.Errorf("Expected error during callbackArgCast, but got none")
- }
- }
- func TestCallbackConverters(t *testing.T) {
- tests := []struct {
- v interface{}
- err bool
- }{
- // Unfortunately, we can't tell which converter was returned,
- // but we can at least check which types can be converted.
- {[]byte{0}, false},
- {"text", false},
- {true, false},
- {int8(0), false},
- {int16(0), false},
- {int32(0), false},
- {int64(0), false},
- {uint8(0), false},
- {uint16(0), false},
- {uint32(0), false},
- {uint64(0), false},
- {int(0), false},
- {uint(0), false},
- {float64(0), false},
- {float32(0), false},
- {func() {}, true},
- {complex64(complex(0, 0)), true},
- {complex128(complex(0, 0)), true},
- {struct{}{}, true},
- {map[string]string{}, true},
- {[]string{}, true},
- {(*int8)(nil), true},
- {make(chan int), true},
- }
- for _, test := range tests {
- _, err := callbackArg(reflect.TypeOf(test.v))
- if test.err && err == nil {
- t.Errorf("Expected an error when converting %s, got no error", reflect.TypeOf(test.v))
- } else if !test.err && err != nil {
- t.Errorf("Expected converter when converting %s, got error: %s", reflect.TypeOf(test.v), err)
- }
- }
- for _, test := range tests {
- _, err := callbackRet(reflect.TypeOf(test.v))
- if test.err && err == nil {
- t.Errorf("Expected an error when converting %s, got no error", reflect.TypeOf(test.v))
- } else if !test.err && err != nil {
- t.Errorf("Expected converter when converting %s, got error: %s", reflect.TypeOf(test.v), err)
- }
- }
- }
|