use tracing::Level;
use tracing_mock::*;

#[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
#[test]
fn max_level_hints() {
    // This test asserts that when a subscriber provides us with the global
    // maximum level that it will enable (by implementing the
    // `Subscriber::max_level_hint` method), we will never call
    // `Subscriber::enabled` for events above that maximum level.
    //
    // In this case, we test that by making the `enabled` method assert that no
    // `Metadata` for spans or events at the `TRACE` or `DEBUG` levels.
    let (subscriber, handle) = subscriber::mock()
        .with_max_level_hint(Level::INFO)
        .with_filter(|meta| {
            assert!(
                dbg!(meta).level() <= &Level::INFO,
                "a TRACE or DEBUG event was dynamically filtered: "
            );
            true
        })
        .event(event::mock().at_level(Level::INFO))
        .event(event::mock().at_level(Level::WARN))
        .event(event::mock().at_level(Level::ERROR))
        .done()
        .run_with_handle();

    tracing::subscriber::set_global_default(subscriber).unwrap();

    tracing::info!("doing a thing that you might care about");
    tracing::debug!("charging turboencabulator with interocitor");
    tracing::warn!("extremely serious warning, pay attention");
    tracing::trace!("interocitor charge level is 10%");
    tracing::error!("everything is on fire");
    handle.assert_finished();
}
