use super::{Backend, BaseBackend};
use crate::substance::{BinaryMixKind, CustomMix, IncompPure, PredefinedMix, Pure, Substance};
pub trait DefaultBackend {
fn default_backend(&self) -> Backend;
}
impl DefaultBackend for Substance {
fn default_backend(&self) -> Backend {
match self {
Substance::Pure(pure) => pure.default_backend(),
Substance::IncompPure(incomp_pure) => incomp_pure.default_backend(),
Substance::PredefinedMix(predefined_mix) => predefined_mix.default_backend(),
Substance::BinaryMix(binary_mix) => binary_mix.kind.default_backend(),
Substance::CustomMix(mix) => mix.default_backend(),
}
}
}
impl DefaultBackend for Pure {
fn default_backend(&self) -> Backend {
BaseBackend::Heos.into()
}
}
impl DefaultBackend for IncompPure {
fn default_backend(&self) -> Backend {
BaseBackend::Incomp.into()
}
}
impl DefaultBackend for PredefinedMix {
fn default_backend(&self) -> Backend {
BaseBackend::Heos.into()
}
}
impl DefaultBackend for BinaryMixKind {
fn default_backend(&self) -> Backend {
BaseBackend::Incomp.into()
}
}
impl DefaultBackend for CustomMix {
fn default_backend(&self) -> Backend {
BaseBackend::Heos.into()
}
}
#[cfg(test)]
mod tests {
use rstest::*;
use strum::IntoEnumIterator;
use super::*;
#[rstest]
#[case(Pure::Water, BaseBackend::Heos.into())]
#[case(IncompPure::Water, BaseBackend::Incomp.into())]
#[case(PredefinedMix::R444A, BaseBackend::Heos.into())]
#[case(BinaryMixKind::MPG.with_fraction(0.4).unwrap(), BaseBackend::Incomp.into())]
#[case(
CustomMix::mass_based([(Pure::Water, 0.6), (Pure::Ethanol, 0.4)])
.unwrap(),
BaseBackend::Heos.into()
)]
fn substance(#[case] value: impl Into<Substance>, #[case] expected: Backend) {
let sut: Substance = value.into();
let res = sut.default_backend();
assert_eq!(res, expected);
}
#[test]
fn pure() {
for substance in Pure::iter() {
let res = substance.default_backend();
assert_eq!(res, BaseBackend::Heos.into());
}
}
#[test]
fn incomp_pure() {
for substance in IncompPure::iter() {
let res = substance.default_backend();
assert_eq!(res, BaseBackend::Incomp.into());
}
}
#[test]
fn predefined_mix() {
for substance in PredefinedMix::iter() {
let res = substance.default_backend();
assert_eq!(res, BaseBackend::Heos.into());
}
}
#[test]
fn binary_mix_kind() {
for substance in BinaryMixKind::iter() {
let res = substance.default_backend();
assert_eq!(res, BaseBackend::Incomp.into());
}
}
#[test]
fn custom_mix() {
let mix = CustomMix::mass_based([(Pure::Water, 0.6), (Pure::Ethanol, 0.4)]).unwrap();
let res = mix.default_backend();
assert_eq!(res, BaseBackend::Heos.into());
}
}