use simdispatch::{Backend, Selection};
fn resolve_supported(supported: &'static [Backend]) -> Backend {
Selection::new("SIMD_BACKEND").supports(supported).resolve()
}
fn resolve_full_ladder() -> Backend {
Selection::new("SIMD_BACKEND")
.supports(Backend::ALL)
.resolve()
}
#[test]
fn full_ladder_resolves_to_a_member() {
let backend = resolve_full_ladder();
assert!(Backend::ALL.contains(&backend));
}
#[test]
fn empty_supported_set_resolves_to_scalar() {
assert_eq!(resolve_supported(&[]), Backend::Scalar);
}
#[test]
fn scalar_only_set_resolves_to_scalar() {
assert_eq!(resolve_supported(&[Backend::Scalar]), Backend::Scalar);
}
#[test]
fn subset_result_is_supported_or_scalar() {
let subsets: &[&[Backend]] = &[
&[Backend::V2, Backend::V1],
&[Backend::V3GfniCrypto, Backend::V3],
&[Backend::NeonAes, Backend::Neon],
&[Backend::V2, Backend::Neon, Backend::Scalar],
&[Backend::V3, Backend::Scalar],
];
for &set in subsets {
let resolved = resolve_supported(set);
assert!(
set.contains(&resolved) || resolved == Backend::Scalar,
"resolved {resolved:?} for supported {set:?}"
);
}
}
#[test]
fn same_supported_set_agrees_across_resolutions() {
let set: &[Backend] = &[Backend::V3, Backend::V2, Backend::V1, Backend::Scalar];
let first = resolve_supported(set);
let second = resolve_supported(set);
assert_eq!(first, second);
}
#[test]
#[cfg(feature = "internals")]
fn internals_resolve_with_is_stable_across_calls() {
let on_host = |b: Backend| matches!(b, Backend::V3GfniCrypto | Backend::V3 | Backend::V2);
let set: &[Backend] = &[Backend::V3, Backend::V2, Backend::V1, Backend::Scalar];
let a = simdispatch::internals::resolve_with(set, on_host, None);
let b = simdispatch::internals::resolve_with(set, on_host, None);
assert_eq!(a, b);
assert_eq!(a, Backend::V3);
}