mod common;
use transcribe_cpp::{
abi_struct_size, backend_available, compiled_version, device_count, devices, header_hash,
init_backends_default, version, AbiStruct, Backend, DeviceType, Error, Model,
};
#[test]
fn version_gate_agrees() {
assert_eq!(version(), compiled_version());
assert!(!version().is_empty());
}
#[test]
fn header_hash_is_pinned() {
let h = header_hash();
assert_eq!(h.len(), 16, "hash: {h}");
assert!(h.chars().all(|c| c.is_ascii_hexdigit()));
}
#[test]
fn abi_struct_sizes_are_live() {
for which in [
AbiStruct::RunParams,
AbiStruct::Capabilities,
AbiStruct::Segment,
AbiStruct::SessionLimits,
] {
assert!(abi_struct_size(which) > 0, "{which:?} reported size 0");
}
}
#[test]
fn at_least_a_cpu_device() {
init_backends_default().expect("init_backends_default");
assert!(device_count() >= 1);
assert!(backend_available(Backend::Cpu));
let devices = devices();
assert!(devices.iter().any(|d| d.kind == "cpu"), "{devices:?}");
}
#[test]
fn devices_is_non_empty() {
init_backends_default().expect("init_backends_default");
let devices = devices();
assert!(!devices.is_empty(), "devices() returned empty");
}
#[test]
fn device_fields_are_well_formed() {
init_backends_default().expect("init_backends_default");
let devices = devices();
for (i, dev) in devices.iter().enumerate() {
assert_eq!(dev.index, Some(i), "device {i}: {dev:?}");
assert!(!dev.name.is_empty(), "device {i} empty name: {dev:?}");
assert!(!dev.kind.is_empty(), "device {i} empty kind: {dev:?}");
if let Some(id) = &dev.device_id {
assert!(!id.is_empty(), "device {i} empty device_id: {dev:?}");
}
if dev.kind == "cpu" {
assert_eq!(
dev.device_type,
DeviceType::Cpu,
"cpu-kind device {i} not DeviceType::Cpu: {dev:?}"
);
}
}
}
#[test]
fn missing_file_is_not_found() {
init_backends_default().expect("init_backends_default");
let err = Model::load("/no/such/model.gguf").unwrap_err();
assert!(
matches!(err, Error::ModelFileNotFound(_)),
"got {err:?} (status {})",
err.raw_status()
);
}
#[test]
fn junk_file_is_model_load_error() {
init_backends_default().expect("init_backends_default");
let dir = std::env::temp_dir();
let path = dir.join("transcribe-rs-junk.gguf");
std::fs::write(&path, b"not a gguf file at all").unwrap();
let err = Model::load(&path).unwrap_err();
let _ = std::fs::remove_file(&path);
assert!(
matches!(err, Error::ModelLoad(_)),
"got {err:?} (status {})",
err.raw_status()
);
}
#[test]
fn handles_are_send_sync() {
fn assert_send_sync<T: Send + Sync>() {}
fn assert_send<T: Send>() {}
assert_send_sync::<Model>();
assert_send::<transcribe_cpp::Session>();
}