echoes 0.9.0

Find duplicated Rust doctests, functions and contexts
Documentation
//! Original boolean witnesses through public comparison.

#[path = "support/dependency.rs"]
mod support;

fn equal_fixture(id: &str) {
    let case = support::cases()
        .iter()
        .find(|case| case.id == id && case.family == "boolean" && case.expected == "same")
        .unwrap();
    let form = |source: &str| syn_canon::canonicalize(syn::parse_str(source).unwrap());
    let failing = |source: &str| syn_canon::canonicalize_failing(syn::parse_str(source).unwrap());
    let left = form(&case.a);
    let right = form(&case.b);
    assert_eq!(left, right, "{id}");
    assert_eq!(left.leaf_tokens(), right.leaf_tokens());
    assert_eq!(left.body_units(), right.body_units());
    assert_ne!(failing(&case.a), failing(&case.b));
}

#[test]
fn boolean_double_negation() {
    equal_fixture("A04_double_not");
}

#[test]
fn boolean_value_branches() {
    equal_fixture("A05_boolean_tail");
}

#[test]
fn boolean_demorgan() {
    equal_fixture("A06_demorgan");
}

#[test]
fn boolean_compare_true() {
    equal_fixture("A11_compare_true");
}

#[test]
fn boolean_branch_inversion() {
    equal_fixture("A16_branch_inversion");
}

#[test]
fn boolean_literal_condition() {
    equal_fixture("A19_literal_condition");
}

#[test]
fn boolean_inherited_negative_fixtures() {
    for case in support::cases()
        .iter()
        .filter(|case| case.expected != "same")
    {
        let parsed = |source: &str| syn::parse_str(source).unwrap();
        assert_ne!(
            syn_canon::canonicalize(parsed(&case.a)),
            syn_canon::canonicalize(parsed(&case.b)),
            "{}",
            case.id
        );
        assert_ne!(
            syn_canon::canonicalize_failing(parsed(&case.a)),
            syn_canon::canonicalize_failing(parsed(&case.b)),
            "{}",
            case.id
        );
    }
}

#[test]
fn boolean_adjacent_proof_rejections() {
    for (left, right) in [
        ("fn f(a: u8) { !!a }", "fn f(a: u8) { a }"),
        ("fn f(a: Custom) { !!a }", "fn f(a: Custom) { a }"),
        (
            "fn f() { if read(&D) { true } else { false } }",
            "fn f() { read(&D) }",
        ),
        (
            "fn f() { !(left() && right()) }",
            "fn f() { !left() || !right() }",
        ),
        ("fn f(a: Custom) { a == true }", "fn f(a: Custom) { a }"),
        (
            "fn f(a: Custom,b: Custom) { (a == b) == true }",
            "fn f(a: Custom,b: Custom) { a == b }",
        ),
        (
            "fn f() { if !read(&D) { left() } else { right() } }",
            "fn f() { if read(&D) { right() } else { left() } }",
        ),
        ("fn f() { if true { 0 } else { 0u8 } }", "fn f() { 0 }"),
        (
            "fn f() { if true { &[] } else { &[1u8] } }",
            "fn f() { &[] }",
        ),
        ("fn f(a: bool) { &!!a }", "fn f(a: bool) { &a }"),
    ] {
        assert_ne!(
            syn_canon::canonicalize(syn::parse_str(left).unwrap()),
            syn_canon::canonicalize(syn::parse_str(right).unwrap())
        );
        assert_ne!(
            syn_canon::canonicalize_failing(syn::parse_str(left).unwrap()),
            syn_canon::canonicalize_failing(syn::parse_str(right).unwrap())
        );
    }
}