use std::ffi::{CStr, CString};
use eclisp_sys as sys;
const CODE: &str = r#"
(defun hello-lisp ()
(format t "hello-lisp!~%")
:foo)
"#;
#[test]
fn runs() {
let program = CString::new("eclisp-test").unwrap();
let mut argv = [program.as_ptr().cast_mut()];
unsafe {
sys::cl_boot(1, argv.as_mut_ptr());
let source = CString::new(CODE).unwrap();
let lisp_string = sys::ecl_make_simple_base_string(source.as_ptr(), -1);
let form = sys::si_string_to_object(1, lisp_string);
sys::cl_eval(form);
let call = CString::new("(hello-lisp)").unwrap();
let lisp_string = sys::ecl_make_simple_base_string(call.as_ptr(), -1);
let form = sys::si_string_to_object(1, lisp_string);
let result = sys::cl_eval(form);
let printed = sys::cl_prin1_to_string(result);
let base = sys::ecl_null_terminated_base_string(printed);
let ptr = sys::ecl_base_string_pointer_safe(base);
let value = CStr::from_ptr(ptr).to_string_lossy().into_owned();
assert_eq!(value, ":FOO");
sys::cl_shutdown();
}
}