use crate::cnf::VarId;
use crate::preprocess::gates::*;
use crate::tests::common::make_formula;
#[test]
fn detect_and_gate() {
let f = make_formula(3, vec![vec![-3, 1], vec![-3, 2], vec![3, -1, -2]]);
let gm = detect_gates(&f);
assert_eq!(gm.gates.len(), 1);
assert_eq!(gm.gates[0].gate_type, GateType::And);
assert!(gm.eliminated.contains(&VarId(2))); }
#[test]
fn detect_or_gate() {
let f = make_formula(3, vec![vec![3, -1], vec![3, -2], vec![-3, 1, 2]]);
let gm = detect_gates(&f);
assert_eq!(gm.gates.len(), 1);
assert_eq!(gm.gates[0].gate_type, GateType::Or);
}
#[test]
fn detect_xor_gate() {
let f = make_formula(
3,
vec![
vec![3, -1, 2],
vec![3, 1, -2],
vec![-3, 1, 2],
vec![-3, -1, -2],
],
);
let gm = detect_gates(&f);
assert_eq!(gm.gates.len(), 1);
assert_eq!(gm.gates[0].gate_type, GateType::Xor);
}
#[test]
fn detect_chain() {
let f = make_formula(
5,
vec![
vec![-3, 1],
vec![-3, 2],
vec![3, -1, -2],
vec![-4, 3],
vec![-4, 5],
vec![4, -3, -5],
],
);
let gm = detect_gates(&f);
assert_eq!(gm.gates.len(), 2);
}
#[test]
fn detect_ite_gate() {
let f = make_formula(
4,
vec![
vec![-1, -2, 4],
vec![-1, 2, -4],
vec![1, -3, 4],
vec![1, 3, -4],
],
);
let gm = detect_gates(&f);
assert_eq!(gm.gates.len(), 1, "should detect one ITE gate");
assert_eq!(gm.gates[0].gate_type, GateType::Ite);
assert!(gm.eliminated.contains(&VarId(3))); }
#[test]
fn an_odd_parity_encoding_is_not_reported_as_an_even_one() {
let f = make_formula(
3,
vec![
vec![3, -1, -2],
vec![-3, 1, -2],
vec![-3, -1, 2],
vec![3, 1, 2],
],
);
let gm = detect_gates(&f);
assert_eq!(gm.gates.len(), 1);
assert_eq!(
gm.gates[0].gate_type,
GateType::Xnor,
"an odd parity of positive literals is the negated output",
);
}
#[test]
fn detect_no_gate_for_random_clauses() {
let f = make_formula(
4,
vec![vec![1, 2, 3], vec![-1, -2], vec![2, 4], vec![-3, -4]],
);
let gm = detect_gates(&f);
assert!(gm.gates.is_empty(), "should detect no gates");
}