@@ -97,6 +97,60 @@ fn handle_incorrect_dates(error: &DeserializationError) -> bool {
9797    } 
9898} 
9999
100+ // Native type test, which expects value to have the display trait and be trivially copyable 
101+ async  fn  run_native_serialize_test < T > ( table_name :  & str ,  type_name :  & str ,  values :  Vec < Option < T > > ) 
102+ where 
103+     T :  SerializeValue 
104+         + DeserializeOwnedValue 
105+         + FromStr 
106+         + Debug 
107+         + Clone 
108+         + PartialEq 
109+         + Default 
110+         + Display 
111+         + Copy , 
112+ { 
113+     let  session = init_test ( table_name,  type_name) . await ; 
114+     tracing:: debug!( "Active keyspace: {}" ,  session. get_keyspace( ) . unwrap( ) ) ; 
115+ 
116+     for  original_value in  values { 
117+         session
118+             . query_unpaged ( 
119+                 format ! ( "INSERT INTO {} (id, val) VALUES (1, ?)" ,  table_name) , 
120+                 ( & original_value, ) , 
121+             ) 
122+             . await 
123+             . unwrap ( ) ; 
124+ 
125+         let  selected_value:  Vec < T >  = session
126+             . query_unpaged ( format ! ( "SELECT val FROM {}" ,  table_name) ,  & [ ] ) 
127+             . await 
128+             . unwrap ( ) 
129+             . into_rows_result ( ) 
130+             . unwrap ( ) 
131+             . rows :: < ( T , ) > ( ) 
132+             . unwrap ( ) 
133+             . map ( |row| match  row { 
134+                 Ok ( ( val, ) )  => val, 
135+                 Err ( e)  => handle_deserialize_error ( & e,  || T :: default ( ) ) , 
136+             } ) 
137+             . collect :: < Vec < _ > > ( ) ; 
138+ 
139+         for  value in  selected_value { 
140+             tracing:: debug!( 
141+                 "Received: {} | Expected: {}" , 
142+                 value, 
143+                 if  original_value. is_none( )  { 
144+                     T :: default ( ) 
145+                 }  else { 
146+                     original_value. unwrap( ) 
147+                 } 
148+             ) ; 
149+             assert_eq ! ( value,  original_value. unwrap_or( T :: default ( ) ) ) ; 
150+         } 
151+     } 
152+ } 
153+ 
100154// Test for types that either don't have the Display trait or foreign types from other libraries 
101155async  fn  run_foreign_serialize_test < T > ( table_name :  & str ,  type_name :  & str ,  values :  Vec < Option < T > > ) 
102156where 
@@ -277,6 +331,146 @@ async fn run_literal_input_maybe_empty_output_test<X>(
277331    } 
278332} 
279333
334+ // Scalar types 
335+ 
336+ #[ tokio:: test]  
337+ async  fn  test_serialize_deserialize_bigint ( )  { 
338+     setup_tracing ( ) ; 
339+     const  TABLE_NAME :  & str  = "bigint_serialization_test" ; 
340+ 
341+     let  test_cases = vec ! [ 
342+         Some ( i64 :: MIN ) , 
343+         Some ( i64 :: MAX ) , 
344+         Some ( 1 ) , 
345+         Some ( -1 ) , 
346+         Some ( 0 ) , 
347+         None , 
348+     ] ; 
349+ 
350+     run_native_serialize_test ( TABLE_NAME ,  "bigint" ,  test_cases) . await ; 
351+ } 
352+ 
353+ #[ tokio:: test]  
354+ async  fn  test_serialize_deserialize_int ( )  { 
355+     setup_tracing ( ) ; 
356+     const  TABLE_NAME :  & str  = "int_serialization_test" ; 
357+ 
358+     let  test_cases = vec ! [ 
359+         Some ( i32 :: MIN ) , 
360+         Some ( i32 :: MAX ) , 
361+         Some ( 1 ) , 
362+         Some ( -1 ) , 
363+         Some ( 0 ) , 
364+         None , 
365+     ] ; 
366+ 
367+     run_native_serialize_test ( TABLE_NAME ,  "int" ,  test_cases) . await ; 
368+ } 
369+ 
370+ #[ tokio:: test]  
371+ async  fn  test_serialize_deserialize_smallint ( )  { 
372+     setup_tracing ( ) ; 
373+     const  TABLE_NAME :  & str  = "smallint_serialization_test" ; 
374+ 
375+     let  test_cases = vec ! [ 
376+         Some ( i16 :: MIN ) , 
377+         Some ( i16 :: MAX ) , 
378+         Some ( 1 ) , 
379+         Some ( -1 ) , 
380+         Some ( 0 ) , 
381+         None , 
382+     ] ; 
383+ 
384+     run_native_serialize_test ( TABLE_NAME ,  "smallint" ,  test_cases) . await ; 
385+ } 
386+ 
387+ #[ tokio:: test]  
388+ async  fn  test_serialize_deserialize_tinyint ( )  { 
389+     setup_tracing ( ) ; 
390+     const  TABLE_NAME :  & str  = "tinyint_serialization_test" ; 
391+ 
392+     let  test_cases = vec ! [ 
393+         Some ( i8 :: MIN ) , 
394+         Some ( i8 :: MAX ) , 
395+         Some ( 1 ) , 
396+         Some ( -1 ) , 
397+         Some ( 0 ) , 
398+         None , 
399+     ] ; 
400+ 
401+     run_native_serialize_test ( TABLE_NAME ,  "tinyint" ,  test_cases) . await ; 
402+ } 
403+ 
404+ #[ tokio:: test]  
405+ async  fn  test_serialize_deserialize_float ( )  { 
406+     setup_tracing ( ) ; 
407+     const  TABLE_NAME :  & str  = "float_serialization_test" ; 
408+ 
409+     let  test_cases = vec ! [ 
410+         Some ( f32 :: MIN ) , 
411+         Some ( f32 :: MAX ) , 
412+         Some ( 1.0 ) , 
413+         Some ( -1.0 ) , 
414+         Some ( 0.0 ) , 
415+         None , 
416+     ] ; 
417+ 
418+     run_native_serialize_test ( TABLE_NAME ,  "float" ,  test_cases) . await ; 
419+ } 
420+ 
421+ #[ tokio:: test]  
422+ async  fn  test_serialize_deserialize_bool ( )  { 
423+     setup_tracing ( ) ; 
424+     const  TABLE_NAME :  & str  = "bool_serialization_test" ; 
425+ 
426+     let  test_cases = vec ! [ Some ( true ) ,  Some ( false ) ,  None ] ; 
427+ 
428+     run_native_serialize_test ( TABLE_NAME ,  "boolean" ,  test_cases) . await ; 
429+ } 
430+ 
431+ #[ tokio:: test]  
432+ async  fn  test_serialize_deserialize_double ( )  { 
433+     setup_tracing ( ) ; 
434+     const  TABLE_NAME :  & str  = "double_serialization_test" ; 
435+ 
436+     let  test_cases = vec ! [ 
437+         Some ( f64 :: MIN ) , 
438+         Some ( f64 :: MAX ) , 
439+         Some ( 1.0 ) , 
440+         Some ( -1.0 ) , 
441+         Some ( 0.0 ) , 
442+         None , 
443+     ] ; 
444+ 
445+     run_native_serialize_test ( TABLE_NAME ,  "double" ,  test_cases) . await ; 
446+ } 
447+ 
448+ #[ tokio:: test]  
449+ async  fn  test_serialize_deserialize_double_literal ( )  { 
450+     setup_tracing ( ) ; 
451+     const  TABLE_NAME :  & str  = "double_serialization_test" ; 
452+ 
453+     let  test_cases = [ f64:: MIN ,  f64:: MAX ,  1.0 ,  -1.0 ,  0.0 ,  0.1 ] 
454+         . iter ( ) 
455+         . map ( |val| ( val. to_string ( ) ,  * val) ) 
456+         . collect ( ) ; 
457+ 
458+     run_literal_and_bound_value_test ( TABLE_NAME ,  "double" ,  test_cases,  false ) . await ; 
459+ } 
460+ 
461+ #[ tokio:: test]  
462+ async  fn  test_serialize_deserialize_float_literal ( )  { 
463+     setup_tracing ( ) ; 
464+     const  TABLE_NAME :  & str  = "float_serialization_test" ; 
465+ 
466+     let  test_cases = [ f32:: MIN ,  f32:: MAX ,  1.0 ,  -1.0 ,  0.0 ,  0.1 ] 
467+         . iter ( ) 
468+         . map ( |val| ( val. to_string ( ) ,  * val) ) 
469+         . collect ( ) ; 
470+ 
471+     run_literal_and_bound_value_test ( TABLE_NAME ,  "float" ,  test_cases,  false ) . await ; 
472+ } 
473+ 
280474// Arbitrary precision types 
281475
282476#[ tokio:: test]  
@@ -1242,6 +1436,19 @@ async fn test_serialize_deserialize_offset_date_time_03_high_precision_rounding_
12421436
12431437//UUID Types 
12441438
1439+ #[ tokio:: test]  
1440+ async  fn  test_serialize_deserialize_uuid ( )  { 
1441+     setup_tracing ( ) ; 
1442+     const  TABLE_NAME :  & str  = "uuid_serialization_test" ; 
1443+ 
1444+     let  tests = ( 0 ..100 ) 
1445+         . map ( |_| uuid:: Uuid :: new_v4 ( ) ) 
1446+         . map ( |new_uuid| ( new_uuid. to_string ( ) ,  new_uuid) ) 
1447+         . collect ( ) ; 
1448+ 
1449+     run_literal_and_bound_value_test ( TABLE_NAME ,  "uuid" ,  tests,  false ) . await ; 
1450+ } 
1451+ 
12451452#[ tokio:: test]  
12461453async  fn  test_serialize_deserialize_timeuuid ( )  { 
12471454    setup_tracing ( ) ; 
@@ -1350,6 +1557,34 @@ async fn test_serialize_deserialize_timeuuid_ordering() {
13501557    } 
13511558} 
13521559
1560+ #[ tokio:: test]  
1561+ async  fn  test_serialize_deserialize_strings_varchar ( )  { 
1562+     let  table_name = "varchar_serialization_test" ; 
1563+ 
1564+     let  test_cases = vec ! [ 
1565+         ( "Hello, World!" ,  String :: from( "Hello, World!" ) ) , 
1566+         ( "Hello, Мир" ,  String :: from( "Hello, Мир" ) ) ,  // multi-byte string 
1567+         ( "🦀A🦀B🦀C" ,  String :: from( "🦀A🦀B🦀C" ) ) , 
1568+         ( "おはようございます" ,  String :: from( "おはようございます" ) ) , 
1569+     ] ; 
1570+ 
1571+     run_literal_and_bound_value_test ( table_name,  "varchar" ,  test_cases,  true ) . await ; 
1572+ } 
1573+ 
1574+ #[ tokio:: test]  
1575+ async  fn  test_serialize_deserialize_strings_ascii ( )  { 
1576+     let  table_name = "ascii_serialization_test" ; 
1577+ 
1578+     let  test_cases = vec ! [ 
1579+         ( "Hello, World!" ,  String :: from( "Hello, World!" ) ) , 
1580+         ( 
1581+             str :: from_utf8( & [ 0x0 ,  0x7f ] ) . unwrap( ) , 
1582+             String :: from_utf8( vec![ 0x0 ,  0x7f ] ) . unwrap( ) , 
1583+         ) ,  // min/max ASCII values 
1584+     ] ; 
1585+ 
1586+     run_literal_and_bound_value_test ( table_name,  "varchar" ,  test_cases,  true ) . await ; 
1587+ } 
13531588
13541589// UDT Types 
13551590
0 commit comments