use crate::cnf::CnfFormula;
use crate::preprocess::preprocess_backbone_eq_iter;
use crate::tests::common::clause;
use std::time::{Duration, Instant};
fn forcing_chain(k: u32, free: u32) -> CnfFormula {
let mut clauses = vec![clause(&[(0, true)])];
for i in 0..k {
clauses.push(clause(&[(i, false), (i + 1, true)]));
}
CnfFormula {
num_vars: k + 1 + free,
clauses,
}
}
fn is_unsat(f: &CnfFormula) -> bool {
f.clauses.iter().any(|c| c.literals.is_empty())
}
#[test]
fn imminent_deadline_bounds_pipeline_and_stays_sound() {
let formula = forcing_chain(20, 20);
let t = Instant::now();
let out = preprocess_backbone_eq_iter(
&formula,
Duration::from_secs(300),
Some(Duration::from_secs(300)),
Some(Instant::now() + Duration::from_millis(50)),
);
assert!(
t.elapsed() < Duration::from_secs(2),
"imminent deadline should bound preprocess, took {:?}",
t.elapsed(),
);
assert!(
!is_unsat(&out.formula),
"satisfiable input must not be reported UNSAT"
);
}
#[test]
fn no_deadline_finds_backbone_unchanged() {
let formula = forcing_chain(20, 0);
let out = preprocess_backbone_eq_iter(
&formula,
Duration::from_secs(300),
Some(Duration::from_secs(300)),
None,
);
assert!(!is_unsat(&out.formula));
assert!(
out.stats.forced_vars >= 1,
"expected forced vars with no deadline, got {}",
out.stats.forced_vars,
);
}