mod support;
use support::*;

use tracing::subscriber::with_default;
use tracing_attributes::instrument;

#[instrument]
fn default_target() {}

#[instrument(target = "my_target")]
fn custom_target() {}

mod my_mod {
    use tracing_attributes::instrument;

    pub const MODULE_PATH: &str = module_path!();

    #[instrument]
    pub fn default_target() {}

    #[instrument(target = "my_other_target")]
    pub fn custom_target() {}
}

#[test]
fn default_targets() {
    let (subscriber, handle) = subscriber::mock()
        .new_span(
            span::mock()
                .named("default_target")
                .with_target(module_path!()),
        )
        .enter(
            span::mock()
                .named("default_target")
                .with_target(module_path!()),
        )
        .exit(
            span::mock()
                .named("default_target")
                .with_target(module_path!()),
        )
        .new_span(
            span::mock()
                .named("default_target")
                .with_target(my_mod::MODULE_PATH),
        )
        .enter(
            span::mock()
                .named("default_target")
                .with_target(my_mod::MODULE_PATH),
        )
        .exit(
            span::mock()
                .named("default_target")
                .with_target(my_mod::MODULE_PATH),
        )
        .done()
        .run_with_handle();

    with_default(subscriber, || {
        default_target();
        my_mod::default_target();
    });

    handle.assert_finished();
}

#[test]
fn custom_targets() {
    let (subscriber, handle) = subscriber::mock()
        .new_span(span::mock().named("custom_target").with_target("my_target"))
        .enter(span::mock().named("custom_target").with_target("my_target"))
        .exit(span::mock().named("custom_target").with_target("my_target"))
        .new_span(
            span::mock()
                .named("custom_target")
                .with_target("my_other_target"),
        )
        .enter(
            span::mock()
                .named("custom_target")
                .with_target("my_other_target"),
        )
        .exit(
            span::mock()
                .named("custom_target")
                .with_target("my_other_target"),
        )
        .done()
        .run_with_handle();

    with_default(subscriber, || {
        custom_target();
        my_mod::custom_target();
    });

    handle.assert_finished();
}
