--- /dev/null
+:- use_module(library(os)).
+:- use_module(library(ffi)).
+
+test :-
+ getenv("ffi_f64_minus_zero_LIB", LIB),
+ use_foreign_module(LIB, ['ffi_f64_minus_zero'([], f64), 'signum'([f64], f64)]),
+ ffi:'ffi_f64_minus_zero'(N),
+ A is max(0.0, N),
+ B is max(N, 0.0),
+ ffi:'signum'(A, SA),
+ ffi:'signum'(B, SB),
+ write((SA, SB)),
+ -1.0 is SA, % incorrect, based on https://www.swi-prolog.org/pldoc/man?function=max/2 -0.0 is less than 0.0 so A and B should be 0.0 for which signum should be 1
+ 1.0 is SB.
+
+:- initialization(test).
--- /dev/null
+:- use_module(library(os)).
+:- use_module(library(ffi)).
+
+test :-
+ getenv("ffi_f64_nan_LIB", LIB),
+ use_foreign_module(LIB, ['ffi_f64_nan'([], f64)]),
+ ffi:'ffi_f64_nan'(N),
+ _ is round(N).
+
+:- initialization(test).
--- /dev/null
+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");
+}