@@ -1142,6 +1142,145 @@ func TestCastNumbers(t *testing.T) {
11421142 }
11431143}
11441144
1145+ func TestCastList (t * testing.T ) {
1146+ for _ , tt := range []struct {
1147+ v Value
1148+ dst interface {}
1149+ result interface {}
1150+ error bool
1151+ }{
1152+ {
1153+ v : ListValue (Int32Value (12 ), Int32Value (21 ), Int32Value (56 )),
1154+ dst : func (v []int64 ) * []int64 { return & v }([]int64 {}),
1155+ result : func (v []int64 ) * []int64 { return & v }([]int64 {12 , 21 , 56 }),
1156+ error : false ,
1157+ },
1158+ {
1159+ v : ListValue (Int32Value (12 ), Int32Value (21 ), Int32Value (56 )),
1160+ dst : func (v []int64 ) * []int64 { return & v }([]int64 {17 }),
1161+ result : func (v []int64 ) * []int64 { return & v }([]int64 {12 , 21 , 56 }),
1162+ error : false ,
1163+ },
1164+ {
1165+ v : ListValue (BytesValue ([]byte ("test" )), BytesValue ([]byte ("test2" ))),
1166+ dst : func (v []string ) * []string { return & v }([]string {}),
1167+ result : func (v []string ) * []string { return & v }([]string {"test" , "test2" }),
1168+ error : false ,
1169+ },
1170+ {
1171+ v : ListValue (BytesValue ([]byte ("test" )), BytesValue ([]byte ("test2" ))),
1172+ dst : func (v []string ) * []string { return & v }([]string {"list" }),
1173+ result : func (v []string ) * []string { return & v }([]string {"test" , "test2" }),
1174+ error : false ,
1175+ },
1176+ } {
1177+ t .Run (fmt .Sprintf ("%s→%v" , tt .v .Type ().Yql (), reflect .ValueOf (tt .dst ).Type ().Elem ()),
1178+ func (t * testing.T ) {
1179+ if err := CastTo (tt .v , tt .dst ); (err != nil ) != tt .error {
1180+ t .Errorf ("castTo() error = %v, want %v" , err , tt .error )
1181+ } else if ! reflect .DeepEqual (tt .dst , tt .result ) {
1182+ t .Errorf ("castTo() result = %+v, want %+v" ,
1183+ reflect .ValueOf (tt .dst ).Elem (),
1184+ reflect .ValueOf (tt .result ).Elem (),
1185+ )
1186+ }
1187+ },
1188+ )
1189+ }
1190+ }
1191+
1192+ func TestCastSet (t * testing.T ) {
1193+ for _ , tt := range []struct {
1194+ v Value
1195+ dst interface {}
1196+ result interface {}
1197+ error bool
1198+ }{
1199+ {
1200+ v : SetValue (Int32Value (12 ), Int32Value (21 ), Int32Value (56 )),
1201+ dst : func (v []int64 ) * []int64 { return & v }([]int64 {}),
1202+ result : func (v []int64 ) * []int64 { return & v }([]int64 {12 , 21 , 56 }),
1203+ error : false ,
1204+ },
1205+ {
1206+ v : SetValue (Int32Value (12 ), Int32Value (21 ), Int32Value (56 )),
1207+ dst : func (v []int64 ) * []int64 { return & v }([]int64 {17 }),
1208+ result : func (v []int64 ) * []int64 { return & v }([]int64 {12 , 21 , 56 }),
1209+ error : false ,
1210+ },
1211+ {
1212+ v : SetValue (BytesValue ([]byte ("test" )), BytesValue ([]byte ("test2" ))),
1213+ dst : func (v []string ) * []string { return & v }([]string {}),
1214+ result : func (v []string ) * []string { return & v }([]string {"test" , "test2" }),
1215+ error : false ,
1216+ },
1217+ {
1218+ v : SetValue (BytesValue ([]byte ("test" )), BytesValue ([]byte ("test2" ))),
1219+ dst : func (v []string ) * []string { return & v }([]string {"list" }),
1220+ result : func (v []string ) * []string { return & v }([]string {"test" , "test2" }),
1221+ error : false ,
1222+ },
1223+ } {
1224+ t .Run (fmt .Sprintf ("%s→%v" , tt .v .Type ().Yql (), reflect .ValueOf (tt .dst ).Type ().Elem ()),
1225+ func (t * testing.T ) {
1226+ if err := CastTo (tt .v , tt .dst ); (err != nil ) != tt .error {
1227+ t .Errorf ("castTo() error = %v, want %v" , err , tt .error )
1228+ } else if ! reflect .DeepEqual (tt .dst , tt .result ) {
1229+ t .Errorf ("castTo() result = %+v, want %+v" ,
1230+ reflect .ValueOf (tt .dst ).Elem (),
1231+ reflect .ValueOf (tt .result ).Elem (),
1232+ )
1233+ }
1234+ },
1235+ )
1236+ }
1237+ }
1238+
1239+ func TestCastStruct (t * testing.T ) {
1240+ type defaultStruct struct {
1241+ ID int32 `sql:"id"`
1242+ Str string `sql:"myStr"`
1243+ }
1244+ for _ , tt := range []struct {
1245+ v Value
1246+ dst interface {}
1247+ result interface {}
1248+ error bool
1249+ }{
1250+ {
1251+ v : StructValue (
1252+ StructValueField {Name : "id" , V : Int32Value (123 )},
1253+ StructValueField {Name : "myStr" , V : BytesValue ([]byte ("myStr123" ))},
1254+ ),
1255+ dst : func (v defaultStruct ) * defaultStruct { return & v }(defaultStruct {1 , "myStr1" }),
1256+ result : func (v defaultStruct ) * defaultStruct { return & v }(defaultStruct {123 , "myStr123" }),
1257+ error : false ,
1258+ },
1259+ {
1260+ v : StructValue (
1261+ StructValueField {Name : "id" , V : Int32Value (12 )},
1262+ StructValueField {Name : "myStr" , V : BytesValue ([]byte ("myStr12" ))},
1263+ ),
1264+ dst : func (v defaultStruct ) * defaultStruct { return & v }(defaultStruct {}),
1265+ result : func (v defaultStruct ) * defaultStruct { return & v }(defaultStruct {12 , "myStr12" }),
1266+ error : false ,
1267+ },
1268+ } {
1269+ t .Run (fmt .Sprintf ("%s→%v" , tt .v .Type ().Yql (), reflect .ValueOf (tt .dst ).Type ().Elem ()),
1270+ func (t * testing.T ) {
1271+ if err := CastTo (tt .v , tt .dst ); (err != nil ) != tt .error {
1272+ t .Errorf ("castTo() error = %v, want %v" , err , tt .error )
1273+ } else if ! reflect .DeepEqual (tt .dst , tt .result ) {
1274+ t .Errorf ("castTo() result = %+v, want %+v" ,
1275+ reflect .ValueOf (tt .dst ).Elem (),
1276+ reflect .ValueOf (tt .result ).Elem (),
1277+ )
1278+ }
1279+ },
1280+ )
1281+ }
1282+ }
1283+
11451284func TestCastOtherTypes (t * testing.T ) {
11461285 for _ , tt := range []struct {
11471286 v Value
0 commit comments