use hyalite::{BACKEND_ENV_VAR, Backend, BackendChoice, Database, Error, Mode, Scoring};
fn scoring() -> Scoring {
Scoring::new(2, vec![1, -1, -1, 1], 2, 1).unwrap()
}
fn build_using_env() -> hyalite::Result<Database> {
Database::builder()
.sequences(&[vec![0u8, 1]])
.scoring(scoring())
.mode(Mode::Sw)
.max_query_len(4)
.build()
}
fn build_forcing(choice: BackendChoice) -> hyalite::Result<Database> {
Database::builder()
.sequences(&[vec![0u8, 1]])
.scoring(scoring())
.mode(Mode::Sw)
.max_query_len(4)
.backend(choice)
.build()
}
#[test]
fn hyalite_backend_env_var_is_honored_with_correct_precedence() {
let set = |v: &str| unsafe { std::env::set_var(BACKEND_ENV_VAR, v) };
let clear = || unsafe { std::env::remove_var(BACKEND_ENV_VAR) };
clear();
assert!(
build_using_env().unwrap().backend().is_available(),
"unset env should auto-resolve to an available backend"
);
set("scalar");
assert_eq!(
build_using_env().unwrap().backend(),
Backend::Scalar,
"HYALITE_BACKEND=scalar should build scalar"
);
set("auto");
assert!(
build_using_env().unwrap().backend().is_available(),
"auto should resolve to an available backend"
);
#[cfg(target_arch = "aarch64")]
let (bad_name, bad_backend) = ("sse4.1", Backend::Sse41);
#[cfg(not(target_arch = "aarch64"))]
let (bad_name, bad_backend) = ("neon", Backend::Neon);
set(bad_name);
assert_eq!(
build_using_env().unwrap_err(),
Error::BackendUnavailable {
backend: bad_backend
}
);
set("definitely-not-a-backend");
assert!(matches!(
build_using_env().unwrap_err(),
Error::InvalidBackendName { .. }
));
set(bad_name);
assert_eq!(
build_forcing(BackendChoice::Force(Backend::Scalar))
.unwrap()
.backend(),
Backend::Scalar,
"explicit .backend() must override HYALITE_BACKEND"
);
clear();
}