@@ -78,6 +78,63 @@ fn assert_error_is_not_overflow_or_expected_non_null<T>(error: &DeserializationE
78
78
}
79
79
}
80
80
81
+ // Native type test, which expects value to have the display trait and be trivially copyable
82
+ async fn run_native_serialize_test < T > ( table_name : & str , type_name : & str , values : & [ Option < T > ] )
83
+ where
84
+ T : SerializeValue
85
+ + DeserializeOwnedValue
86
+ + FromStr
87
+ + Debug
88
+ + Clone
89
+ + PartialEq
90
+ + Default
91
+ + Display
92
+ + Copy ,
93
+ {
94
+ let session = prepare_test_table ( table_name, type_name, true ) . await ;
95
+ tracing:: debug!( "Active keyspace: {}" , session. get_keyspace( ) . unwrap( ) ) ;
96
+
97
+ for original_value in values {
98
+ session
99
+ . query_unpaged (
100
+ format ! ( "INSERT INTO {} (id, val) VALUES (1, ?)" , table_name) ,
101
+ ( & original_value, ) ,
102
+ )
103
+ . await
104
+ . unwrap ( ) ;
105
+
106
+ let selected_value: Vec < T > = session
107
+ . query_unpaged ( format ! ( "SELECT val FROM {}" , table_name) , & [ ] )
108
+ . await
109
+ . unwrap ( )
110
+ . into_rows_result ( )
111
+ . unwrap ( )
112
+ . rows :: < ( T , ) > ( )
113
+ . unwrap ( )
114
+ . map ( |row| match row {
115
+ Ok ( ( val, ) ) => val,
116
+ Err ( e) => {
117
+ assert_error_is_not_expected_non_null ( & e) ;
118
+ T :: default ( )
119
+ }
120
+ } )
121
+ . collect :: < Vec < _ > > ( ) ;
122
+
123
+ for value in selected_value {
124
+ tracing:: debug!(
125
+ "Received: {} | Expected: {}" ,
126
+ value,
127
+ if original_value. is_none( ) {
128
+ T :: default ( )
129
+ } else {
130
+ original_value. unwrap( )
131
+ }
132
+ ) ;
133
+ assert_eq ! ( value, original_value. unwrap_or( T :: default ( ) ) ) ;
134
+ }
135
+ }
136
+ }
137
+
81
138
// Test for types that either don't have the Display trait or foreign types from other libraries
82
139
async fn run_foreign_serialize_test < T > ( table_name : & str , type_name : & str , values : & [ Option < T > ] )
83
140
where
@@ -266,6 +323,146 @@ async fn run_literal_input_maybe_empty_output_test<X>(
266
323
}
267
324
}
268
325
326
+ // Scalar types
327
+
328
+ #[ tokio:: test]
329
+ async fn test_serialize_deserialize_bigint ( ) {
330
+ setup_tracing ( ) ;
331
+ const TABLE_NAME : & str = "bigint_serialization_test" ;
332
+
333
+ let test_cases = [
334
+ Some ( i64:: MIN ) ,
335
+ Some ( i64:: MAX ) ,
336
+ Some ( 1 ) ,
337
+ Some ( -1 ) ,
338
+ Some ( 0 ) ,
339
+ None ,
340
+ ] ;
341
+
342
+ run_native_serialize_test ( TABLE_NAME , "bigint" , & test_cases) . await ;
343
+ }
344
+
345
+ #[ tokio:: test]
346
+ async fn test_serialize_deserialize_int ( ) {
347
+ setup_tracing ( ) ;
348
+ const TABLE_NAME : & str = "int_serialization_test" ;
349
+
350
+ let test_cases = [
351
+ Some ( i32:: MIN ) ,
352
+ Some ( i32:: MAX ) ,
353
+ Some ( 1 ) ,
354
+ Some ( -1 ) ,
355
+ Some ( 0 ) ,
356
+ None ,
357
+ ] ;
358
+
359
+ run_native_serialize_test ( TABLE_NAME , "int" , & test_cases) . await ;
360
+ }
361
+
362
+ #[ tokio:: test]
363
+ async fn test_serialize_deserialize_smallint ( ) {
364
+ setup_tracing ( ) ;
365
+ const TABLE_NAME : & str = "smallint_serialization_test" ;
366
+
367
+ let test_cases = [
368
+ Some ( i16:: MIN ) ,
369
+ Some ( i16:: MAX ) ,
370
+ Some ( 1 ) ,
371
+ Some ( -1 ) ,
372
+ Some ( 0 ) ,
373
+ None ,
374
+ ] ;
375
+
376
+ run_native_serialize_test ( TABLE_NAME , "smallint" , & test_cases) . await ;
377
+ }
378
+
379
+ #[ tokio:: test]
380
+ async fn test_serialize_deserialize_tinyint ( ) {
381
+ setup_tracing ( ) ;
382
+ const TABLE_NAME : & str = "tinyint_serialization_test" ;
383
+
384
+ let test_cases = [
385
+ Some ( i8:: MIN ) ,
386
+ Some ( i8:: MAX ) ,
387
+ Some ( 1 ) ,
388
+ Some ( -1 ) ,
389
+ Some ( 0 ) ,
390
+ None ,
391
+ ] ;
392
+
393
+ run_native_serialize_test ( TABLE_NAME , "tinyint" , & test_cases) . await ;
394
+ }
395
+
396
+ #[ tokio:: test]
397
+ async fn test_serialize_deserialize_float ( ) {
398
+ setup_tracing ( ) ;
399
+ const TABLE_NAME : & str = "float_serialization_test" ;
400
+
401
+ let test_cases = [
402
+ Some ( f32:: MIN ) ,
403
+ Some ( f32:: MAX ) ,
404
+ Some ( 1.0 ) ,
405
+ Some ( -1.0 ) ,
406
+ Some ( 0.0 ) ,
407
+ None ,
408
+ ] ;
409
+
410
+ run_native_serialize_test ( TABLE_NAME , "float" , & test_cases) . await ;
411
+ }
412
+
413
+ #[ tokio:: test]
414
+ async fn test_serialize_deserialize_bool ( ) {
415
+ setup_tracing ( ) ;
416
+ const TABLE_NAME : & str = "bool_serialization_test" ;
417
+
418
+ let test_cases = [ Some ( true ) , Some ( false ) , None ] ;
419
+
420
+ run_native_serialize_test ( TABLE_NAME , "boolean" , & test_cases) . await ;
421
+ }
422
+
423
+ #[ tokio:: test]
424
+ async fn test_serialize_deserialize_double ( ) {
425
+ setup_tracing ( ) ;
426
+ const TABLE_NAME : & str = "double_serialization_test" ;
427
+
428
+ let test_cases = [
429
+ Some ( f64:: MIN ) ,
430
+ Some ( f64:: MAX ) ,
431
+ Some ( 1.0 ) ,
432
+ Some ( -1.0 ) ,
433
+ Some ( 0.0 ) ,
434
+ None ,
435
+ ] ;
436
+
437
+ run_native_serialize_test ( TABLE_NAME , "double" , & test_cases) . await ;
438
+ }
439
+
440
+ #[ tokio:: test]
441
+ async fn test_serialize_deserialize_double_literal ( ) {
442
+ setup_tracing ( ) ;
443
+ const TABLE_NAME : & str = "double_serialization_test" ;
444
+
445
+ let test_cases: Vec < ( String , f64 ) > = [ f64:: MIN , f64:: MAX , 1.0 , -1.0 , 0.0 , 0.1 ]
446
+ . iter ( )
447
+ . map ( |val| ( val. to_string ( ) , * val) )
448
+ . collect ( ) ;
449
+
450
+ run_literal_and_bound_value_test ( TABLE_NAME , "double" , test_cases. as_slice ( ) , false ) . await ;
451
+ }
452
+
453
+ #[ tokio:: test]
454
+ async fn test_serialize_deserialize_float_literal ( ) {
455
+ setup_tracing ( ) ;
456
+ const TABLE_NAME : & str = "float_serialization_test" ;
457
+
458
+ let test_cases: Vec < ( String , f32 ) > = [ f32:: MIN , f32:: MAX , 1.0 , -1.0 , 0.0 , 0.1 ]
459
+ . iter ( )
460
+ . map ( |val| ( val. to_string ( ) , * val) )
461
+ . collect ( ) ;
462
+
463
+ run_literal_and_bound_value_test ( TABLE_NAME , "float" , test_cases. as_slice ( ) , false ) . await ;
464
+ }
465
+
269
466
// Arbitrary precision types
270
467
271
468
#[ tokio:: test]
@@ -1222,6 +1419,19 @@ async fn test_serialize_deserialize_offset_date_time_03_high_precision_rounding_
1222
1419
1223
1420
//UUID Types
1224
1421
1422
+ #[ tokio:: test]
1423
+ async fn test_serialize_deserialize_uuid ( ) {
1424
+ setup_tracing ( ) ;
1425
+ const TABLE_NAME : & str = "uuid_serialization_test" ;
1426
+
1427
+ let tests: Vec < ( String , uuid:: Uuid ) > = ( 0 ..100 )
1428
+ . map ( |_| uuid:: Uuid :: new_v4 ( ) )
1429
+ . map ( |new_uuid| ( new_uuid. to_string ( ) , new_uuid) )
1430
+ . collect ( ) ;
1431
+
1432
+ run_literal_and_bound_value_test ( TABLE_NAME , "uuid" , tests. as_slice ( ) , false ) . await ;
1433
+ }
1434
+
1225
1435
#[ tokio:: test]
1226
1436
async fn test_serialize_deserialize_timeuuid ( ) {
1227
1437
setup_tracing ( ) ;
@@ -1330,6 +1540,35 @@ async fn test_serialize_deserialize_timeuuid_ordering() {
1330
1540
}
1331
1541
}
1332
1542
1543
+ #[ tokio:: test]
1544
+ async fn test_serialize_deserialize_strings_varchar ( ) {
1545
+ let table_name = "varchar_serialization_test" ;
1546
+
1547
+ let test_cases: Vec < ( & str , String ) > = vec ! [
1548
+ ( "Hello, World!" , String :: from( "Hello, World!" ) ) ,
1549
+ ( "Hello, Мир" , String :: from( "Hello, Мир" ) ) , // multi-byte string
1550
+ ( "🦀A🦀B🦀C" , String :: from( "🦀A🦀B🦀C" ) ) ,
1551
+ ( "おはようございます" , String :: from( "おはようございます" ) ) ,
1552
+ ] ;
1553
+
1554
+ run_literal_and_bound_value_test ( table_name, "varchar" , test_cases. as_slice ( ) , true ) . await ;
1555
+ }
1556
+
1557
+ #[ tokio:: test]
1558
+ async fn test_serialize_deserialize_strings_ascii ( ) {
1559
+ let table_name = "ascii_serialization_test" ;
1560
+
1561
+ let test_cases: Vec < ( & str , String ) > = vec ! [
1562
+ ( "Hello, World!" , String :: from( "Hello, World!" ) ) ,
1563
+ (
1564
+ str :: from_utf8( & [ 0x0 , 0x7f ] ) . unwrap( ) ,
1565
+ String :: from_utf8( vec![ 0x0 , 0x7f ] ) . unwrap( ) ,
1566
+ ) , // min/max ASCII values
1567
+ ] ;
1568
+
1569
+ run_literal_and_bound_value_test ( table_name, "varchar" , test_cases. as_slice ( ) , true ) . await ;
1570
+ }
1571
+
1333
1572
// UDT Types
1334
1573
1335
1574
#[ tokio:: test]
0 commit comments