goatd 0.1.1

Greatest Of All Tree Decompositions: tree decompositions of graphs — elimination orders, FlowCutter, multilevel bisection — with PACE .gr/.td I/O and a command-line solver.
Documentation
use std::error::Error as _;

use goatd::Error;

#[test]
fn errors_with_context_display_that_context_verbatim() {
    for error in [
        Error::InvalidInput("bad parameter".into()),
        Error::Parse("bad graph".into()),
        Error::InvalidDecomposition("bad bags".into()),
        Error::TooLarge("too many vertices".into()),
    ] {
        let expected = match &error {
            Error::InvalidInput(message)
            | Error::Parse(message)
            | Error::InvalidDecomposition(message)
            | Error::TooLarge(message) => message,
            Error::NoDecomposition => unreachable!(),
            _ => unreachable!("the test constructs only errors with stored context"),
        };
        assert_eq!(error.to_string(), expected.as_str());
        assert!(error.source().is_none());
    }
}

#[test]
fn a_missing_flowcutter_result_has_a_stable_public_message() {
    let error = Error::NoDecomposition;

    assert_eq!(error.to_string(), "FlowCutter returned no decomposition");
    assert!(error.source().is_none());
}