@@ -413,13 +413,17 @@ impl Display for BuiltinDeserializationErrorKind {
413413
414414#[ cfg( test) ]
415415mod tests {
416+ use assert_matches:: assert_matches;
416417 use bytes:: Bytes ;
417418
419+ use crate :: frame:: frame_errors:: ParseError ;
418420 use crate :: frame:: response:: result:: { ColumnSpec , ColumnType } ;
421+ use crate :: types:: deserialize:: row:: BuiltinDeserializationErrorKind ;
419422 use crate :: types:: deserialize:: { DeserializationError , FrameSlice } ;
420423
421424 use super :: super :: tests:: { serialize_cells, spec} ;
422- use super :: { ColumnIterator , DeserializeRow } ;
425+ use super :: { BuiltinDeserializationError , ColumnIterator , CqlValue , DeserializeRow , Row } ;
426+ use super :: { BuiltinTypeCheckError , BuiltinTypeCheckErrorKind } ;
423427
424428 #[ test]
425429 fn test_tuple_deserialization ( ) {
@@ -513,4 +517,168 @@ mod tests {
513517 let iter = ColumnIterator :: new ( specs, slice) ;
514518 <R as DeserializeRow < ' frame > >:: deserialize ( iter)
515519 }
520+
521+ #[ track_caller]
522+ fn get_typck_err ( err : & DeserializationError ) -> & BuiltinTypeCheckError {
523+ match err. 0 . downcast_ref ( ) {
524+ Some ( err) => err,
525+ None => panic ! ( "not a BuiltinTypeCheckError: {:?}" , err) ,
526+ }
527+ }
528+
529+ #[ track_caller]
530+ fn get_deser_err ( err : & DeserializationError ) -> & BuiltinDeserializationError {
531+ match err. 0 . downcast_ref ( ) {
532+ Some ( err) => err,
533+ None => panic ! ( "not a BuiltinDeserializationError: {:?}" , err) ,
534+ }
535+ }
536+
537+ #[ test]
538+ fn test_tuple_errors ( ) {
539+ // Column type check failure
540+ {
541+ let col_name: & str = "i" ;
542+ let specs = & [ spec ( col_name, ColumnType :: Int ) ] ;
543+ let err = deserialize :: < ( i64 , ) > ( specs, & serialize_cells ( [ val_int ( 123 ) ] ) ) . unwrap_err ( ) ;
544+ let err = get_typck_err ( & err) ;
545+ assert_eq ! ( err. rust_name, std:: any:: type_name:: <( i64 , ) >( ) ) ;
546+ assert_eq ! (
547+ err. cql_types,
548+ specs
549+ . iter( )
550+ . map( |spec| spec. typ. clone( ) )
551+ . collect:: <Vec <_>>( )
552+ ) ;
553+ let BuiltinTypeCheckErrorKind :: ColumnTypeCheckFailed {
554+ column_index,
555+ column_name,
556+ err,
557+ } = & err. kind
558+ else {
559+ panic ! ( "unexpected error kind: {}" , err. kind)
560+ } ;
561+ assert_eq ! ( * column_index, 0 ) ;
562+ assert_eq ! ( column_name, col_name) ;
563+ let err = super :: super :: value:: tests:: get_typeck_err_inner ( err. 0 . as_ref ( ) ) ;
564+ assert_eq ! ( err. rust_name, std:: any:: type_name:: <i64 >( ) ) ;
565+ assert_eq ! ( err. cql_type, ColumnType :: Int ) ;
566+ assert_matches ! (
567+ & err. kind,
568+ super :: super :: value:: BuiltinTypeCheckErrorKind :: MismatchedType {
569+ expected: & [ ColumnType :: BigInt , ColumnType :: Counter ]
570+ }
571+ ) ;
572+ }
573+
574+ // Column deserialization failure
575+ {
576+ let col_name: & str = "i" ;
577+ let err = deserialize :: < ( i64 , ) > (
578+ & [ spec ( col_name, ColumnType :: BigInt ) ] ,
579+ & serialize_cells ( [ val_int ( 123 ) ] ) ,
580+ )
581+ . unwrap_err ( ) ;
582+ let err = get_deser_err ( & err) ;
583+ assert_eq ! ( err. rust_name, std:: any:: type_name:: <( i64 , ) >( ) ) ;
584+ let BuiltinDeserializationErrorKind :: ColumnDeserializationFailed {
585+ column_name,
586+ err,
587+ ..
588+ } = & err. kind
589+ else {
590+ panic ! ( "unexpected error kind: {}" , err. kind)
591+ } ;
592+ assert_eq ! ( column_name, col_name) ;
593+ let err = super :: super :: value:: tests:: get_deser_err ( err) ;
594+ assert_eq ! ( err. rust_name, std:: any:: type_name:: <i64 >( ) ) ;
595+ assert_eq ! ( err. cql_type, ColumnType :: BigInt ) ;
596+ assert_matches ! (
597+ err. kind,
598+ super :: super :: value:: BuiltinDeserializationErrorKind :: ByteLengthMismatch {
599+ expected: 8 ,
600+ got: 4
601+ }
602+ ) ;
603+ }
604+
605+ // Raw column deserialization failure
606+ {
607+ let col_name: & str = "i" ;
608+ let err = deserialize :: < ( i64 , ) > (
609+ & [ spec ( col_name, ColumnType :: BigInt ) ] ,
610+ & Bytes :: from_static ( b"alamakota" ) ,
611+ )
612+ . unwrap_err ( ) ;
613+ let err = get_deser_err ( & err) ;
614+ assert_eq ! ( err. rust_name, std:: any:: type_name:: <( i64 , ) >( ) ) ;
615+ let BuiltinDeserializationErrorKind :: RawColumnDeserializationFailed {
616+ column_index : _column_index,
617+ column_name,
618+ err : _err,
619+ } = & err. kind
620+ else {
621+ panic ! ( "unexpected error kind: {}" , err. kind)
622+ } ;
623+ assert_eq ! ( column_name, col_name) ;
624+ }
625+ }
626+
627+ #[ test]
628+ fn test_row_errors ( ) {
629+ // Column type check failure - happens never, because Row consists of CqlValues,
630+ // which accept all CQL types.
631+
632+ // Column deserialization failure
633+ {
634+ let col_name: & str = "i" ;
635+ let err = deserialize :: < Row > (
636+ & [ spec ( col_name, ColumnType :: BigInt ) ] ,
637+ & serialize_cells ( [ val_int ( 123 ) ] ) ,
638+ )
639+ . unwrap_err ( ) ;
640+ let err = get_deser_err ( & err) ;
641+ assert_eq ! ( err. rust_name, std:: any:: type_name:: <Row >( ) ) ;
642+ let BuiltinDeserializationErrorKind :: ColumnDeserializationFailed {
643+ column_index : _column_index,
644+ column_name,
645+ err,
646+ } = & err. kind
647+ else {
648+ panic ! ( "unexpected error kind: {}" , err. kind)
649+ } ;
650+ assert_eq ! ( column_name, col_name) ;
651+ let err = super :: super :: value:: tests:: get_deser_err ( err) ;
652+ assert_eq ! ( err. rust_name, std:: any:: type_name:: <CqlValue >( ) ) ;
653+ assert_eq ! ( err. cql_type, ColumnType :: BigInt ) ;
654+ let super :: super :: value:: BuiltinDeserializationErrorKind :: GenericParseError (
655+ ParseError :: BadIncomingData ( info) ,
656+ ) = & err. kind
657+ else {
658+ panic ! ( "unexpected error kind: {}" , err. kind)
659+ } ;
660+ assert_eq ! ( info, "Buffer length should be 8 not 4" ) ;
661+ }
662+
663+ // Raw column deserialization failure
664+ {
665+ let col_name: & str = "i" ;
666+ let err = deserialize :: < Row > (
667+ & [ spec ( col_name, ColumnType :: BigInt ) ] ,
668+ & Bytes :: from_static ( b"alamakota" ) ,
669+ )
670+ . unwrap_err ( ) ;
671+ let err = get_deser_err ( & err) ;
672+ assert_eq ! ( err. rust_name, std:: any:: type_name:: <Row >( ) ) ;
673+ let BuiltinDeserializationErrorKind :: RawColumnDeserializationFailed {
674+ column_index : _column_index,
675+ column_name,
676+ err : _err,
677+ } = & err. kind
678+ else {
679+ panic ! ( "unexpected error kind: {}" , err. kind)
680+ } ;
681+ assert_eq ! ( column_name, col_name) ;
682+ }
683+ }
516684}
0 commit comments