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