use bytes::Bytes;
use folk_plugin_jobs::Driver;
use folk_plugin_jobs::MemoryDriver;

#[tokio::test]
async fn memory_driver_push_pop_roundtrip() {
    let d = MemoryDriver::new();
    d.push("default", Bytes::from("hello")).await.unwrap();
    let got = tokio::time::timeout(std::time::Duration::from_millis(100), d.pop("default"))
        .await
        .unwrap()
        .unwrap()
        .unwrap();
    assert_eq!(got, Bytes::from("hello"));
}

#[tokio::test]
async fn memory_driver_fifo_order() {
    let d = MemoryDriver::new();
    d.push("q", Bytes::from("a")).await.unwrap();
    d.push("q", Bytes::from("b")).await.unwrap();
    d.push("q", Bytes::from("c")).await.unwrap();

    assert_eq!(d.depth("q").await.unwrap(), 3);

    let a = d.pop("q").await.unwrap().unwrap();
    let b = d.pop("q").await.unwrap().unwrap();
    let c = d.pop("q").await.unwrap().unwrap();

    assert_eq!(a, Bytes::from("a"));
    assert_eq!(b, Bytes::from("b"));
    assert_eq!(c, Bytes::from("c"));
    assert_eq!(d.depth("q").await.unwrap(), 0);
}

#[tokio::test]
async fn memory_driver_separate_queues() {
    let d = MemoryDriver::new();
    d.push("q1", Bytes::from("x")).await.unwrap();
    d.push("q2", Bytes::from("y")).await.unwrap();

    assert_eq!(d.depth("q1").await.unwrap(), 1);
    assert_eq!(d.depth("q2").await.unwrap(), 1);

    let x = d.pop("q1").await.unwrap().unwrap();
    assert_eq!(x, Bytes::from("x"));
    assert_eq!(d.depth("q1").await.unwrap(), 0);
    assert_eq!(d.depth("q2").await.unwrap(), 1);
}
