use std::process::Command;
use oxijolt::Shape;
use oxijolt_sys::{JPH_Quat, JPH_Quat_GetAxisAngle, JPH_Vec3, ASSERTS_ENABLED};
const CHILD_ENV: &str = "OXIJOLT_ASSERT_PROBE";
const OUTPUT_TAIL: usize = 4000;
#[test]
#[ignore = "run as a child process by a_failed_jolt_assertion_aborts_with_its_message"]
fn assertion_child() {
if std::env::var_os(CHILD_ENV).is_none() {
return;
}
Shape::new_sphere(1.0).unwrap();
let not_normalized = JPH_Quat {
x: 0.0,
y: 0.0,
z: 0.0,
w: 2.0,
};
let mut axis = JPH_Vec3 {
x: 0.0,
y: 0.0,
z: 0.0,
};
let mut angle = 0.0;
unsafe { JPH_Quat_GetAxisAngle(¬_normalized, &mut axis, &mut angle) };
}
#[test]
fn a_failed_jolt_assertion_aborts_with_its_message() {
let output = Command::new(std::env::current_exe().unwrap())
.args([
"assertion_child",
"--exact",
"--ignored",
"--test-threads=1",
"--nocapture",
])
.env(CHILD_ENV, "1")
.output()
.unwrap();
let tail = |bytes: &[u8]| {
String::from_utf8_lossy(&bytes[bytes.len().saturating_sub(OUTPUT_TAIL)..]).into_owned()
};
let (stdout, stderr) = (tail(&output.stdout), tail(&output.stderr));
let report = format!("{}\nstdout:\n{stdout}\nstderr:\n{stderr}", output.status);
if ASSERTS_ENABLED {
assert!(!output.status.success(), "the child survived: {report}");
for expected in ["Jolt assertion failed", "Quat.inl", "IsNormalized()"] {
assert!(stderr.contains(expected), "no {expected:?}: {report}");
}
} else {
assert!(output.status.success(), "the child failed: {report}");
}
}