mirror of https://github.com/dexidp/dex.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
97 lines
2.8 KiB
97 lines
2.8 KiB
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) |
|
} |
|
} |
|
}
|
|
|