add ffi tests using f64

This commit is contained in:
Bennet Bleßmann
2025-01-20 23:00:03 +01:00
committed by Bennet Bleßmann
parent f91aedcc2f
commit 9d8906da30
4 changed files with 129 additions and 0 deletions

101
tests/scryer/ffi.rs Normal file
View File

@@ -0,0 +1,101 @@
use std::{
env::consts::{DLL_PREFIX, DLL_SUFFIX},
io::Write,
path::Path,
process::Stdio,
};
use crate::helper::load_module_test;
#[test]
fn ffi_f64_nan() {
let tmp_dir: &Path = env!("CARGO_TARGET_TMPDIR").as_ref();
println!("CARGO_TARGET_TMPDIR: {tmp_dir:?}");
// technically UB as tests are by default multi-threaded,
// but there is currently no other easy way to get the dynamic library file path as an input into a load_module_test test
std::env::set_var(
"ffi_f64_nan_LIB",
tmp_dir.join(format!("{DLL_PREFIX}ffi_f64_nan{DLL_SUFFIX}")),
);
let mut child = std::process::Command::new("rustc")
.stdin(Stdio::piped())
.arg("--crate-type=dylib")
.arg("--crate-name=ffi_f64_nan")
.arg("--out-dir")
.arg(tmp_dir)
.arg("-")
.spawn()
.unwrap();
child
.stdin
.take()
.unwrap()
.write_all(
r##"
#[no_mangle]
extern "C" fn ffi_f64_nan() -> f64 {
f64::NAN
}
"##
.as_bytes(),
)
.unwrap();
assert!(child.wait().unwrap().success());
load_module_test(
"tests-pl/ffi_f64_nan.pl",
" error(evaluation_error(undefined),round/1).\n",
);
}
#[test]
fn ffi_f64_minus_zero() {
let tmp_dir: &Path = env!("CARGO_TARGET_TMPDIR").as_ref();
println!("CARGO_TARGET_TMPDIR: {tmp_dir:?}");
// technically UB as tests are by default multi-threaded,
// but there is currently no other easy way to get the dynamic library file path as an input into a load_module_test test
std::env::set_var(
"ffi_f64_minus_zero_LIB",
tmp_dir.join(format!("{DLL_PREFIX}ffi_f64_minus_zero{DLL_SUFFIX}")),
);
let mut child = std::process::Command::new("rustc")
.stdin(Stdio::piped())
.arg("--crate-type=dylib")
.arg("--crate-name=ffi_f64_minus_zero")
.arg("--out-dir")
.arg(tmp_dir)
.arg("-")
.spawn()
.unwrap();
child
.stdin
.take()
.unwrap()
.write_all(
r##"
#[no_mangle]
extern "C" fn ffi_f64_minus_zero() -> f64 {
-0.0
}
#[no_mangle]
extern "C" fn signum(f: f64) -> f64 {
f.signum()
}
"##
.as_bytes(),
)
.unwrap();
assert!(child.wait().unwrap().success());
// note: ouput is currently wrong correct would be 1.0,1.0
load_module_test("tests-pl/ffi_f64_minus_zero.pl", "-1.0,1.0");
}

View File

@@ -2,6 +2,8 @@ mod helper;
mod issues;
mod src_tests;
mod ffi;
/// To add new cli test copy an existing .toml file in `tests/scryer/cli/issues/` or `tests/scryer/cli/issues/src_tests/`,
/// adjust as necessary the `-f` and `--no-add-history` args should be kept but additional args may be added.
/// For input on stdin add a .stdin file with the same filename.