use std::ffi::CStr;
use std::mem::size_of;
use crate::ffi::{
ByteCode, CFunction, FuncCall, ITEM_NUMBERFLAG_DOUBLE, ITEM_NUMBERFLAG_INT,
ITEM_NUMBERFLAG_NOTHING, ITEMTYPE_FUNCPOINTER, ITEMTYPE_LIST, ITEMTYPE_NOTHING,
ITEMTYPE_NUMBER, ITEMTYPE_POINTER, ITEMTYPE_STRING, Item, ItemData, List, Register,
String as RingStringStruct, VM,
};
unsafe fn vm_from_state(state: crate::RingState) -> crate::RingVM {
assert!(!state.is_null());
unsafe { *(state as *const crate::RingVM) }
}
#[test]
fn test_struct_sizes() {
assert_eq!(size_of::<VM>(), 281624, "VM struct size mismatch");
assert_eq!(size_of::<List>(), 80, "List struct size mismatch");
assert_eq!(size_of::<Item>(), 24, "Item struct size mismatch");
assert_eq!(
size_of::<RingStringStruct>(),
48,
"String struct size mismatch"
);
assert_eq!(size_of::<FuncCall>(), 104, "FuncCall struct size mismatch");
assert_eq!(size_of::<ByteCode>(), 24, "ByteCode struct size mismatch");
assert_eq!(size_of::<CFunction>(), 24, "CFunction struct size mismatch");
}
#[test]
fn test_register_union_size() {
assert_eq!(size_of::<Register>(), 8, "Register union size mismatch");
}
#[test]
fn test_item_type_flags() {
assert_eq!(ITEMTYPE_NOTHING, 0);
assert_eq!(ITEMTYPE_STRING, 1);
assert_eq!(ITEMTYPE_NUMBER, 2);
assert_eq!(ITEMTYPE_POINTER, 3);
assert_eq!(ITEMTYPE_LIST, 4);
assert_eq!(ITEMTYPE_FUNCPOINTER, 5);
}
#[test]
fn test_item_number_flags() {
assert_eq!(ITEM_NUMBERFLAG_NOTHING, 0);
assert_eq!(ITEM_NUMBERFLAG_INT, 1);
assert_eq!(ITEM_NUMBERFLAG_DOUBLE, 2);
}
#[test]
fn test_item_n_type() {
let item = Item {
data: ItemData { iNumber: 0 },
flags: 0,
pGCFreeFunc: None,
};
assert_eq!(item.nType(), 0);
let item = Item {
data: ItemData { iNumber: 0 },
flags: 5,
pGCFreeFunc: None,
};
assert_eq!(item.nType(), 5);
let item = Item {
data: ItemData { iNumber: 0 },
flags: 0xFF,
pGCFreeFunc: None,
};
assert_eq!(item.nType(), 7);
}
#[test]
fn test_item_n_number_flag() {
let item = Item {
data: ItemData { iNumber: 0 },
flags: (ITEM_NUMBERFLAG_NOTHING << 3),
pGCFreeFunc: None,
};
assert_eq!(item.nNumberFlag(), 0);
let item = Item {
data: ItemData { iNumber: 0 },
flags: (ITEM_NUMBERFLAG_INT << 3),
pGCFreeFunc: None,
};
assert_eq!(item.nNumberFlag(), 1);
let item = Item {
data: ItemData { iNumber: 0 },
flags: (ITEM_NUMBERFLAG_DOUBLE << 3),
pGCFreeFunc: None,
};
assert_eq!(item.nNumberFlag(), 2);
}
#[test]
fn test_item_n_object_type() {
let item = Item {
data: ItemData { iNumber: 0 },
flags: 0 << 5,
pGCFreeFunc: None,
};
assert_eq!(item.nObjectType(), 0);
let item = Item {
data: ItemData { iNumber: 0 },
flags: 2 << 5,
pGCFreeFunc: None,
};
assert_eq!(item.nObjectType(), 2);
}
#[test]
fn test_item_l_assignment() {
let item = Item {
data: ItemData { iNumber: 0 },
flags: 0,
pGCFreeFunc: None,
};
assert!(!item.lAssignment());
let item = Item {
data: ItemData { iNumber: 0 },
flags: 1 << 7,
pGCFreeFunc: None,
};
assert!(item.lAssignment());
}
#[test]
fn test_stack_size_constant() {
assert_eq!(crate::ffi::RING_VM_STACK_SIZE, 1004);
}
#[test]
fn test_custommutex_count() {
assert_eq!(crate::ffi::RING_VM_CUSTOMMUTEX_COUNT, 5);
}
#[test]
fn test_bc_items_count() {
assert_eq!(crate::ffi::RING_VM_BC_ITEMS_COUNT, 2);
}
#[test]
fn test_boolean_constants() {
assert_eq!(crate::ffi::RING_FALSE, 0);
assert_eq!(crate::ffi::RING_TRUE, 1);
}
#[test]
fn test_ffi_ring_list_getsize() {
let list = crate::ring_list_new(0);
assert!(!list.is_null());
unsafe {
assert_eq!(crate::ffi::ring_list_getsize(list), 0);
}
crate::ring_list_addint(list, 1);
unsafe {
assert_eq!(crate::ffi::ring_list_getsize(list), 1);
}
}
#[test]
fn test_ffi_ring_list_gettype() {
let list = crate::ring_list_new(0);
crate::ring_list_addint(list, 42);
unsafe {
assert_eq!(crate::ffi::ring_list_gettype(list, 1), ITEMTYPE_NUMBER);
}
}
#[test]
fn test_ffi_ring_list_getint() {
let list = crate::ring_list_new(0);
crate::ring_list_addint(list, 99);
unsafe {
assert_eq!(crate::ffi::ring_list_getint(list, 1), 99);
}
}
#[test]
fn test_ffi_ring_list_getdouble() {
let list = crate::ring_list_new(0);
crate::ring_list_adddouble(list, 2.5);
unsafe {
assert!((crate::ffi::ring_list_getdouble(list, 1) - 2.5).abs() < 0.001);
}
}
#[test]
fn test_ffi_ring_list_getpointer() {
let list = crate::ring_list_new(0);
crate::ring_list_addpointer(list, std::ptr::null_mut());
unsafe {
assert!(crate::ffi::ring_list_getpointer(list, 1).is_null());
}
}
#[test]
fn test_ffi_ring_list_getstringsize() {
let list = crate::ring_list_new(0);
crate::ring_list_addstring(list, b"abcde");
let _size = unsafe { crate::ffi::ring_list_getstringsize(list, 1) };
}
#[test]
fn test_size_t_is_usize() {
assert_eq!(size_of::<crate::ffi_types::size_t>(), size_of::<usize>());
}
#[test]
fn test_ffi_types_re_exports() {
let _x: crate::ffi_types::c_char = 0;
let _y: crate::ffi_types::c_double = 0.0;
let _z: crate::ffi_types::c_int = 0;
let _w: crate::ffi_types::c_uint = 0;
}
#[cfg(feature = "extension")]
#[test]
fn test_ring_register_extension() {
extern "C" fn dummy_init(_state: crate::RingState) {}
crate::ring_register_extension(dummy_init);
}
#[cfg(feature = "extension")]
#[test]
fn test_ring_register_multiple_extensions() {
extern "C" fn dummy_init1(_state: crate::RingState) {}
extern "C" fn dummy_init2(_state: crate::RingState) {}
crate::ring_register_extension(dummy_init1);
crate::ring_register_extension(dummy_init2);
}
#[test]
fn test_ring_item_new_nothing() {
let item = crate::ring_item_new_nothing();
assert!(!item.is_null());
}
#[test]
fn test_ring_item_new_string() {
let item = crate::ring_item_new_string();
assert!(!item.is_null());
}
#[test]
fn test_ring_item_new_number() {
let item = crate::ring_item_new_number();
assert!(!item.is_null());
}
#[test]
fn test_ring_item_new_pointer() {
let item = crate::ring_item_new_pointer();
assert!(!item.is_null());
}
#[test]
fn test_ring_item_new_list() {
let item = crate::ring_item_new_list();
assert!(!item.is_null());
}
#[test]
fn test_ring_item_new_funcpointer() {
let item = crate::ring_item_new_funcpointer();
assert!(!item.is_null());
}
#[test]
fn test_ring_item_set_and_get_double() {
let item = crate::ring_item_new_number();
crate::ring_item_setdouble(item, 2.5);
let value = crate::ring_item_getnumber(item);
assert!((value - 2.5).abs() < 0.001);
}
#[test]
fn test_ring_item_set_and_get_int() {
let item = crate::ring_item_new_number();
crate::ring_item_setint(item, 42);
let value = crate::ring_item_getnumber(item);
assert!((value - 42.0).abs() < 0.001);
}
#[test]
fn test_ring_item_set_type() {
let item = crate::ring_item_new_nothing();
crate::ring_item_settype(item, ITEMTYPE_NUMBER);
}
#[test]
fn test_ring_item_init() {
let item = crate::ring_item_new_number();
crate::ring_item_init(item);
}
#[test]
fn test_ring_item_delete() {
let item = crate::ring_item_new_number();
let _ = crate::ring_item_delete(item);
}
#[test]
fn test_ring_item_deletecontent() {
let item = crate::ring_item_new_string();
crate::ring_item_setstring(item, b"test");
crate::ring_item_deletecontent(item);
}
#[test]
fn test_ring_item_setstring() {
let item = crate::ring_item_new_string();
crate::ring_item_setstring(item, b"hello");
}
#[test]
fn test_ring_item_setstring_str() {
let item = crate::ring_item_new_string();
crate::ring_item_setstring_str(item, "hello str");
}
#[test]
fn test_ring_item_setstring2() {
let item = crate::ring_item_new_string();
crate::ring_item_setstring2(item, b"hello with size");
}
#[test]
fn test_ring_item_setpointer() {
let item = crate::ring_item_new_pointer();
crate::ring_item_setpointer(item, std::ptr::null_mut());
}
#[test]
fn test_ring_item_setstring_and_exists() {
let item = crate::ring_item_new_string();
crate::ring_item_setstring(item, b"print test");
}
#[test]
fn test_ring_itemarray_setint() {
let mut items: [crate::ffi::Item; 3] = unsafe { std::mem::zeroed() };
crate::ring_itemarray_setint(items.as_mut_ptr(), 0, 42);
}
#[test]
fn test_ring_itemarray_setdouble() {
let mut items: [crate::ffi::Item; 3] = unsafe { std::mem::zeroed() };
crate::ring_itemarray_setdouble(items.as_mut_ptr(), 0, 2.5);
}
#[test]
fn test_ring_itemarray_setpointer() {
let mut items: [crate::ffi::Item; 3] = unsafe { std::mem::zeroed() };
crate::ring_itemarray_setpointer(items.as_mut_ptr(), 0, std::ptr::null_mut());
}
#[test]
fn test_ring_itemarray_setstring() {
let mut items: [crate::ffi::Item; 3] = unsafe { std::mem::zeroed() };
crate::ring_itemarray_setstring(items.as_mut_ptr(), 0, b"hello");
}
#[test]
fn test_ring_itemarray_setstring_str() {
let mut items: [crate::ffi::Item; 3] = unsafe { std::mem::zeroed() };
crate::ring_itemarray_setstring_str(items.as_mut_ptr(), 0, "hello str");
}
#[test]
fn test_ring_itemarray_setstring2() {
let mut items: [crate::ffi::Item; 3] = unsafe { std::mem::zeroed() };
crate::ring_itemarray_setstring2(items.as_mut_ptr(), 0, b"hello with size");
}
#[test]
fn test_ring_list_new() {
let list = crate::ring_list_new(0);
assert!(!list.is_null());
}
#[test]
fn test_ring_list_new_prealloc() {
let list = crate::ring_list_new(5);
assert!(!list.is_null());
assert_eq!(crate::ring_list_getsize(list), 5);
}
#[test]
fn test_ring_list_delete() {
let list = crate::ring_list_new(0);
let _ = crate::ring_list_delete(list);
}
#[test]
fn test_ring_list_newlist() {
let parent = crate::ring_list_new(0);
let child = crate::ring_list_newlist(parent);
assert!(!child.is_null());
}
#[test]
fn test_ring_list_getsize() {
let list = crate::ring_list_new(0);
assert_eq!(crate::ring_list_getsize(list), 0);
crate::ring_list_addint(list, 1);
assert_eq!(crate::ring_list_getsize(list), 1);
}
#[test]
fn test_ring_list_gettype() {
let list = crate::ring_list_new(0);
crate::ring_list_addint(list, 42);
assert_eq!(crate::ring_list_gettype(list, 1), ITEMTYPE_NUMBER);
crate::ring_list_addstring(list, b"s");
assert_eq!(crate::ring_list_gettype(list, 2), ITEMTYPE_STRING);
}
#[test]
fn test_ring_list_add_and_get_int() {
let list = crate::ring_list_new(0);
crate::ring_list_addint(list, 42);
assert_eq!(crate::ring_list_getint(list, 1), 42);
}
#[test]
fn test_ring_list_add_and_get_double() {
let list = crate::ring_list_new(0);
crate::ring_list_adddouble(list, 2.5);
let value = crate::ring_list_getdouble(list, 1);
assert!((value - 2.5).abs() < 0.001);
}
#[test]
fn test_ring_list_add_and_get_string() {
let list = crate::ring_list_new(0);
crate::ring_list_addstring(list, b"hello");
assert_eq!(crate::ring_list_getsize(list), 1);
let ptr = crate::ring_list_getstring(list, 1);
assert!(!ptr.is_null());
}
#[test]
fn test_ring_list_addstring_str() {
let list = crate::ring_list_new(0);
crate::ring_list_addstring_str(list, "hello from str");
assert_eq!(crate::ring_list_getsize(list), 1);
}
#[test]
fn test_ring_list_addstring2() {
let list = crate::ring_list_new(0);
crate::ring_list_addstring2(list, b"hello world");
assert_eq!(crate::ring_list_getsize(list), 1);
}
#[test]
fn test_ring_list_addpointer() {
let list = crate::ring_list_new(0);
crate::ring_list_addpointer(list, std::ptr::null_mut());
assert_eq!(crate::ring_list_getsize(list), 1);
}
#[test]
fn test_ring_list_addcpointer() {
let list = crate::ring_list_new(0);
crate::ring_list_addcpointer(list, std::ptr::null_mut(), b"testtype\0");
assert_eq!(crate::ring_list_getsize(list), 1);
}
#[test]
fn test_ring_list_getint() {
let list = crate::ring_list_new(0);
crate::ring_list_addint(list, 77);
assert_eq!(crate::ring_list_getint(list, 1), 77);
}
#[test]
fn test_ring_list_getdouble() {
let list = crate::ring_list_new(0);
crate::ring_list_adddouble(list, 1.5);
let v = crate::ring_list_getdouble(list, 1);
assert!((v - 1.5).abs() < 0.001);
}
#[test]
fn test_ring_list_getstring() {
let list = crate::ring_list_new(0);
crate::ring_list_addstring(list, b"test");
let ptr = crate::ring_list_getstring(list, 1);
assert!(!ptr.is_null());
}
#[test]
fn test_ring_list_getstringsize() {
let list = crate::ring_list_new(0);
crate::ring_list_addstring(list, b"abcde");
let _ = crate::ring_list_getstringsize(list, 1);
}
#[test]
fn test_ring_list_getpointer() {
let list = crate::ring_list_new(0);
let raw: *mut std::ffi::c_void = 0x1234usize as *mut _;
crate::ring_list_addpointer(list, raw);
assert_eq!(crate::ring_list_getpointer(list, 1), raw);
}
#[test]
fn test_ring_list_getlist() {
let list = crate::ring_list_new(0);
crate::ring_list_addint(list, 0);
crate::ring_list_setlist(list, 1);
let sub = crate::ring_list_getlist(list, 1);
assert!(!sub.is_null());
}
#[test]
fn test_ring_list_set_and_get() {
let list = crate::ring_list_new(2);
crate::ring_list_setint(list, 1, 99);
assert_eq!(crate::ring_list_getint(list, 1), 99);
crate::ring_list_setdouble(list, 2, 2.5);
let value = crate::ring_list_getdouble(list, 2);
assert!((value - 2.5).abs() < 0.001);
}
#[test]
fn test_ring_list_setstring() {
let list = crate::ring_list_new(3);
crate::ring_list_setstring(list, 1, b"one");
crate::ring_list_setstring(list, 2, b"two");
crate::ring_list_setstring(list, 3, b"three");
assert_eq!(crate::ring_list_getsize(list), 3);
assert!(crate::ring_list_isstring(list, 1));
assert!(crate::ring_list_isstring(list, 2));
assert!(crate::ring_list_isstring(list, 3));
}
#[test]
fn test_ring_list_setstring_str() {
let list = crate::ring_list_new(1);
crate::ring_list_setstring_str(list, 1, "str variant");
assert!(crate::ring_list_isstring(list, 1));
}
#[test]
fn test_ring_list_setstring2() {
let list = crate::ring_list_new(1);
crate::ring_list_setstring2(list, 1, b"with explicit size");
assert!(crate::ring_list_isstring(list, 1));
}
#[test]
fn test_ring_list_setpointer() {
let list = crate::ring_list_new(1);
crate::ring_list_setpointer(list, 1, std::ptr::null_mut());
assert!(crate::ring_list_ispointer(list, 1));
}
#[test]
fn test_ring_list_insert_int() {
let list = crate::ring_list_new(0);
crate::ring_list_addint(list, 1);
crate::ring_list_addint(list, 3);
crate::ring_list_insertint(list, 2, 2);
assert_eq!(crate::ring_list_getsize(list), 3);
assert!(crate::ring_list_isnumber(list, 2));
}
#[test]
fn test_ring_list_insert_double() {
let list = crate::ring_list_new(0);
crate::ring_list_adddouble(list, 1.0);
crate::ring_list_insertdouble(list, 1, 1.5);
assert_eq!(crate::ring_list_getsize(list), 2);
assert!(crate::ring_list_isnumber(list, 1));
}
#[test]
fn test_ring_list_insert_string() {
let list = crate::ring_list_new(0);
crate::ring_list_addint(list, 0);
crate::ring_list_addint(list, 0);
crate::ring_list_insertstring(list, 2, b"middle");
assert_eq!(crate::ring_list_getsize(list), 3);
}
#[test]
fn test_ring_list_insertstring_str() {
let list = crate::ring_list_new(0);
crate::ring_list_addint(list, 0);
crate::ring_list_insertstring_str(list, 1, "inserted str");
assert_eq!(crate::ring_list_getsize(list), 2);
}
#[test]
fn test_ring_list_insertstring2() {
let list = crate::ring_list_new(0);
crate::ring_list_addint(list, 0);
crate::ring_list_insertstring2(list, 1, b"inserted with size");
assert_eq!(crate::ring_list_getsize(list), 2);
}
#[test]
fn test_ring_list_insertpointer() {
let list = crate::ring_list_new(0);
crate::ring_list_addint(list, 0);
crate::ring_list_insertpointer(list, 1, std::ptr::null_mut());
assert_eq!(crate::ring_list_getsize(list), 2);
}
#[test]
fn test_ring_list_insertlist() {
let list = crate::ring_list_new(0);
crate::ring_list_addint(list, 0);
let sub = crate::ring_list_insertlist(list, 1);
assert!(!sub.is_null());
assert_eq!(crate::ring_list_getsize(list), 2);
}
#[test]
fn test_ring_list_deleteitem() {
let list = crate::ring_list_new(0);
crate::ring_list_addint(list, 1);
crate::ring_list_addint(list, 2);
crate::ring_list_addint(list, 3);
crate::ring_list_deleteitem(list, 2);
assert_eq!(crate::ring_list_getsize(list), 2);
}
#[test]
fn test_ring_list_find_string() {
let list = crate::ring_list_new(0);
crate::ring_list_addstring(list, b"alpha");
crate::ring_list_addstring(list, b"beta");
crate::ring_list_addstring(list, b"gamma");
let result = crate::ring_list_findstring(list, b"beta", 0);
assert_eq!(result, 2);
}
#[test]
fn test_ring_list_findstring_str() {
let list = crate::ring_list_new(0);
crate::ring_list_addstring(list, b"alpha");
crate::ring_list_addstring(list, b"beta");
let _ = crate::ring_list_findstring_str(list, "beta", 0);
}
#[test]
fn test_ring_list_find_double() {
let list = crate::ring_list_new(0);
crate::ring_list_adddouble(list, 1.0);
crate::ring_list_adddouble(list, 99.5);
let result = crate::ring_list_finddouble(list, 99.5, 0);
assert_eq!(result, 2);
}
#[test]
fn test_ring_list_findpointer() {
let list = crate::ring_list_new(0);
let ptr: *mut std::ffi::c_void = 0xABCDusize as *mut _;
crate::ring_list_addpointer(list, ptr);
let result = crate::ring_list_findpointer(list, ptr);
assert_eq!(result, 1);
}
#[test]
fn test_ring_list_swap() {
let list = crate::ring_list_new(0);
crate::ring_list_addint(list, 10);
crate::ring_list_addint(list, 20);
crate::ring_list_swap(list, 1, 2);
assert_eq!(crate::ring_list_getint(list, 1), 20);
assert_eq!(crate::ring_list_getint(list, 2), 10);
}
#[test]
fn test_ring_list_swaptwolists() {
let a = crate::ring_list_new(0);
let b = crate::ring_list_new(0);
crate::ring_list_addint(a, 1);
crate::ring_list_addint(b, 2);
crate::ring_list_swaptwolists(a, b);
assert_eq!(crate::ring_list_getint(a, 1), 2);
assert_eq!(crate::ring_list_getint(b, 1), 1);
}
#[test]
fn test_ring_list_copy() {
let src = crate::ring_list_new(0);
crate::ring_list_addint(src, 7);
let dst = crate::ring_list_new(0);
crate::ring_list_copy(dst, src);
assert_eq!(crate::ring_list_getint(dst, 1), 7);
}
#[test]
fn test_ring_list_genarray() {
let list = crate::ring_list_new(0);
crate::ring_list_addint(list, 1);
crate::ring_list_genarray(list);
}
#[test]
fn test_ring_list_deletearray() {
let list = crate::ring_list_new(0);
crate::ring_list_addint(list, 1);
crate::ring_list_genarray(list);
crate::ring_list_deletearray(list);
}
#[test]
fn test_ring_list_genhashtable() {
let list = crate::ring_list_new(0);
crate::ring_list_genhashtable(list);
}
#[test]
fn test_ring_list_genhashtable2() {
let list = crate::ring_list_new(0);
crate::ring_list_genhashtable2(list);
}
#[test]
fn test_ring_list_sortstr() {
let list = crate::ring_list_new(0);
crate::ring_list_addstring(list, b"charlie");
crate::ring_list_addstring(list, b"alpha");
crate::ring_list_addstring(list, b"beta");
crate::ring_list_sortstr(list, 1, 3, 0, b"");
}
#[test]
fn test_ring_list_sortstr_str() {
let list = crate::ring_list_new(0);
crate::ring_list_addstring(list, b"zebra");
crate::ring_list_addstring(list, b"apple");
crate::ring_list_sortstr_str(list, 1, 2, 0, "");
}
#[test]
fn test_ring_list_isobject() {
let list = crate::ring_list_new(0);
assert!(!crate::ring_list_isobject(list));
}
#[test]
fn test_ring_list_iscpointerlist() {
let list = crate::ring_list_new(0);
assert!(!crate::ring_list_iscpointerlist(list));
}
#[test]
fn test_ring_list_cpointercmp() {
let a = crate::ring_list_new(0);
let b = crate::ring_list_new(0);
crate::ring_list_addcpointer(a, std::ptr::null_mut(), b"t\0");
crate::ring_list_addcpointer(b, std::ptr::null_mut(), b"t\0");
let result = crate::ring_list_cpointercmp(a, b);
let _ = result;
}
#[test]
fn test_ring_list_addringpointer() {
let list = crate::ring_list_new(0);
crate::ring_list_addringpointer(list, std::ptr::null_mut());
assert_eq!(crate::ring_list_getsize(list), 1);
}
#[test]
fn test_ring_list_deleteallitems() {
let list = crate::ring_list_new(0);
crate::ring_list_addint(list, 1);
crate::ring_list_addint(list, 2);
crate::ring_list_deleteallitems(list);
assert_eq!(crate::ring_list_getsize(list), 0);
}
#[test]
fn test_ring_list_newitem() {
let list = crate::ring_list_new(0);
crate::ring_list_newitem(list);
assert_eq!(crate::ring_list_getsize(list), 1);
}
#[test]
fn test_ring_list_insertitem() {
let list = crate::ring_list_new(0);
crate::ring_list_addint(list, 0);
crate::ring_list_insertitem(list, 1);
}
#[test]
fn test_ring_list_is_functions() {
let list = crate::ring_list_new(0);
crate::ring_list_addint(list, 42);
assert!(crate::ring_list_isnumber(list, 1));
crate::ring_list_addstring(list, b"test");
assert!(crate::ring_list_isstring(list, 2));
crate::ring_list_addpointer(list, std::ptr::null_mut());
assert!(crate::ring_list_ispointer(list, 3));
crate::ring_list_setlist(list, 1);
assert!(crate::ring_list_islist(list, 1));
}
#[test]
fn test_ring_list_multiple_items() {
let list = crate::ring_list_new(0);
crate::ring_list_addint(list, 1);
crate::ring_list_addint(list, 2);
crate::ring_list_addint(list, 3);
assert_eq!(crate::ring_list_getsize(list), 3);
}
extern "C" fn dummy_func(_: *mut std::ffi::c_void) {}
#[test]
fn test_ring_list_setfuncpointer() {
let list = crate::ring_list_new(1);
crate::ring_list_setfuncpointer(list, 1, dummy_func);
assert!(crate::ring_list_isfuncpointer(list, 1));
}
#[test]
fn test_ring_list_addfuncpointer() {
let list = crate::ring_list_new(0);
crate::ring_list_addfuncpointer(list, dummy_func);
assert!(crate::ring_list_isfuncpointer(list, 1));
}
#[test]
fn test_ring_list_insertfuncpointer() {
let list = crate::ring_list_new(0);
crate::ring_list_addint(list, 0);
crate::ring_list_insertfuncpointer(list, 1, dummy_func);
}
#[test]
fn test_ring_list_getitem() {
let list = crate::ring_list_new(0);
crate::ring_list_addint(list, 99);
let item = crate::ring_list_getitem(list, 1);
assert!(!item.is_null());
}
#[test]
fn test_ring_list_setlist() {
let list = crate::ring_list_new(1);
crate::ring_list_setlist(list, 1);
assert!(crate::ring_list_islist(list, 1));
}
#[test]
fn test_ring_state_new() {
let state = crate::ring_state_new();
assert!(!state.is_null());
let _ = crate::ring_state_delete(state);
}
#[test]
fn test_ring_state_init() {
let state = crate::ring_state_init();
assert!(!state.is_null());
let _ = crate::ring_state_delete(state);
}
#[test]
fn test_ring_state_delete_after_new() {
let state = crate::ring_state_new();
let _ = crate::ring_state_delete(state);
}
#[test]
fn test_ring_state_malloc() {
let state = crate::ring_state_init();
let ptr = crate::ring_state_malloc(state, 64);
assert!(!ptr.is_null());
}
#[test]
fn test_ring_state_calloc() {
let state = crate::ring_state_init();
let ptr = crate::ring_state_calloc(state, 10, 8);
assert!(!ptr.is_null());
}
#[test]
fn test_ring_state_realloc() {
let state = crate::ring_state_init();
let ptr = crate::ring_state_malloc(state, 32);
assert!(!ptr.is_null());
let new_ptr = crate::ring_state_realloc(state, ptr, 32, 64);
assert!(!new_ptr.is_null());
}
#[test]
fn test_ring_state_free() {
let state = crate::ring_state_init();
let ptr = crate::ring_state_malloc(state, 16);
assert!(!ptr.is_null());
crate::ring_state_free(state, ptr);
}
#[test]
fn test_ring_state_runcode() {
let state = crate::ring_state_init();
crate::ring_state_runcode(state, b"x = 1\0");
}
#[test]
fn test_ring_state_runcode_str() {
let state = crate::ring_state_init();
crate::ring_state_runcode_str(state, "x = 1");
}
#[test]
fn test_ring_state_findvar() {
let state = crate::ring_state_init();
crate::ring_state_runcode(state, b"testvar = 42\0");
let var_list = crate::ring_state_findvar(state, b"testvar\0");
assert!(!var_list.is_null());
}
#[test]
fn test_ring_state_findvar_str() {
let state = crate::ring_state_init();
crate::ring_state_runcode(state, b"myvar = 99\0");
let var_list = crate::ring_state_findvar_str(state, "myvar");
assert!(!var_list.is_null());
}
#[test]
fn test_ring_state_newvar() {
let state = crate::ring_state_init();
let new_var = crate::ring_state_newvar(state, b"newvar\0");
assert!(!new_var.is_null());
}
#[test]
fn test_ring_state_newvar_str() {
let state = crate::ring_state_init();
let new_var = crate::ring_state_newvar_str(state, "newvar2");
assert!(!new_var.is_null());
}
#[test]
fn test_ring_state_runfile() {
let state = crate::ring_state_init();
let path = std::env::temp_dir().join("test_ring_state_runfile.ring");
std::fs::write(&path, b"x = 1\n").unwrap();
let result = crate::ring_state_runfile(state, path.to_str().unwrap().as_bytes());
let _ = result;
let _ = std::fs::remove_file(&path);
}
#[test]
fn test_ring_state_runfile_str() {
let state = crate::ring_state_init();
let path = std::env::temp_dir().join("test_ring_state_runfile_str.ring");
std::fs::write(&path, b"x = 2\n").unwrap();
let result = crate::ring_state_runfile_str(state, path.to_str().unwrap());
let _ = result;
let _ = std::fs::remove_file(&path);
}
#[test]
fn test_ring_state_runstring() {
let state = crate::ring_state_init();
let result = crate::ring_state_runstring(state, b"x = 42\0");
let _ = result;
}
#[test]
fn test_ring_state_runstring_str() {
let state = crate::ring_state_init();
let result = crate::ring_state_runstring_str(state, "x = 42");
let _ = result;
}
#[test]
fn test_ring_state_log() {
let state = crate::ring_state_init();
crate::ring_state_log(state, b"test log message\0");
}
#[test]
fn test_ring_state_log_str() {
let state = crate::ring_state_init();
crate::ring_state_log_str(state, "test log str");
}
#[test]
fn test_ring_state_registerblock() {
let state = crate::ring_state_init();
let x: i32 = 0;
let start: *mut std::ffi::c_void = &x as *const i32 as *mut std::ffi::c_void;
let end: *mut std::ffi::c_void = unsafe { start.add(1) };
crate::ring_state_registerblock(state, start, end);
}
#[test]
fn test_ring_state_unregisterblock() {
let state = crate::ring_state_init();
let x: i32 = 0;
let start: *mut std::ffi::c_void = &x as *const i32 as *mut std::ffi::c_void;
crate::ring_state_unregisterblock(state, start);
}
#[test]
fn test_ring_state_willunregisterblock() {
let state = crate::ring_state_init();
let x: i32 = 0;
let start: *mut std::ffi::c_void = &x as *const i32 as *mut std::ffi::c_void;
crate::ring_state_willunregisterblock(state, start);
}
#[test]
fn test_ring_state_runprogram() {
let state = crate::ring_state_init();
crate::ring_state_runcode(state, b"x = 1\0");
crate::ring_state_runprogram(state);
}
#[test]
fn test_ring_state_newbytecode() {
let state = crate::ring_state_init();
crate::ring_state_newbytecode(state, 10, 0);
}
#[test]
fn test_ring_state_runbytecode() {
let state = crate::ring_state_init();
crate::ring_state_newbytecode(state, 10, 0);
crate::ring_state_runbytecode(state);
}
#[test]
fn test_ring_vm_loadcfunctions() {
let state = crate::ring_state_init();
crate::ring_vm_loadcfunctions(state);
}
#[test]
fn test_ring_vm_generallib_loadfunctions() {
let state = crate::ring_state_init();
crate::ring_vm_generallib_loadfunctions(state);
}
#[test]
fn test_ring_string_new() {
let s = crate::ring_string_new(b"hello\0");
assert!(!s.is_null());
}
#[test]
fn test_ring_string_new_str() {
let s = crate::ring_string_new_str("hello");
assert!(!s.is_null());
}
#[test]
fn test_ring_string_new2() {
let s = crate::ring_string_new2(b"hello world");
assert!(!s.is_null());
}
#[test]
fn test_ring_string_delete() {
let s = crate::ring_string_new(b"test\0");
assert!(!s.is_null());
let _ = crate::ring_string_delete(s);
}
#[test]
fn test_ring_string_size() {
let s = crate::ring_string_new(b"hello\0");
assert!(!s.is_null());
assert_eq!(crate::ring_string_size(s), 5);
}
#[test]
fn test_ring_string_set() {
let s = crate::ring_string_new(b"hello\0");
assert!(!s.is_null());
crate::ring_string_set(s, b"world\0");
assert_eq!(crate::ring_string_size(s), 5);
}
#[test]
fn test_ring_string_set_str() {
let s = crate::ring_string_new_str("hello");
assert!(!s.is_null());
crate::ring_string_set_str(s, "world");
assert_eq!(crate::ring_string_size(s), 5);
}
#[test]
fn test_ring_string_set2() {
let s = crate::ring_string_new(b"initial\0");
assert!(!s.is_null());
crate::ring_string_set2(s, b"updated text");
}
#[test]
fn test_ring_string_add() {
let s = crate::ring_string_new(b"hello\0");
assert!(!s.is_null());
crate::ring_string_add(s, b" world\0");
}
#[test]
fn test_ring_string_add_str() {
let s = crate::ring_string_new_str("hello");
assert!(!s.is_null());
crate::ring_string_add_str(s, " rust");
assert_eq!(crate::ring_string_size(s), 10);
}
#[test]
fn test_ring_string_add2() {
let s = crate::ring_string_new(b"hello\0");
assert!(!s.is_null());
crate::ring_string_add2(s, b" world\0");
}
#[test]
fn test_ring_string_setfromint() {
let s = crate::ring_string_new(b"placeholder\0");
assert!(!s.is_null());
crate::ring_string_setfromint(s, 42);
}
#[test]
fn test_ring_string_strdup() {
let ptr = crate::ring_string_strdup(b"duplicate me\0");
assert!(!ptr.is_null());
let cstr = unsafe { CStr::from_ptr(ptr) };
assert_eq!(cstr.to_str().unwrap(), "duplicate me");
}
#[test]
fn test_ring_string_strdup_str() {
let ptr = crate::ring_string_strdup_str("dupe str");
assert!(!ptr.is_null());
let cstr = unsafe { CStr::from_ptr(ptr) };
assert_eq!(cstr.to_str().unwrap(), "dupe str");
}
#[test]
fn test_vm_funccallscount() {
let state = crate::ring_state_init();
let vm = unsafe { vm_from_state(state) };
let _count = crate::vm::ring_vm_funccallscount(vm);
}
#[test]
fn test_vm_get_set_sp() {
let state = crate::ring_state_init();
let vm = unsafe { vm_from_state(state) };
let sp = crate::vm::ring_vm_get_sp(vm);
crate::vm::ring_vm_set_sp(vm, sp);
assert_eq!(crate::vm::ring_vm_get_sp(vm), sp);
}
#[test]
fn test_vm_get_set_funcsp() {
let state = crate::ring_state_init();
let vm = unsafe { vm_from_state(state) };
let funcsp = crate::vm::ring_vm_get_funcsp(vm);
crate::vm::ring_vm_set_funcsp(vm, funcsp);
assert_eq!(crate::vm::ring_vm_get_funcsp(vm), funcsp);
}
#[test]
fn test_vm_stack_push_number() {
let _state = crate::ring_state_init();
let _vm = unsafe { vm_from_state(_state) };
let _f: unsafe fn(crate::RingVM, f64) = crate::vm::ring_vm_stack_push_number;
let _ = _f;
}
#[test]
fn test_vm_stack_push_int() {
let _state = crate::ring_state_init();
let _vm = unsafe { vm_from_state(_state) };
let _f: unsafe fn(crate::RingVM, i32) = crate::vm::ring_vm_stack_push_int;
let _ = _f;
}
#[test]
fn test_vm_stack_push_cvalue() {
let _state = crate::ring_state_init();
let _vm = unsafe { vm_from_state(_state) };
let _f: unsafe fn(crate::RingVM, &[u8]) = crate::vm::ring_vm_stack_push_cvalue;
let _ = _f;
}
#[test]
fn test_vm_numtostring() {
let state = crate::ring_state_init();
let vm = unsafe { vm_from_state(state) };
let mut buf = [0u8; 64];
crate::vm::ring_vm_numtostring(vm, 42.5, &mut buf);
}
#[test]
fn test_vm_stringtonum() {
let state = crate::ring_state_init();
let vm = unsafe { vm_from_state(state) };
let result = crate::vm::ring_vm_stringtonum(vm, b"2.5\0");
assert!((result - 2.5).abs() < 0.001);
}
#[test]
fn test_vm_stringtonum_str() {
let state = crate::ring_state_init();
let vm = unsafe { vm_from_state(state) };
let result = crate::vm::ring_vm_stringtonum_str(vm, "42");
assert!((result - 42.0).abs() < 0.001);
}
#[test]
fn test_vm_mutexlock_unlock() {
let state = crate::ring_state_init();
let vm = unsafe { vm_from_state(state) };
crate::vm::ring_vm_mutexlock(vm);
crate::vm::ring_vm_mutexunlock(vm);
}
#[test]
fn test_vm_lock_guard() {
let state = crate::ring_state_init();
let vm = unsafe { vm_from_state(state) };
{
let _guard = crate::vm::ring_vm_lock(vm);
}
crate::vm::ring_vm_mutexunlock(vm);
}
#[test]
fn test_vm_runcode() {
let state = crate::ring_state_init();
let vm = unsafe { vm_from_state(state) };
crate::vm::ring_vm_runcode(vm, b"x = 1\0");
}
#[test]
fn test_vm_runcode_str() {
let state = crate::ring_state_init();
let vm = unsafe { vm_from_state(state) };
crate::vm::ring_vm_runcode_str(vm, "x = 2");
}
static mut MOCK_MUTEX_DATA: u8 = 0;
extern "C" fn mock_mutex_create() -> *mut std::ffi::c_void {
&raw mut MOCK_MUTEX_DATA as *mut std::ffi::c_void
}
extern "C" fn mock_mutex_lock(_ptr: *mut std::ffi::c_void) {}
extern "C" fn mock_mutex_unlock(_ptr: *mut std::ffi::c_void) {}
extern "C" fn mock_mutex_destroy(_ptr: *mut std::ffi::c_void) {}
#[test]
fn test_vm_custmutexcreate_destroy() {
let state = crate::ring_state_init();
let vm = unsafe { vm_from_state(state) };
crate::vm::ring_vm_mutexfunctions(
vm,
Some(mock_mutex_create),
Some(mock_mutex_lock),
Some(mock_mutex_unlock),
Some(mock_mutex_destroy),
);
let mutex = crate::vm::ring_vm_custmutexcreate(vm);
assert!(!mutex.is_null());
crate::vm::ring_vm_custmutexdestroy(vm, mutex);
}
#[test]
fn test_vm_custmutexlock_unlock() {
let state = crate::ring_state_init();
let vm = unsafe { vm_from_state(state) };
crate::vm::ring_vm_mutexfunctions(
vm,
Some(mock_mutex_create),
Some(mock_mutex_lock),
Some(mock_mutex_unlock),
Some(mock_mutex_destroy),
);
let mutex = crate::vm::ring_vm_custmutexcreate(vm);
assert!(!mutex.is_null());
crate::vm::ring_vm_custmutexlock(vm, mutex);
crate::vm::ring_vm_custmutexunlock(vm, mutex);
crate::vm::ring_vm_custmutexdestroy(vm, mutex);
}
#[test]
fn test_vm_custmutex_guard() {
let state = crate::ring_state_init();
let vm = unsafe { vm_from_state(state) };
crate::vm::ring_vm_mutexfunctions(
vm,
Some(mock_mutex_create),
Some(mock_mutex_lock),
Some(mock_mutex_unlock),
Some(mock_mutex_destroy),
);
let mutex = crate::vm::ring_vm_custmutexcreate(vm);
assert!(!mutex.is_null());
{
let _guard = crate::vm::ring_vm_custmutex_lock(vm, mutex);
}
crate::vm::ring_vm_custmutexdestroy(vm, mutex);
}
#[test]
fn test_vm_createthreadstate() {
let state = crate::ring_state_init();
let vm = unsafe { vm_from_state(state) };
let thread_state = crate::vm::ring_vm_createthreadstate(vm);
assert!(!thread_state.is_null());
crate::vm::ring_vm_deletethreadstate(vm, thread_state);
}
#[test]
fn test_vm_loadfunc2_str() {
let state = crate::ring_state_init();
let vm = unsafe { vm_from_state(state) };
crate::vm::ring_vm_runcode(vm, b"func testlf() see(1)\0");
let result = crate::vm::ring_vm_loadfunc2_str(vm, "testlf");
let _ = result;
}
#[test]
fn test_vm_fetch() {
let state = crate::ring_state_init();
let vm = unsafe { vm_from_state(state) };
crate::vm::ring_vm_fetch(vm);
}
#[test]
fn test_vm_fetch2() {
let state = crate::ring_state_init();
let vm = unsafe { vm_from_state(state) };
crate::vm::ring_vm_fetch2(vm);
}
#[test]
fn test_vm_loadcode() {
let state = crate::ring_state_init();
let vm = unsafe { vm_from_state(state) };
crate::vm::ring_vm_loadcode(vm);
}
#[test]
fn test_vm_mutexfunctions() {
let state = crate::ring_state_init();
let vm = unsafe { vm_from_state(state) };
extern "C" fn create_mock() -> *mut std::ffi::c_void {
std::ptr::null_mut()
}
extern "C" fn lock_mock(_ptr: *mut std::ffi::c_void) {}
extern "C" fn unlock_mock(_ptr: *mut std::ffi::c_void) {}
extern "C" fn destroy_mock(_ptr: *mut std::ffi::c_void) {}
crate::vm::ring_vm_mutexfunctions(
vm,
Some(create_mock),
Some(lock_mock),
Some(unlock_mock),
Some(destroy_mock),
);
}
#[test]
fn test_vm_mutex_guard_type_exists() {
use crate::vm::VmMutexGuard;
let _guard: Option<VmMutexGuard> = None;
}
#[test]
fn test_vm_cust_mutex_guard_type_exists() {
use crate::vm::CustMutexGuard;
let _guard: Option<CustMutexGuard> = None;
}
crate::ring_func!(test_macro_func_for_tests, |_: *mut std::ffi::c_void| {});
#[test]
fn test_macro_ring_func() {
let _f: extern "C" fn(*mut std::ffi::c_void) = test_macro_func_for_tests;
}
#[test]
fn test_macro_ring_libinit() {
crate::ring_libinit!("test1" => test_macro_func_for_tests);
}
macro_rules! verify_fn_sig {
($test_name:ident, $func_path:path, $ty:ty) => {
#[test]
fn $test_name() {
let _f: $ty = $func_path;
let _ = _f;
}
};
}
verify_fn_sig!(
test_api_sig_paracount,
crate::ring_api_paracount,
fn(*mut std::ffi::c_void) -> i32
);
verify_fn_sig!(
test_api_sig_isstring,
crate::ring_api_isstring,
fn(*mut std::ffi::c_void, i32) -> bool
);
verify_fn_sig!(
test_api_sig_isnumber,
crate::ring_api_isnumber,
fn(*mut std::ffi::c_void, i32) -> bool
);
verify_fn_sig!(
test_api_sig_ispointer,
crate::ring_api_ispointer,
fn(*mut std::ffi::c_void, i32) -> bool
);
verify_fn_sig!(
test_api_sig_isptr,
crate::ring_api_isptr,
fn(*mut std::ffi::c_void, i32) -> bool
);
verify_fn_sig!(
test_api_sig_iscpointer,
crate::ring_api_iscpointer,
fn(*mut std::ffi::c_void, i32) -> bool
);
verify_fn_sig!(
test_api_sig_islist,
crate::ring_api_islist,
fn(*mut std::ffi::c_void, i32) -> bool
);
verify_fn_sig!(
test_api_sig_islistornull,
crate::ring_api_islistornull,
fn(*mut std::ffi::c_void, i32) -> bool
);
verify_fn_sig!(
test_api_sig_isobject,
crate::ring_api_isobject,
fn(*mut std::ffi::c_void, i32) -> bool
);
verify_fn_sig!(
test_api_sig_iscpointerlist,
crate::ring_api_iscpointerlist,
fn(*mut std::ffi::c_void, crate::RingList) -> bool
);
verify_fn_sig!(
test_api_sig_getstring,
crate::ring_api_getstring,
fn(*mut std::ffi::c_void, i32) -> *const i8
);
verify_fn_sig!(
test_api_sig_getstringsize,
crate::ring_api_getstringsize,
fn(*mut std::ffi::c_void, i32) -> u32
);
verify_fn_sig!(
test_api_sig_getnumber,
crate::ring_api_getnumber,
fn(*mut std::ffi::c_void, i32) -> f64
);
verify_fn_sig!(
test_api_sig_getpointer,
crate::ring_api_getpointer,
fn(*mut std::ffi::c_void, i32) -> *mut std::ffi::c_void
);
verify_fn_sig!(
test_api_sig_getpointertype,
crate::ring_api_getpointertype,
fn(*mut std::ffi::c_void, i32) -> i32
);
verify_fn_sig!(
test_api_sig_getlist,
crate::ring_api_getlist,
fn(*mut std::ffi::c_void, i32) -> crate::RingList
);
verify_fn_sig!(
test_api_sig_getcpointerstatus,
crate::ring_api_getcpointerstatus,
fn(*mut std::ffi::c_void, i32) -> i32
);
verify_fn_sig!(
test_api_sig_iscpointernotassigned,
crate::ring_api_iscpointernotassigned,
fn(*mut std::ffi::c_void, i32) -> bool
);
verify_fn_sig!(
test_api_sig_retnumber,
crate::ring_api_retnumber,
fn(*mut std::ffi::c_void, f64)
);
verify_fn_sig!(
test_api_sig_retstringsize,
crate::ring_api_retstringsize,
fn(*mut std::ffi::c_void, u32)
);
verify_fn_sig!(
test_api_sig_retlist,
crate::ring_api_retlist,
fn(*mut std::ffi::c_void, crate::RingList)
);
verify_fn_sig!(
test_api_sig_retlistbyref,
crate::ring_api_retlistbyref,
fn(*mut std::ffi::c_void, crate::RingList)
);
verify_fn_sig!(
test_api_sig_retnewref,
crate::ring_api_retnewref,
fn(*mut std::ffi::c_void, crate::RingList)
);
verify_fn_sig!(
test_api_sig_newlist,
crate::ring_api_newlist,
fn(*mut std::ffi::c_void) -> crate::RingList
);
verify_fn_sig!(
test_api_sig_newlistusingblocks,
crate::ring_api_newlistusingblocks,
fn(*mut std::ffi::c_void, u32, u32) -> crate::RingList
);
verify_fn_sig!(
test_api_sig_newlistusingblocks1d,
crate::ring_api_newlistusingblocks1d,
fn(*mut std::ffi::c_void, u32) -> crate::RingList
);
verify_fn_sig!(
test_api_sig_newlistusingblocks2d,
crate::ring_api_newlistusingblocks2d,
fn(*mut std::ffi::c_void, u32, u32) -> crate::RingList
);
verify_fn_sig!(
test_api_sig_setnullpointer,
crate::ring_api_setnullpointer,
fn(*mut std::ffi::c_void, i32)
);
verify_fn_sig!(
test_api_sig_varpointer,
crate::ring_api_varpointer,
fn(*mut std::ffi::c_void, &[u8], &[u8]) -> *mut std::ffi::c_void
);
verify_fn_sig!(
test_api_sig_varvalue,
crate::ring_api_varvalue,
fn(*mut std::ffi::c_void, &[u8], i32)
);
verify_fn_sig!(
test_api_sig_intvalue,
crate::ring_api_intvalue,
fn(*mut std::ffi::c_void, &[u8])
);
verify_fn_sig!(
test_api_sig_floatvalue,
crate::ring_api_floatvalue,
fn(*mut std::ffi::c_void, &[u8])
);
verify_fn_sig!(
test_api_sig_getintpointer,
crate::ring_api_getintpointer,
fn(*mut std::ffi::c_void, i32) -> *mut i32
);
verify_fn_sig!(
test_api_sig_getfloatpointer,
crate::ring_api_getfloatpointer,
fn(*mut std::ffi::c_void, i32) -> *mut f32
);
verify_fn_sig!(
test_api_sig_getdoublepointer,
crate::ring_api_getdoublepointer,
fn(*mut std::ffi::c_void, i32) -> *mut f64
);
verify_fn_sig!(
test_api_sig_getcharpointer,
crate::ring_api_getcharpointer,
fn(*mut std::ffi::c_void, i32) -> *mut i8
);
verify_fn_sig!(
test_api_sig_acceptintvalue,
crate::ring_api_acceptintvalue,
fn(*mut std::ffi::c_void, i32)
);
verify_fn_sig!(
test_api_sig_acceptfloatvalue,
crate::ring_api_acceptfloatvalue,
fn(*mut std::ffi::c_void, i32)
);
verify_fn_sig!(
test_api_sig_ignorecpointertype,
crate::ring_api_ignorecpointertype,
fn(*mut std::ffi::c_void)
);
verify_fn_sig!(
test_api_sig_callerscope,
crate::ring_api_callerscope,
fn(*mut std::ffi::c_void) -> crate::RingList
);
verify_fn_sig!(
test_api_sig_scopescount,
crate::ring_api_scopescount,
fn(*mut std::ffi::c_void) -> i32
);
verify_fn_sig!(
test_api_sig_cpointercmp,
crate::ring_api_cpointercmp,
fn(*mut std::ffi::c_void, crate::RingList, crate::RingList) -> bool
);
verify_fn_sig!(
test_api_sig_error,
crate::ring_api_error,
fn(*mut std::ffi::c_void, &[u8])
);
#[test]
fn test_api_error_constants() {
assert!(!crate::RING_API_BADPARATYPE.is_empty());
assert!(!crate::RING_API_BADPARACOUNT.is_empty());
assert!(!crate::RING_API_BADPARARANGE.is_empty());
assert!(!crate::RING_API_BADPARALENGTH.is_empty());
assert!(!crate::RING_API_BADPARAVALUE.is_empty());
assert!(!crate::RING_API_NOTPOINTER.is_empty());
assert!(!crate::RING_API_NULLPOINTER.is_empty());
assert!(!crate::RING_API_EMPTYLIST.is_empty());
assert!(!crate::RING_API_INTERNALFAILURE.is_empty());
assert!(!crate::RING_API_RANGEEXCEEDED.is_empty());
}
#[test]
fn test_api_error_messages_null_terminated() {
assert!(crate::RING_API_BADPARATYPE.ends_with(&[0]));
assert!(crate::RING_API_BADPARACOUNT.ends_with(&[0]));
assert!(crate::RING_API_MISS1PARA.ends_with(&[0]));
assert!(crate::RING_API_MISS2PARA.ends_with(&[0]));
assert!(crate::RING_API_MISS3PARA.ends_with(&[0]));
assert!(crate::RING_API_MISS4PARA.ends_with(&[0]));
}
#[test]
fn test_pointer_type_constants() {
assert_eq!(crate::RING_CPOINTER_STATUS, 3);
assert_eq!(crate::RING_CPOINTERSTATUS_NOTASSIGNED, 2);
}
#[test]
fn test_output_constants() {
assert_eq!(crate::RING_OUTPUT_RETLIST, 0);
assert_eq!(crate::RING_OUTPUT_RETLISTBYREF, 1);
assert_eq!(crate::RING_OUTPUT_RETNEWREF, 2);
}
#[test]
fn test_var_constants() {
assert_eq!(crate::RING_VARVALUE_INT, 1);
assert_eq!(crate::RING_VARVALUE_FLOAT, 2);
assert_eq!(crate::RING_VAR_NAME, 1);
assert_eq!(crate::RING_VAR_TYPE, 2);
assert_eq!(crate::RING_VAR_VALUE, 3);
assert_eq!(crate::RING_VAR_PVALUETYPE, 4);
assert_eq!(crate::RING_VAR_PRIVATEFLAG, 5);
}
verify_fn_sig!(
test_api_sig_getstring_str,
crate::ring_api_getstring_str,
fn(*mut std::ffi::c_void, i32) -> &'static str
);
verify_fn_sig!(
test_api_sig_getstring_bytes,
crate::ring_api_getstring_bytes,
fn(*mut std::ffi::c_void, i32) -> &'static [u8]
);
verify_fn_sig!(
test_api_sig_getstringraw,
crate::ring_api_getstringraw,
fn(*mut std::ffi::c_void) -> crate::ffi::RingString
);
verify_fn_sig!(
test_api_sig_getcpointer2pointer,
crate::ring_api_getcpointer2pointer,
fn(*mut std::ffi::c_void, i32, &[u8]) -> *mut std::ffi::c_void
);
verify_fn_sig!(
test_api_sig_setptr,
crate::ring_api_setptr,
fn(*mut std::ffi::c_void, i32, *mut std::ffi::c_void, i32)
);
verify_fn_sig!(
test_api_sig_retstring_str,
crate::ring_api_retstring_str,
fn(*mut std::ffi::c_void, &str)
);
verify_fn_sig!(
test_api_sig_retstring2,
crate::ring_api_retstring2,
fn(*mut std::ffi::c_void, &[u8])
);
verify_fn_sig!(
test_api_sig_retcpointer,
crate::ring_api_retcpointer,
fn(*mut std::ffi::c_void, *mut std::ffi::c_void, &[u8])
);
verify_fn_sig!(
test_api_sig_retcpointer2,
crate::ring_api_retcpointer2,
fn(
*mut std::ffi::c_void,
*mut std::ffi::c_void,
&[u8],
Option<extern "C" fn(*mut std::ffi::c_void, *mut std::ffi::c_void)>,
)
);
verify_fn_sig!(
test_api_sig_retmanagedcpointer,
crate::ring_api_retmanagedcpointer,
fn(
*mut std::ffi::c_void,
*mut std::ffi::c_void,
&[u8],
extern "C" fn(*mut std::ffi::c_void, *mut std::ffi::c_void),
)
);
verify_fn_sig!(
test_api_sig_retlist2,
crate::ring_api_retlist2,
fn(*mut std::ffi::c_void, crate::RingList, i32)
);
verify_fn_sig!(
test_api_sig_varvalue_str,
crate::ring_api_varvalue_str,
fn(*mut std::ffi::c_void, &str, i32)
);
verify_fn_sig!(
test_api_sig_intvalue_str,
crate::ring_api_intvalue_str,
fn(*mut std::ffi::c_void, &str)
);
verify_fn_sig!(
test_api_sig_floatvalue_str,
crate::ring_api_floatvalue_str,
fn(*mut std::ffi::c_void, &str)
);
verify_fn_sig!(
test_api_sig_error_str,
crate::ring_api_error_str,
fn(*mut std::ffi::c_void, &str)
);
verify_fn_sig!(
test_api_sig_register_function,
crate::ring_register_function,
fn(crate::RingState, &[u8], crate::RingFunc)
);
verify_fn_sig!(
test_api_sig_register_function_str,
crate::ring_register_function_str,
fn(crate::RingState, &str, crate::RingFunc)
);
#[test]
fn test_ring_list_getstring_str() {
let list = crate::ring_list_new(0);
crate::ring_list_addstring(list, b"hello\0");
let s = crate::ring_list_getstring_str(list, 1);
assert_eq!(s, "hello");
}
#[test]
fn test_ring_state_cgiheader() {
let state = crate::ring_state_init();
crate::ring_state_cgiheader(state);
}
verify_fn_sig!(
test_vm_sig_callfunction,
crate::vm::ring_vm_callfunction,
fn(crate::RingVM, &[u8])
);
verify_fn_sig!(
test_vm_sig_callfunction_str,
crate::vm::ring_vm_callfunction_str,
fn(crate::RingVM, &str)
);
verify_fn_sig!(
test_vm_sig_mutexdestroy,
crate::vm::ring_vm_mutexdestroy,
fn(crate::RingVM)
);
verify_fn_sig!(
test_vm_sig_runcodefromthread,
crate::vm::ring_vm_runcodefromthread,
fn(crate::RingVM, &[u8])
);
verify_fn_sig!(
test_vm_sig_runcodefromthread_str,
crate::vm::ring_vm_runcodefromthread_str,
fn(crate::RingVM, &str)
);
verify_fn_sig!(
test_vm_sig_call2,
crate::vm::ring_vm_call2,
fn(crate::RingVM)
);
verify_fn_sig!(
test_vm_sig_aftercfunction,
crate::vm::ring_vm_aftercfunction,
fn(crate::RingVM, *mut std::ffi::c_void)
);
verify_fn_sig!(
test_vm_sig_callfuncwithouteval,
crate::vm::ring_vm_callfuncwithouteval,
fn(crate::RingVM, &[u8], bool)
);
verify_fn_sig!(
test_vm_sig_callfuncwithouteval_str,
crate::vm::ring_vm_callfuncwithouteval_str,
fn(crate::RingVM, &str, bool)
);
verify_fn_sig!(
test_vm_sig_showbytecode,
crate::vm::ring_vm_showbytecode,
fn(crate::RingVM)
);
verify_fn_sig!(
test_vm_sig_showerrormessage,
crate::vm::ring_vm_showerrormessage,
fn(crate::RingVM, &[u8])
);
verify_fn_sig!(
test_vm_sig_showerrormessage_str,
crate::vm::ring_vm_showerrormessage_str,
fn(crate::RingVM, &str)
);
verify_fn_sig!(
test_vm_sig_shutdown,
crate::vm::ring_vm_shutdown,
fn(crate::RingVM, i32)
);
verify_fn_sig!(
test_vm_sig_bytecodefornewthread,
crate::vm::ring_vm_bytecodefornewthread,
fn(crate::RingVM, crate::RingVM)
);
verify_fn_sig!(
test_vm_sig_statecustmutexlock,
crate::vm::ring_vm_statecustmutexlock,
fn(*mut std::ffi::c_void, u32)
);
verify_fn_sig!(
test_vm_sig_statecustmutexunlock,
crate::vm::ring_vm_statecustmutexunlock,
fn(*mut std::ffi::c_void, u32)
);
#[test]
fn test_type_aliases() {
let s: crate::RingState = std::ptr::null_mut();
let _ = s;
let l: crate::RingList = std::ptr::null_mut();
let _ = l;
let v: crate::RingVM = std::ptr::null_mut();
let _ = v;
}