use super::*;
fn inputs(scan_share: f64, merge_secs: f64) -> Inputs {
Inputs {
round: 16,
size_ratio: 3,
arrival_secs: 10.0,
merge_secs,
merge_query_share: 0.5,
scan_share,
false_positive_rate: 0.01,
}
}
fn merges(plan: &Plan) -> Vec<u32> {
(1..=16).map(|t| plan.merge_after(t)).collect()
}
#[test]
fn without_scans_nothing_is_merged() {
let plan = Plan::solve(&inputs(0.0, 0.1));
assert!(merges(&plan).iter().all(|&units| units == 1), "{plan:?}");
}
#[test]
fn cheap_merges_under_scans_are_planned_early() {
let plan = Plan::solve(&inputs(0.5, 0.1));
let merges = merges(&plan);
let first = merges
.iter()
.position(|&units| units > 1)
.expect("a merge is planned");
assert!(first < 8, "the first merge comes early: {merges:?}");
}
#[test]
fn merges_dearer_than_their_benefit_are_not_planned() {
let plan = Plan::solve(&inputs(0.001, 5.0));
assert!(merges(&plan).iter().all(|&units| units == 1), "{plan:?}");
}
#[test]
fn a_dear_merge_pays_before_a_long_global_merge() {
let plan = Plan::solve(&inputs(0.5, 1_000.0));
let merges = merges(&plan);
assert!(
merges.iter().take(14).all(|&units| units == 1),
"{merges:?}"
);
assert!(merges.iter().any(|&units| units > 1), "{merges:?}");
}
#[test]
fn the_plan_is_the_same_for_the_same_inputs() {
let a = Plan::solve(&inputs(0.3, 1.0));
let b = Plan::solve(&inputs(0.3, 1.0));
assert_eq!(a, b);
}
#[test]
fn nothing_is_merged_past_the_round() {
let plan = Plan::solve(&inputs(0.5, 0.1));
assert_eq!(plan.merge_after(17), 1);
assert_eq!(plan.merge_after(u32::MAX), 1);
}