#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct SolutionConditions {
pub mv_conc: f64,
pub dv_conc: f64,
pub dntp_conc: f64,
pub dna_conc: f64,
pub dmso_conc: f64,
pub dmso_fact: f64,
pub formamide_conc: f64,
}
impl Default for SolutionConditions {
fn default() -> Self {
Self {
mv_conc: 50.0,
dv_conc: 1.5,
dntp_conc: 0.6,
dna_conc: 50.0,
dmso_conc: 0.0,
dmso_fact: 0.6,
formamide_conc: 0.0,
}
}
}
impl SolutionConditions {
pub fn with_mv_conc(mut self, mv_conc: f64) -> Self {
self.mv_conc = mv_conc;
self
}
pub fn with_dv_conc(mut self, dv_conc: f64) -> Self {
self.dv_conc = dv_conc;
self
}
pub fn with_dntp_conc(mut self, dntp_conc: f64) -> Self {
self.dntp_conc = dntp_conc;
self
}
pub fn with_dna_conc(mut self, dna_conc: f64) -> Self {
self.dna_conc = dna_conc;
self
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_default_conditions() {
let c = SolutionConditions::default();
assert!((c.mv_conc - 50.0).abs() < f64::EPSILON);
assert!((c.dv_conc - 1.5).abs() < f64::EPSILON);
assert!((c.dntp_conc - 0.6).abs() < f64::EPSILON);
assert!((c.dna_conc - 50.0).abs() < f64::EPSILON);
assert!((c.dmso_conc).abs() < f64::EPSILON);
assert!((c.dmso_fact - 0.6).abs() < f64::EPSILON);
assert!((c.formamide_conc).abs() < f64::EPSILON);
}
#[test]
fn test_builder_methods() {
let c = SolutionConditions::default()
.with_mv_conc(100.0)
.with_dv_conc(3.0)
.with_dntp_conc(0.8)
.with_dna_conc(250.0);
assert!((c.mv_conc - 100.0).abs() < f64::EPSILON);
assert!((c.dv_conc - 3.0).abs() < f64::EPSILON);
assert!((c.dntp_conc - 0.8).abs() < f64::EPSILON);
assert!((c.dna_conc - 250.0).abs() < f64::EPSILON);
}
}