veripb-parser 0.1.2

VeriPB parsing library for OPB, WCNF, and DIMACS CNF formats.
Documentation
use malachite_bigint::BigInt;
use num_traits::{One, Zero};
use veripb_parser::wcnf_parser::parse_wcnf_from_file;

#[test]
fn parse_wcnf_empty() {
    let (formula, var_names) = match parse_wcnf_from_file("./tests/instances/empty.wcnf") {
        Ok(formula) => formula,
        Err(e) => {
            eprintln!("Parsing error: {e:?}");
            panic!();
        }
    };

    assert_eq!(formula.len(), 0, "Formula should contain 0 clauses.");
    assert_eq!(
        formula.objective.as_ref().unwrap().len(),
        0,
        "Objective should contain 0 terms."
    );
    assert!(
        formula.objective.as_ref().unwrap().constant.is_zero(),
        "Objective constant should be 0."
    );
    assert_eq!(var_names.len(), 0, "Formula should contain 0 variables.");
}

#[test]
fn parse_wcnf_empty_soft() {
    let (formula, var_names) =
        match parse_wcnf_from_file("./tests/instances/empty_soft_clause.wcnf") {
            Ok(formula) => formula,
            Err(e) => {
                eprintln!("Parsing error: {e:?}");
                panic!();
            }
        };

    assert_eq!(formula.len(), 0, "Formula should contain 0 clauses.");
    assert_eq!(
        formula.objective.as_ref().unwrap().len(),
        0,
        "Objective should contain 0 terms."
    );
    assert_eq!(
        formula.objective.as_ref().unwrap().constant,
        BigInt::one(),
        "Objective constant should be 1."
    );
    assert_eq!(var_names.len(), 0, "Formula should contain 0 variables.");
}

#[test]
fn parse_maxsat_1() {
    let (formula, var_names) = match parse_wcnf_from_file("./tests/instances/maxsat_mix.wcnf") {
        Ok(formula) => formula,
        Err(e) => {
            eprintln!("Parsing error: {e:?}");
            panic!();
        }
    };

    assert_eq!(formula.len(), 3, "Formula should contain 3 clauses.");
    assert_eq!(
        formula.objective.as_ref().unwrap().len(),
        1,
        "Objective should contain 1 terms."
    );
    assert_eq!(
        formula.objective.as_ref().unwrap().constant,
        BigInt::zero(),
        "Objective constant should be 0."
    );
    assert_eq!(var_names.len(), 5, "Formula should contain 5 variables.");
}

#[test]
fn parse_maxsat_2() {
    let (formula, var_names) =
        match parse_wcnf_from_file("./tests/instances/maxsat_new_format.wcnf") {
            Ok(formula) => formula,
            Err(e) => {
                eprintln!("Parsing error: {e:?}");
                panic!();
            }
        };

    assert_eq!(formula.len(), 7, "Formula should contain 7 clauses.");
    assert_eq!(
        formula.objective.as_ref().unwrap().len(),
        4,
        "Objective should contain 4 terms."
    );
    assert_eq!(
        formula.objective.as_ref().unwrap().constant,
        BigInt::zero(),
        "Objective constant should be 0."
    );
    assert_eq!(var_names.len(), 8, "Formula should contain 8 variables.");
}

#[test]
fn parse_maxsat_cancelling_objective_lits() {
    let (formula, var_names) =
        match parse_wcnf_from_file("./tests/instances/maxsat_cancelling_objective_lits.wcnf") {
            Ok(formula) => formula,
            Err(e) => {
                eprintln!("Parsing error: {e:?}");
                panic!();
            }
        };

    assert_eq!(formula.len(), 0, "Formula should contain 0 clauses.");
    assert_eq!(
        formula.objective.as_ref().unwrap().len(),
        1,
        "Objective should contain 1 terms."
    );
    assert_eq!(
        formula.objective.as_ref().unwrap().constant,
        1038862559.into(),
        "Objective constant should be 1038862559."
    );
    assert_eq!(var_names.len(), 1, "Formula should contain 1 variables.");
}