use tracing::{subscriber::with_default, Id, Level};
use tracing_attributes::instrument;
use tracing_mock::*;

#[instrument]
fn with_default_parent() {}

#[instrument(parent = parent_span, skip(parent_span))]
fn with_explicit_parent<P>(parent_span: P)
where
    P: Into<Option<Id>>,
{
}

#[test]
fn default_parent_test() {
    let contextual_parent = expect::span().named("contextual_parent");
    let child = expect::span().named("with_default_parent");

    let (subscriber, handle) = subscriber::mock()
        .new_span(
            contextual_parent
                .clone()
                .with_contextual_parent(None)
                .with_explicit_parent(None),
        )
        .new_span(
            child
                .clone()
                .with_contextual_parent(Some("contextual_parent"))
                .with_explicit_parent(None),
        )
        .enter(child.clone())
        .exit(child.clone())
        .enter(contextual_parent.clone())
        .new_span(
            child
                .clone()
                .with_contextual_parent(Some("contextual_parent"))
                .with_explicit_parent(None),
        )
        .enter(child.clone())
        .exit(child)
        .exit(contextual_parent)
        .only()
        .run_with_handle();

    with_default(subscriber, || {
        let contextual_parent = tracing::span!(Level::TRACE, "contextual_parent");

        with_default_parent();

        contextual_parent.in_scope(|| {
            with_default_parent();
        });
    });

    handle.assert_finished();
}

#[test]
fn explicit_parent_test() {
    let contextual_parent = expect::span().named("contextual_parent");
    let explicit_parent = expect::span().named("explicit_parent");
    let child = expect::span().named("with_explicit_parent");

    let (subscriber, handle) = subscriber::mock()
        .new_span(
            contextual_parent
                .clone()
                .with_contextual_parent(None)
                .with_explicit_parent(None),
        )
        .new_span(
            explicit_parent
                .with_contextual_parent(None)
                .with_explicit_parent(None),
        )
        .enter(contextual_parent.clone())
        .new_span(
            child
                .clone()
                .with_contextual_parent(Some("contextual_parent"))
                .with_explicit_parent(Some("explicit_parent")),
        )
        .enter(child.clone())
        .exit(child)
        .exit(contextual_parent)
        .only()
        .run_with_handle();

    with_default(subscriber, || {
        let contextual_parent = tracing::span!(Level::INFO, "contextual_parent");
        let explicit_parent = tracing::span!(Level::INFO, "explicit_parent");

        contextual_parent.in_scope(|| {
            with_explicit_parent(&explicit_parent);
        });
    });

    handle.assert_finished();
}
