//! Initialization tests

//% CHIPS: esp32 esp32c2 esp32c3 esp32c6 esp32h2 esp32s2 esp32s3
//% FEATURES: unstable

#![no_std]
#![no_main]

use esp_hal::{
    clock::CpuClock,
    config::{WatchdogConfig, WatchdogStatus},
    delay::Delay,
    rtc_cntl::Rtc,
    time::Duration,
    timer::timg::TimerGroup,
    Config,
};
use hil_test as _;

#[cfg(test)]
#[embedded_test::tests(default_timeout = 3)]
mod tests {
    use super::*;

    #[test]
    fn test_feeding_timg0_wdt() {
        let peripherals = esp_hal::init(
            Config::default().with_watchdog(
                WatchdogConfig::default()
                    .with_timg0(WatchdogStatus::Enabled(Duration::from_millis(500))),
            ),
        );

        let timg0 = TimerGroup::new(peripherals.TIMG0);
        let mut wdt0 = timg0.wdt;
        let delay = Delay::new();

        for _ in 0..4 {
            wdt0.feed();
            delay.delay(Duration::from_millis(250));
        }
    }

    #[test]
    #[cfg(timg1)]
    fn test_feeding_timg1_wdt() {
        let peripherals = esp_hal::init(
            Config::default().with_watchdog(
                WatchdogConfig::default()
                    .with_timg1(WatchdogStatus::Enabled(Duration::from_millis(500))),
            ),
        );

        let timg1 = TimerGroup::new(peripherals.TIMG1);
        let mut wdt1 = timg1.wdt;
        let delay = Delay::new();

        for _ in 0..4 {
            wdt1.feed();
            delay.delay(Duration::from_millis(250));
        }
    }

    #[test]
    fn test_feeding_timg0_wdt_max_clock() {
        let peripherals = esp_hal::init(
            Config::default()
                .with_cpu_clock(CpuClock::max())
                .with_watchdog(
                    WatchdogConfig::default()
                        .with_timg0(WatchdogStatus::Enabled(Duration::from_millis(500))),
                ),
        );

        let timg0 = TimerGroup::new(peripherals.TIMG0);
        let mut wdt0 = timg0.wdt;
        let delay = Delay::new();

        for _ in 0..4 {
            wdt0.feed();
            delay.delay(Duration::from_millis(250));
        }
    }

    #[test]
    #[timeout(4)]
    fn test_feeding_rtc_wdt() {
        let peripherals = esp_hal::init(
            Config::default().with_watchdog(
                WatchdogConfig::default()
                    .with_rwdt(WatchdogStatus::Enabled(Duration::from_millis(3000))),
            ),
        );

        let mut rtc = Rtc::new(peripherals.LPWR);
        let delay = Delay::new();

        rtc.rwdt.feed();
        delay.delay(Duration::from_millis(2500));
    }

    #[test]
    fn test_default_config() {
        esp_hal::init(Config::default());

        let delay = Delay::new();
        delay.delay(Duration::from_millis(2000));
    }
}
