#![warn(clippy::ip_constant)]
#![expect(clippy::identity_op)]
#![allow(clippy::eq_op)]

fn literal_test1() {
    use std::net::Ipv4Addr;
    let _ = Ipv4Addr::LOCALHOST;
    //~^ ip_constant
    let _ = Ipv4Addr::BROADCAST;
    //~^ ip_constant
    let _ = Ipv4Addr::UNSPECIFIED;
    //~^ ip_constant

    use std::net::Ipv6Addr;
    let _ = Ipv6Addr::LOCALHOST;
    //~^ ip_constant
    let _ = Ipv6Addr::UNSPECIFIED;
    //~^ ip_constant
}

fn literal_test2() {
    use std::net;
    let _ = net::Ipv4Addr::LOCALHOST;
    //~^ ip_constant
    let _ = net::Ipv4Addr::BROADCAST;
    //~^ ip_constant
    let _ = net::Ipv4Addr::UNSPECIFIED;
    //~^ ip_constant

    let _ = net::Ipv6Addr::LOCALHOST;
    //~^ ip_constant
    let _ = net::Ipv6Addr::UNSPECIFIED;
    //~^ ip_constant
}

fn literal_test3() {
    let _ = std::net::Ipv4Addr::LOCALHOST;
    //~^ ip_constant
    let _ = std::net::Ipv4Addr::BROADCAST;
    //~^ ip_constant
    let _ = std::net::Ipv4Addr::UNSPECIFIED;
    //~^ ip_constant

    let _ = std::net::Ipv6Addr::LOCALHOST;
    //~^ ip_constant
    let _ = std::net::Ipv6Addr::UNSPECIFIED;
    //~^ ip_constant
}

fn wrapped_in_parens() {
    let _ = std::net::Ipv4Addr::LOCALHOST;
    //~^ ip_constant
    let _ = std::net::Ipv4Addr::BROADCAST;
    //~^ ip_constant
    let _ = std::net::Ipv4Addr::UNSPECIFIED;
    //~^ ip_constant

    let _ = std::net::Ipv6Addr::LOCALHOST;
    //~^ ip_constant
    let _ = std::net::Ipv6Addr::UNSPECIFIED;
    //~^ ip_constant
}

const CONST_U8_0: u8 = 0;
const CONST_U8_1: u8 = 1;
const CONST_U8_127: u8 = 127;
const CONST_U8_255: u8 = 255;

const CONST_U16_0: u16 = 0;
const CONST_U16_1: u16 = 1;

fn const_test1() {
    use std::net::Ipv4Addr;
    let _ = Ipv4Addr::new(CONST_U8_127, CONST_U8_0, CONST_U8_0, CONST_U8_1);
    let _ = Ipv4Addr::new(CONST_U8_255, CONST_U8_255, CONST_U8_255, CONST_U8_255);
    let _ = Ipv4Addr::new(CONST_U8_0, CONST_U8_0, CONST_U8_0, CONST_U8_0);

    use std::net::Ipv6Addr;
    let _ = Ipv6Addr::new(
        CONST_U16_0,
        CONST_U16_0,
        CONST_U16_0,
        CONST_U16_0,
        CONST_U16_0,
        CONST_U16_0,
        CONST_U16_0,
        CONST_U16_1,
    );

    let _ = Ipv6Addr::new(
        CONST_U16_0,
        CONST_U16_0,
        CONST_U16_0,
        CONST_U16_0,
        CONST_U16_0,
        CONST_U16_0,
        CONST_U16_0,
        CONST_U16_0,
    );
}

fn const_test2() {
    use std::net::Ipv4Addr;
    let _ = Ipv4Addr::LOCALHOST;
    //~^ ip_constant
    let _ = Ipv4Addr::new(254 + CONST_U8_1, 255, { 255 - CONST_U8_0 }, CONST_U8_255);
    let _ = Ipv4Addr::new(0, CONST_U8_255 - 255, 0, { 1 + 0 - 1 });

    use std::net::Ipv6Addr;
    let _ = Ipv6Addr::new(0 + CONST_U16_0, 0, 0, 0, 0, 0, 0, 1);
    let _ = Ipv6Addr::new(0 + 0, 0, 0, 0, 0, { 2 - 1 - CONST_U16_1 }, 0, 1);
}

macro_rules! ipv4_new {
    ($a:expr, $b:expr, $c:expr, $d:expr) => {
        std::net::Ipv4Addr::new($a, $b, $c, $d)
    };
}

fn macro_test() {
    let _ = ipv4_new!(127, 0, 0, 1);
    // no lint
    let _ = ipv4_new!(255, 255, 255, 255);
    // no lint
    let _ = ipv4_new!(0, 0, 0, 0);
    // no lint
}

fn main() {
    // UI Test
}
