use super::*;
use std::ffi::CStr;
#[test]
fn test_mwalib_version_major() {
assert_eq!(
mwalib_get_version_major(),
built_info::PKG_VERSION_MAJOR.parse::<c_uint>().unwrap()
);
}
#[test]
fn test_mwalib_version_minor() {
assert_eq!(
mwalib_get_version_minor(),
built_info::PKG_VERSION_MINOR.parse::<c_uint>().unwrap()
);
}
#[test]
fn test_mwalib_version_patch() {
assert_eq!(
mwalib_get_version_patch(),
built_info::PKG_VERSION_PATCH.parse::<c_uint>().unwrap()
);
}
fn c_buf_to_str(ptr: *const c_char) -> &'static str {
let cstr = unsafe { CStr::from_ptr(ptr) };
cstr.to_str().expect("invalid UTF-8 in C buffer")
}
#[test]
fn test_one_byte_buffer_writes_only_nul() {
let mut buf = [0xFFu8; 1];
let ptr = buf.as_mut_ptr() as *mut c_char;
let written = set_c_string("a", ptr, buf.len());
assert_eq!(written, 0, "no room for content, only NUL");
assert_eq!(buf[0], 0u8, "must write NUL terminator");
}
#[test]
fn test_exact_fit_writes_all_bytes_and_nul() {
let mut buf = [0u8; 6];
let ptr = buf.as_mut_ptr() as *mut c_char;
let written = set_c_string("hello", ptr, buf.len());
assert_eq!(written, 5);
assert_eq!(c_buf_to_str(ptr), "hello");
assert_eq!(buf[5], 0u8, "NUL terminator at last byte");
}
#[test]
fn test_truncates_when_buffer_too_small() {
let mut buf = [0u8; 4];
let ptr = buf.as_mut_ptr() as *mut c_char;
let written = set_c_string("abcdef", ptr, buf.len());
assert_eq!(written, 3);
assert_eq!(c_buf_to_str(ptr), "abc");
assert_eq!(buf[3], 0u8, "NUL terminator at last byte");
}
#[test]
fn test_multi_byte_utf8_is_truncated_by_bytes_not_panicking() {
let s = "ééé"; assert_eq!(s.len(), 6);
let mut buf = [0u8; 5];
let ptr = buf.as_mut_ptr() as *mut c_char;
let written = set_c_string(s, ptr, buf.len());
assert_eq!(written, 4);
assert_eq!(&buf[..written], &s.as_bytes()[..written]);
assert_eq!(buf[written], 0u8);
}
#[test]
fn test_interior_nul_in_source_is_preserved_and_cstr_stops_early() {
let src = "ab\0cd";
let mut buf = [0u8; 8];
let ptr = buf.as_mut_ptr() as *mut c_char;
let written = set_c_string(src, ptr, buf.len());
assert_eq!(
written, 5,
"copied bytes including interior NUL and final NUL"
);
assert_eq!(&buf[..written], b"ab\0cd");
assert_eq!(buf[written], 0u8, "trailing NUL we added");
assert_eq!(c_buf_to_str(ptr), "ab");
}
#[test]
fn test_large_buffer_no_overrun_and_correct_nul() {
let mut buf = [0xAAu8; 64];
let ptr = buf.as_mut_ptr() as *mut c_char;
let s = "Rust FFI ✅";
let written = set_c_string(s, ptr, buf.len());
assert_eq!(written, s.len());
assert_eq!(c_buf_to_str(ptr), s);
assert_eq!(buf[written], 0u8);
assert_eq!(buf[written + 1], 0xAAu8);
}
#[test]
fn test_empty_string_writes_only_nul() {
let mut buf = [0x77u8; 4];
let ptr = buf.as_mut_ptr() as *mut c_char;
let written = set_c_string("", ptr, buf.len());
assert_eq!(written, 0);
assert_eq!(buf[0], 0u8);
assert_eq!(c_buf_to_str(ptr), "");
}
#[test]
fn test_buffer_len_two_allows_one_byte_plus_nul() {
let mut buf = [0u8; 2];
let ptr = buf.as_mut_ptr() as *mut c_char;
let written = set_c_string("XYZ", ptr, buf.len());
assert_eq!(written, 1);
assert_eq!(c_buf_to_str(ptr), "X");
assert_eq!(buf[1], 0u8);
}