use super::{Backend, BackendUnavailable};
#[test]
fn all_lists_every_implementer() {
assert_eq!(
Backend::ALL,
&[
Backend::Accelerate,
Backend::Metal,
Backend::Cuda,
Backend::Simd,
Backend::Fused,
Backend::StableHlo
]
);
}
#[test]
fn compiled_is_the_build_time_half_of_status() {
for backend in Backend::ALL {
let build_absent = matches!(
backend.status(),
Err(BackendUnavailable::NotCompiled) | Err(BackendUnavailable::PlatformUnsupported)
);
assert_eq!(backend.compiled(), !build_absent, "{backend:?}");
}
}
#[test]
fn the_in_process_implementers_are_always_resident() {
assert!(Backend::Fused.compiled());
assert!(Backend::StableHlo.compiled());
assert_eq!(Backend::Fused.status(), Ok(()));
assert_eq!(Backend::StableHlo.status(), Ok(()));
}
#[test]
fn cuda_status_reports_the_build() {
let status = Backend::Cuda.status();
if cfg!(all(feature = "cuda", target_os = "linux")) {
match status {
Ok(()) => {}
Err(BackendUnavailable::Initialization(reason)) => {
assert!(
reason.contains("is not available") || reason == "no CUDA device",
"CUDA setup failed: {reason}"
);
}
Err(other) => panic!("unexpected CUDA status: {other}"),
}
} else if cfg!(feature = "cuda") {
assert_eq!(status, Err(BackendUnavailable::PlatformUnsupported));
} else {
assert_eq!(status, Err(BackendUnavailable::NotCompiled));
}
}
#[test]
fn simd_status_reports_the_build() {
let status = Backend::Simd.status();
if cfg!(feature = "simd") {
assert_eq!(status, Ok(()));
} else {
assert_eq!(status, Err(BackendUnavailable::NotCompiled));
}
}
#[test]
fn metal_status_reports_the_build() {
let status = Backend::Metal.status();
if cfg!(all(feature = "metal", target_os = "macos")) {
match status {
Ok(()) => {}
Err(BackendUnavailable::Initialization(reason)) => {
assert_eq!(reason, "no Metal device", "Metal setup failed: {reason}");
}
Err(other) => panic!("unexpected Metal status: {other}"),
}
} else if cfg!(feature = "metal") {
assert_eq!(status, Err(BackendUnavailable::PlatformUnsupported));
} else {
assert_eq!(status, Err(BackendUnavailable::NotCompiled));
}
}
#[test]
fn status_reports_the_build() {
let status = Backend::Accelerate.status();
if cfg!(all(feature = "accelerate", target_os = "macos")) {
assert_eq!(status, Ok(()));
} else if cfg!(feature = "accelerate") {
assert_eq!(status, Err(BackendUnavailable::PlatformUnsupported));
} else {
assert_eq!(status, Err(BackendUnavailable::NotCompiled));
}
}
#[test]
fn unavailability_reasons_display() {
for reason in [
BackendUnavailable::NotCompiled,
BackendUnavailable::PlatformUnsupported,
BackendUnavailable::Initialization("no device".into()),
BackendUnavailable::Poisoned("command buffer error".into()),
] {
assert!(!reason.to_string().is_empty());
}
}