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