@@ -3,6 +3,7 @@ package bind
33import (
44 "database/sql"
55 "database/sql/driver"
6+ "reflect"
67 "testing"
78 "time"
89
@@ -783,19 +784,82 @@ func TestAsUUID(t *testing.T) {
783784 })
784785}
785786
786- func BenchmarkNoCastUUID (b * testing.B ) {
787+ func asUUIDForceTypeCast (v interface {}) (value.Value , bool ) {
788+ return value .Uuid (v .(uuid.UUID )), true
789+ }
790+
791+ func BenchmarkAsUUIDForceTypeCast (b * testing.B ) {
787792 b .ReportAllocs ()
788793 for i := 0 ; i < b .N ; i ++ {
789- v := & uuid.UUID {1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 }
790- require .Equal (b , & uuid.UUID {1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 }, v )
794+ v , ok := asUUIDForceTypeCast (srcUUID )
795+ require .True (b , ok )
796+ require .Equal (b , expUUIDValue , v )
791797 }
792798}
793799
794800func BenchmarkAsUUID (b * testing.B ) {
795801 b .ReportAllocs ()
796802 for i := 0 ; i < b .N ; i ++ {
797- v , ok := asUUID (uuid.UUID {1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 })
803+ v , ok := asUUID (srcUUID )
804+ require .True (b , ok )
805+ require .Equal (b , expUUIDValue , v )
806+ }
807+ }
808+
809+ var (
810+ uuidType = reflect .TypeOf (uuid.UUID {})
811+ uuidPtrType = reflect .TypeOf (& uuid.UUID {})
812+ srcUUID = uuid.UUID {1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 }
813+ expUUIDValue = value .Uuid (uuid.UUID {1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 })
814+ )
815+
816+ func asUUIDUsingReflect (v interface {}) (value.Value , bool ) {
817+ switch reflect .TypeOf (v ) {
818+ case uuidType :
819+ return value .Uuid (v .(uuid.UUID )), true
820+ case uuidPtrType :
821+ if v == nil {
822+ return value .NullValue (types .TypeUUID ), false
823+ }
824+
825+ return value .OptionalValue (value .Uuid (* (v .(* uuid.UUID )))), true
826+ }
827+
828+ return nil , false
829+ }
830+
831+ func TestAsUUIDUsingReflect (t * testing.T ) {
832+ t .Run ("Valid" , func (t * testing.T ) {
833+ t .Run ("uuid.UUID" , func (t * testing.T ) {
834+ v , ok := asUUIDUsingReflect (srcUUID )
835+ require .True (t , ok )
836+ require .Equal (t , expUUIDValue , v )
837+ })
838+ t .Run ("*uuid.UUID" , func (t * testing.T ) {
839+ v , ok := asUUIDUsingReflect (& srcUUID )
840+ require .True (t , ok )
841+ require .Equal (t , value .OptionalValue (expUUIDValue ), v )
842+ })
843+ })
844+ t .Run ("Invalid" , func (t * testing.T ) {
845+ t .Run ("[16]byte" , func (t * testing.T ) {
846+ v , ok := asUUIDUsingReflect (([16 ]byte )(srcUUID ))
847+ require .False (t , ok )
848+ require .Nil (t , v )
849+ })
850+ t .Run ("*[16]byte" , func (t * testing.T ) {
851+ v , ok := asUUIDUsingReflect ((* [16 ]byte )(& srcUUID ))
852+ require .False (t , ok )
853+ require .Nil (t , v )
854+ })
855+ })
856+ }
857+
858+ func BenchmarkAsUUIDUsingReflect (b * testing.B ) {
859+ b .ReportAllocs ()
860+ for i := 0 ; i < b .N ; i ++ {
861+ v , ok := asUUIDUsingReflect (srcUUID )
798862 require .True (b , ok )
799- require .Equal (b , & uuid. UUID { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 } , v )
863+ require .Equal (b , expUUIDValue , v )
800864 }
801865}
0 commit comments