@@ -1298,6 +1298,188 @@ pub unsafe extern "C" fn cass_result_paging_state_token(
12981298 CassError :: CASS_OK
12991299}
13001300
1301+ #[ cfg( test) ]
1302+ mod tests {
1303+ use std:: { ffi:: c_char, ptr:: addr_of_mut, sync:: Arc } ;
1304+
1305+ use scylla:: frame:: response:: result:: { ColumnSpec , ColumnType , CqlValue , Row , TableSpec } ;
1306+
1307+ use crate :: {
1308+ cass_error:: CassError ,
1309+ cass_types:: { CassDataType , CassValueType } ,
1310+ query_result:: {
1311+ cass_result_column_data_type, cass_result_column_name, cass_result_first_row,
1312+ ptr_to_cstr_n, ptr_to_ref, size_t,
1313+ } ,
1314+ session:: create_cass_rows_from_rows,
1315+ } ;
1316+
1317+ use super :: { cass_result_column_count, cass_result_column_type, CassResult , CassResultData } ;
1318+
1319+ fn col_spec ( name : & str , typ : ColumnType ) -> ColumnSpec {
1320+ ColumnSpec {
1321+ table_spec : TableSpec {
1322+ ks_name : "ks" . to_string ( ) ,
1323+ table_name : "tbl" . to_string ( ) ,
1324+ } ,
1325+ name : name. to_string ( ) ,
1326+ typ,
1327+ }
1328+ }
1329+
1330+ const FIRST_COLUMN_NAME : & str = "bigint_col" ;
1331+ const SECOND_COLUMN_NAME : & str = "varint_col" ;
1332+ const THIRD_COLUMN_NAME : & str = "list_double_col" ;
1333+ fn create_cass_rows_result ( ) -> CassResult {
1334+ let metadata = Arc :: new ( CassResultData :: from_result_payload (
1335+ None ,
1336+ vec ! [
1337+ col_spec( FIRST_COLUMN_NAME , ColumnType :: BigInt ) ,
1338+ col_spec( SECOND_COLUMN_NAME , ColumnType :: Varint ) ,
1339+ col_spec(
1340+ THIRD_COLUMN_NAME ,
1341+ ColumnType :: List ( Box :: new( ColumnType :: Double ) ) ,
1342+ ) ,
1343+ ] ,
1344+ None ,
1345+ ) ) ;
1346+
1347+ let rows = create_cass_rows_from_rows (
1348+ Some ( vec ! [ Row {
1349+ columns: vec![
1350+ Some ( CqlValue :: BigInt ( 42 ) ) ,
1351+ None ,
1352+ Some ( CqlValue :: List ( vec![
1353+ CqlValue :: Float ( 0.5 ) ,
1354+ CqlValue :: Float ( 42.42 ) ,
1355+ CqlValue :: Float ( 9999.9999 ) ,
1356+ ] ) ) ,
1357+ ] ,
1358+ } ] ) ,
1359+ & metadata,
1360+ ) ;
1361+
1362+ CassResult { rows, metadata }
1363+ }
1364+
1365+ unsafe fn cass_result_column_name_rust_str (
1366+ result_ptr : * const CassResult ,
1367+ column_index : u64 ,
1368+ ) -> Option < & ' static str > {
1369+ let mut name_ptr: * const c_char = std:: ptr:: null ( ) ;
1370+ let mut name_length: size_t = 0 ;
1371+ let cass_err = cass_result_column_name (
1372+ result_ptr,
1373+ column_index,
1374+ addr_of_mut ! ( name_ptr) ,
1375+ addr_of_mut ! ( name_length) ,
1376+ ) ;
1377+ assert_eq ! ( CassError :: CASS_OK , cass_err) ;
1378+ ptr_to_cstr_n ( name_ptr, name_length)
1379+ }
1380+
1381+ #[ test]
1382+ fn rows_cass_result_api_test ( ) {
1383+ let result = create_cass_rows_result ( ) ;
1384+
1385+ unsafe {
1386+ let result_ptr = std:: ptr:: addr_of!( result) ;
1387+
1388+ // cass_result_column_count test
1389+ {
1390+ let column_count = cass_result_column_count ( result_ptr) ;
1391+ assert_eq ! ( 3 , column_count) ;
1392+ }
1393+
1394+ // cass_result_column_name test
1395+ {
1396+ let first_column_name = cass_result_column_name_rust_str ( result_ptr, 0 ) . unwrap ( ) ;
1397+ assert_eq ! ( FIRST_COLUMN_NAME , first_column_name) ;
1398+ let second_column_name = cass_result_column_name_rust_str ( result_ptr, 1 ) . unwrap ( ) ;
1399+ assert_eq ! ( SECOND_COLUMN_NAME , second_column_name) ;
1400+ let third_column_name = cass_result_column_name_rust_str ( result_ptr, 2 ) . unwrap ( ) ;
1401+ assert_eq ! ( THIRD_COLUMN_NAME , third_column_name) ;
1402+ }
1403+
1404+ // cass_result_column_type test
1405+ {
1406+ let first_col_type = cass_result_column_type ( result_ptr, 0 ) ;
1407+ assert_eq ! ( CassValueType :: CASS_VALUE_TYPE_BIGINT , first_col_type) ;
1408+ let second_col_type = cass_result_column_type ( result_ptr, 1 ) ;
1409+ assert_eq ! ( CassValueType :: CASS_VALUE_TYPE_VARINT , second_col_type) ;
1410+ let third_col_type = cass_result_column_type ( result_ptr, 2 ) ;
1411+ assert_eq ! ( CassValueType :: CASS_VALUE_TYPE_LIST , third_col_type) ;
1412+ let out_of_bound_col_type = cass_result_column_type ( result_ptr, 555 ) ;
1413+ assert_eq ! (
1414+ CassValueType :: CASS_VALUE_TYPE_UNKNOWN ,
1415+ out_of_bound_col_type
1416+ ) ;
1417+ }
1418+
1419+ // cass_result_column_data_type test
1420+ {
1421+ let first_col_data_type = ptr_to_ref ( cass_result_column_data_type ( result_ptr, 0 ) ) ;
1422+ assert_eq ! (
1423+ & CassDataType :: Value ( CassValueType :: CASS_VALUE_TYPE_BIGINT ) ,
1424+ first_col_data_type
1425+ ) ;
1426+ let second_col_data_type = ptr_to_ref ( cass_result_column_data_type ( result_ptr, 1 ) ) ;
1427+ assert_eq ! (
1428+ & CassDataType :: Value ( CassValueType :: CASS_VALUE_TYPE_VARINT ) ,
1429+ second_col_data_type
1430+ ) ;
1431+ let third_col_data_type = ptr_to_ref ( cass_result_column_data_type ( result_ptr, 2 ) ) ;
1432+ assert_eq ! (
1433+ & CassDataType :: List ( Some ( Arc :: new( CassDataType :: Value (
1434+ CassValueType :: CASS_VALUE_TYPE_DOUBLE
1435+ ) ) ) ) ,
1436+ third_col_data_type
1437+ ) ;
1438+ let out_of_bound_col_data_type = cass_result_column_data_type ( result_ptr, 555 ) ;
1439+ assert ! ( out_of_bound_col_data_type. is_null( ) ) ;
1440+ }
1441+ }
1442+ }
1443+
1444+ fn create_non_rows_cass_result ( ) -> CassResult {
1445+ let metadata = Arc :: new ( CassResultData :: from_result_payload ( None , vec ! [ ] , None ) ) ;
1446+ CassResult {
1447+ rows : None ,
1448+ metadata,
1449+ }
1450+ }
1451+
1452+ #[ test]
1453+ fn non_rows_cass_result_api_test ( ) {
1454+ let result = create_non_rows_cass_result ( ) ;
1455+
1456+ // Check that API functions do not panic when rows are empty - e.g. for INSERT queries.
1457+ unsafe {
1458+ let result_ptr = std:: ptr:: addr_of!( result) ;
1459+
1460+ assert_eq ! ( 0 , cass_result_column_count( result_ptr) ) ;
1461+ assert_eq ! (
1462+ CassValueType :: CASS_VALUE_TYPE_UNKNOWN ,
1463+ cass_result_column_type( result_ptr, 0 )
1464+ ) ;
1465+ assert ! ( cass_result_column_data_type( result_ptr, 0 ) . is_null( ) ) ;
1466+ assert ! ( cass_result_first_row( result_ptr) . is_null( ) ) ;
1467+
1468+ {
1469+ let mut name_ptr: * const c_char = std:: ptr:: null ( ) ;
1470+ let mut name_length: size_t = 0 ;
1471+ let cass_err = cass_result_column_name (
1472+ result_ptr,
1473+ 0 ,
1474+ addr_of_mut ! ( name_ptr) ,
1475+ addr_of_mut ! ( name_length) ,
1476+ ) ;
1477+ assert_eq ! ( CassError :: CASS_ERROR_LIB_INDEX_OUT_OF_BOUNDS , cass_err) ;
1478+ }
1479+ }
1480+ }
1481+ }
1482+
13011483// CassResult functions:
13021484/*
13031485extern "C" {
0 commit comments