@@ -1374,6 +1374,195 @@ pub unsafe extern "C" fn cass_result_paging_state_token(
13741374 CassError :: CASS_OK
13751375}
13761376
1377+ #[ cfg( test) ]
1378+ mod tests {
1379+ use std:: { ffi:: c_char, ptr:: addr_of_mut, sync:: Arc } ;
1380+
1381+ use scylla:: {
1382+ frame:: response:: result:: { ColumnSpec , ColumnType , CqlValue , Row , TableSpec } ,
1383+ transport:: PagingStateResponse ,
1384+ } ;
1385+
1386+ use crate :: {
1387+ cass_error:: CassError ,
1388+ cass_types:: { CassDataType , CassValueType } ,
1389+ query_result:: {
1390+ cass_result_column_data_type, cass_result_column_name, cass_result_first_row,
1391+ ptr_to_cstr_n, ptr_to_ref, size_t,
1392+ } ,
1393+ session:: create_cass_rows_from_rows,
1394+ } ;
1395+
1396+ use super :: { cass_result_column_count, cass_result_column_type, CassResult , CassResultData } ;
1397+
1398+ fn col_spec ( name : & str , typ : ColumnType ) -> ColumnSpec {
1399+ ColumnSpec {
1400+ table_spec : TableSpec :: borrowed ( "ks" , "tbl" ) ,
1401+ name : name. to_string ( ) ,
1402+ typ,
1403+ }
1404+ }
1405+
1406+ const FIRST_COLUMN_NAME : & str = "bigint_col" ;
1407+ const SECOND_COLUMN_NAME : & str = "varint_col" ;
1408+ const THIRD_COLUMN_NAME : & str = "list_double_col" ;
1409+ fn create_cass_rows_result ( ) -> CassResult {
1410+ let metadata = Arc :: new ( CassResultData :: from_result_payload (
1411+ PagingStateResponse :: NoMorePages ,
1412+ vec ! [
1413+ col_spec( FIRST_COLUMN_NAME , ColumnType :: BigInt ) ,
1414+ col_spec( SECOND_COLUMN_NAME , ColumnType :: Varint ) ,
1415+ col_spec(
1416+ THIRD_COLUMN_NAME ,
1417+ ColumnType :: List ( Box :: new( ColumnType :: Double ) ) ,
1418+ ) ,
1419+ ] ,
1420+ None ,
1421+ ) ) ;
1422+
1423+ let rows = create_cass_rows_from_rows (
1424+ Some ( vec ! [ Row {
1425+ columns: vec![
1426+ Some ( CqlValue :: BigInt ( 42 ) ) ,
1427+ None ,
1428+ Some ( CqlValue :: List ( vec![
1429+ CqlValue :: Float ( 0.5 ) ,
1430+ CqlValue :: Float ( 42.42 ) ,
1431+ CqlValue :: Float ( 9999.9999 ) ,
1432+ ] ) ) ,
1433+ ] ,
1434+ } ] ) ,
1435+ & metadata,
1436+ ) ;
1437+
1438+ CassResult { rows, metadata }
1439+ }
1440+
1441+ unsafe fn cass_result_column_name_rust_str (
1442+ result_ptr : * const CassResult ,
1443+ column_index : u64 ,
1444+ ) -> Option < & ' static str > {
1445+ let mut name_ptr: * const c_char = std:: ptr:: null ( ) ;
1446+ let mut name_length: size_t = 0 ;
1447+ let cass_err = cass_result_column_name (
1448+ result_ptr,
1449+ column_index,
1450+ addr_of_mut ! ( name_ptr) ,
1451+ addr_of_mut ! ( name_length) ,
1452+ ) ;
1453+ assert_eq ! ( CassError :: CASS_OK , cass_err) ;
1454+ ptr_to_cstr_n ( name_ptr, name_length)
1455+ }
1456+
1457+ #[ test]
1458+ fn rows_cass_result_api_test ( ) {
1459+ let result = create_cass_rows_result ( ) ;
1460+
1461+ unsafe {
1462+ let result_ptr = std:: ptr:: addr_of!( result) ;
1463+
1464+ // cass_result_column_count test
1465+ {
1466+ let column_count = cass_result_column_count ( result_ptr) ;
1467+ assert_eq ! ( 3 , column_count) ;
1468+ }
1469+
1470+ // cass_result_column_name test
1471+ {
1472+ let first_column_name = cass_result_column_name_rust_str ( result_ptr, 0 ) . unwrap ( ) ;
1473+ assert_eq ! ( FIRST_COLUMN_NAME , first_column_name) ;
1474+ let second_column_name = cass_result_column_name_rust_str ( result_ptr, 1 ) . unwrap ( ) ;
1475+ assert_eq ! ( SECOND_COLUMN_NAME , second_column_name) ;
1476+ let third_column_name = cass_result_column_name_rust_str ( result_ptr, 2 ) . unwrap ( ) ;
1477+ assert_eq ! ( THIRD_COLUMN_NAME , third_column_name) ;
1478+ }
1479+
1480+ // cass_result_column_type test
1481+ {
1482+ let first_col_type = cass_result_column_type ( result_ptr, 0 ) ;
1483+ assert_eq ! ( CassValueType :: CASS_VALUE_TYPE_BIGINT , first_col_type) ;
1484+ let second_col_type = cass_result_column_type ( result_ptr, 1 ) ;
1485+ assert_eq ! ( CassValueType :: CASS_VALUE_TYPE_VARINT , second_col_type) ;
1486+ let third_col_type = cass_result_column_type ( result_ptr, 2 ) ;
1487+ assert_eq ! ( CassValueType :: CASS_VALUE_TYPE_LIST , third_col_type) ;
1488+ let out_of_bound_col_type = cass_result_column_type ( result_ptr, 555 ) ;
1489+ assert_eq ! (
1490+ CassValueType :: CASS_VALUE_TYPE_UNKNOWN ,
1491+ out_of_bound_col_type
1492+ ) ;
1493+ }
1494+
1495+ // cass_result_column_data_type test
1496+ {
1497+ let first_col_data_type = ptr_to_ref ( cass_result_column_data_type ( result_ptr, 0 ) ) ;
1498+ assert_eq ! (
1499+ & CassDataType :: Value ( CassValueType :: CASS_VALUE_TYPE_BIGINT ) ,
1500+ first_col_data_type
1501+ ) ;
1502+ let second_col_data_type = ptr_to_ref ( cass_result_column_data_type ( result_ptr, 1 ) ) ;
1503+ assert_eq ! (
1504+ & CassDataType :: Value ( CassValueType :: CASS_VALUE_TYPE_VARINT ) ,
1505+ second_col_data_type
1506+ ) ;
1507+ let third_col_data_type = ptr_to_ref ( cass_result_column_data_type ( result_ptr, 2 ) ) ;
1508+ assert_eq ! (
1509+ & CassDataType :: List {
1510+ typ: Some ( Arc :: new( CassDataType :: Value (
1511+ CassValueType :: CASS_VALUE_TYPE_DOUBLE
1512+ ) ) ) ,
1513+ frozen: false
1514+ } ,
1515+ third_col_data_type
1516+ ) ;
1517+ let out_of_bound_col_data_type = cass_result_column_data_type ( result_ptr, 555 ) ;
1518+ assert ! ( out_of_bound_col_data_type. is_null( ) ) ;
1519+ }
1520+ }
1521+ }
1522+
1523+ fn create_non_rows_cass_result ( ) -> CassResult {
1524+ let metadata = Arc :: new ( CassResultData :: from_result_payload (
1525+ PagingStateResponse :: NoMorePages ,
1526+ vec ! [ ] ,
1527+ None ,
1528+ ) ) ;
1529+ CassResult {
1530+ rows : None ,
1531+ metadata,
1532+ }
1533+ }
1534+
1535+ #[ test]
1536+ fn non_rows_cass_result_api_test ( ) {
1537+ let result = create_non_rows_cass_result ( ) ;
1538+
1539+ // Check that API functions do not panic when rows are empty - e.g. for INSERT queries.
1540+ unsafe {
1541+ let result_ptr = std:: ptr:: addr_of!( result) ;
1542+
1543+ assert_eq ! ( 0 , cass_result_column_count( result_ptr) ) ;
1544+ assert_eq ! (
1545+ CassValueType :: CASS_VALUE_TYPE_UNKNOWN ,
1546+ cass_result_column_type( result_ptr, 0 )
1547+ ) ;
1548+ assert ! ( cass_result_column_data_type( result_ptr, 0 ) . is_null( ) ) ;
1549+ assert ! ( cass_result_first_row( result_ptr) . is_null( ) ) ;
1550+
1551+ {
1552+ let mut name_ptr: * const c_char = std:: ptr:: null ( ) ;
1553+ let mut name_length: size_t = 0 ;
1554+ let cass_err = cass_result_column_name (
1555+ result_ptr,
1556+ 0 ,
1557+ addr_of_mut ! ( name_ptr) ,
1558+ addr_of_mut ! ( name_length) ,
1559+ ) ;
1560+ assert_eq ! ( CassError :: CASS_ERROR_LIB_INDEX_OUT_OF_BOUNDS , cass_err) ;
1561+ }
1562+ }
1563+ }
1564+ }
1565+
13771566// CassResult functions:
13781567/*
13791568extern "C" {
0 commit comments