#![warn(clippy::expect_fun_call)]
#![allow(
    clippy::to_string_in_format_args,
    clippy::uninlined_format_args,
    clippy::unnecessary_literal_unwrap
)]

macro_rules! one {
    () => {
        1
    };
}

fn main() {
    struct Foo;

    impl Foo {
        fn new() -> Self {
            Foo
        }

        fn expect(&self, msg: &str) {
            panic!("{}", msg)
        }
    }

    let with_some = Some("value");
    with_some.expect("error");

    let with_none: Option<i32> = None;
    with_none.expect("error");

    let error_code = 123_i32;
    let with_none_and_format: Option<i32> = None;
    with_none_and_format.unwrap_or_else(|| panic!("Error {}: fake error", error_code));
    //~^ expect_fun_call

    let with_none_and_as_str: Option<i32> = None;
    with_none_and_as_str.unwrap_or_else(|| panic!("Error {}: fake error", error_code));
    //~^ expect_fun_call

    let with_none_and_format_with_macro: Option<i32> = None;
    with_none_and_format_with_macro.unwrap_or_else(|| panic!("Error {}: fake error", one!()));
    //~^ expect_fun_call

    let with_ok: Result<(), ()> = Ok(());
    with_ok.expect("error");

    let with_err: Result<(), ()> = Err(());
    with_err.expect("error");

    let error_code = 123_i32;
    let with_err_and_format: Result<(), ()> = Err(());
    with_err_and_format.unwrap_or_else(|_| panic!("Error {}: fake error", error_code));
    //~^ expect_fun_call

    let with_err_and_as_str: Result<(), ()> = Err(());
    with_err_and_as_str.unwrap_or_else(|_| panic!("Error {}: fake error", error_code));
    //~^ expect_fun_call

    let with_dummy_type = Foo::new();
    with_dummy_type.expect("another test string");

    let with_dummy_type_and_format = Foo::new();
    with_dummy_type_and_format.expect(&format!("Error {}: fake error", error_code));

    let with_dummy_type_and_as_str = Foo::new();
    with_dummy_type_and_as_str.expect(format!("Error {}: fake error", error_code).as_str());

    //Issue #2937
    Some("foo").unwrap_or_else(|| panic!("{} {}", 1, 2));
    //~^ expect_fun_call

    //Issue #2979 - this should not lint
    {
        let msg = "bar";
        Some("foo").expect(msg);
    }

    {
        fn get_string() -> String {
            "foo".to_string()
        }

        fn get_static_str() -> &'static str {
            "foo"
        }

        fn get_non_static_str(_: &u32) -> &str {
            "foo"
        }

        const fn const_evaluable() -> &'static str {
            "foo"
        }

        Some("foo").unwrap_or_else(|| panic!("{}", get_string()));
        //~^ expect_fun_call
        Some("foo").unwrap_or_else(|| panic!("{}", get_string()));
        //~^ expect_fun_call
        Some("foo").unwrap_or_else(|| panic!("{}", get_string()));
        //~^ expect_fun_call

        Some("foo").unwrap_or_else(|| panic!("{}", get_static_str()));
        //~^ expect_fun_call
        Some("foo").unwrap_or_else(|| panic!("{}", get_non_static_str(&0)));
        //~^ expect_fun_call

        Some("foo").unwrap_or_else(|| panic!("{}", const_evaluable()));
        //~^ expect_fun_call

        const {
            Some("foo").expect(const_evaluable());
        }

        Some("foo").expect(const { const_evaluable() });
    }

    //Issue #3839
    Some(true).unwrap_or_else(|| panic!("key {}, {}", 1, 2));
    //~^ expect_fun_call

    //Issue #4912 - the receiver is a &Option
    {
        let opt = Some(1);
        let opt_ref = &opt;
        opt_ref.unwrap_or_else(|| panic!("{:?}", opt_ref));
        //~^ expect_fun_call
    }

    let format_capture: Option<i32> = None;
    format_capture.unwrap_or_else(|| panic!("{error_code}"));
    //~^ expect_fun_call

    let format_capture_and_value: Option<i32> = None;
    format_capture_and_value.unwrap_or_else(|| panic!("{error_code}, {}", 1));
    //~^ expect_fun_call

    // Issue #15056
    let a = false;
    Some(5).expect(if a { "a" } else { "b" });

    let return_in_expect: Option<i32> = None;
    return_in_expect.expect(if true {
        "Error"
    } else {
        return;
    });
}
