#![deny(clippy::branches_sharing_code, clippy::if_same_then_else)]
#![allow(dead_code)]
#![allow(
    clippy::mixed_read_write_in_expression,
    clippy::uninlined_format_args,
    clippy::needless_else
)]

// This tests valid if blocks that shouldn't trigger the lint

// Tests with value references are includes in "shared_code_at_bottom.rs"

fn valid_examples() {
    let x = 2;

    // The edge statements are different
    if x == 9 {
        let y = 1 << 5;

        println!("This is the same: vvv");
        let _z = y;
        println!("The block expression is different");

        println!("Different end 1");
    } else {
        let y = 1 << 7;

        println!("This is the same: vvv");
        let _z = y;
        println!("The block expression is different");

        println!("Different end 2");
    }

    // No else
    if x == 2 {
        println!("Hello world!");
        println!("Hello back, how are you?");

        // This is different vvvv
        println!("Howdy stranger =^.^=");

        println!("Bye Bye World");
    } else if x == 9 {
        println!("Hello world!");
        println!("Hello back, how are you?");

        // This is different vvvv
        println!("Hello reviewer :D");

        println!("Bye Bye World");
    }

    // Overlapping statements only in else if blocks -> Don't lint
    if x == 0 {
        println!("I'm important!")
    } else if x == 17 {
        println!("I share code in else if");

        println!("x is 17");
    } else {
        println!("I share code in else if");

        println!("x is nether x nor 17");
    }

    // Mutability is different
    if x == 13 {
        let mut y = 9;
        println!("Value y is: {}", y);
        y += 16;
        let _z1 = y;
    } else {
        let y = 9;
        println!("Value y is: {}", y);
        let _z2 = y;
    }

    // Same blocks but at start and bottom so no `if_same_then_else` lint
    if x == 418 {
        let y = 9;
        let z = 8;
        let _ = (x, y, z);
        // Don't tell the programmer, my code is also in the else block
    } else if x == 419 {
        println!("+-----------+");
        println!("|           |");
        println!("|  O     O  |");
        println!("|     °     |");
        println!("|  \\_____/  |");
        println!("|           |");
        println!("+-----------+");
    } else {
        let y = 9;
        let z = 8;
        let _ = (x, y, z);
        // I'm so much better than the x == 418 block. Trust me
    }

    let x = 1;
    if true {
        println!("{}", x);
    } else {
        let x = 2;
        println!("{}", x);
    }

    // Let's test empty blocks
    if false {
    } else {
    }
    //~^^^ ERROR: this `if` has identical blocks
}

/// This makes sure that the `if_same_then_else` masks the `shared_code_in_if_blocks` lint
fn trigger_other_lint() {
    let x = 0;
    let y = 1;

    // Same block
    if x == 0 {
        let u = 19;
        println!("How are u today?");
        let _ = "This is a string";
    } else {
        let u = 19;
        println!("How are u today?");
        let _ = "This is a string";
    }
    //~^^^^^^^^^ ERROR: this `if` has identical blocks

    // Only same expression
    let _ = if x == 6 { 7 } else { 7 };
    //~^ ERROR: this `if` has identical blocks

    // Same in else if block
    let _ = if x == 67 {
        println!("Well I'm the most important block");
        "I'm a pretty string"
    } else if x == 68 {
        println!("I'm a doppelgänger");

        if y == 90 { "=^.^=" } else { ":D" }
    } else {
        println!("I'm a doppelgänger");

        if y == 90 { "=^.^=" } else { ":D" }
    };
    //~^^^^^^^^^ ERROR: this `if` has identical blocks

    if x == 0 {
        println!("I'm single");
    } else if x == 68 {
        println!("I'm a doppelgänger");
    } else {
        println!("I'm a doppelgänger");
    }
    //~^^^^^ ERROR: this `if` has identical blocks
}

fn main() {}
