use std::collections::HashSet;
use super::snapshot::ConfigSnapshot;
use super::types::Variation;
pub trait VariationGenerator: Send + Sync {
fn next(
&mut self,
baseline: &ConfigSnapshot,
visited: &HashSet<Variation>,
) -> Option<Variation>;
fn name(&self) -> &'static str;
}
#[cfg(test)]
mod tests {
use super::super::types::{ParameterKind, VariationValue};
use super::*;
use ordered_float::OrderedFloat;
struct AlwaysOne;
impl VariationGenerator for AlwaysOne {
fn next(
&mut self,
_baseline: &ConfigSnapshot,
visited: &HashSet<Variation>,
) -> Option<Variation> {
let v = Variation {
parameter: ParameterKind::Temperature,
value: VariationValue::Float(OrderedFloat(1.0)),
};
if visited.contains(&v) { None } else { Some(v) }
}
fn name(&self) -> &'static str {
"always_one"
}
}
#[test]
fn generator_returns_variation_when_not_visited() {
let mut generator = AlwaysOne;
let baseline = ConfigSnapshot::default();
let visited = HashSet::new();
let v = generator.next(&baseline, &visited);
assert!(v.is_some());
assert_eq!(v.unwrap().parameter, ParameterKind::Temperature);
}
#[test]
fn generator_returns_none_when_visited() {
let mut generator = AlwaysOne;
let baseline = ConfigSnapshot::default();
let mut visited = HashSet::new();
visited.insert(Variation {
parameter: ParameterKind::Temperature,
value: VariationValue::Float(OrderedFloat(1.0)),
});
assert!(generator.next(&baseline, &visited).is_none());
}
#[test]
fn generator_name_is_static_str() {
let generator = AlwaysOne;
assert_eq!(generator.name(), "always_one");
}
#[test]
fn generator_is_send() {
fn assert_send<T: Send>() {}
assert_send::<AlwaysOne>();
}
}