use lsm_tree::{AbstractTree, Guard, SeqNo, SequenceNumberCounter, get_tmp_folder};
use test_log::test;

#[test]
fn tree_weak_delete_queue() -> lsm_tree::Result<()> {
    let folder = get_tmp_folder();

    let path = folder.path();

    let tree = lsm_tree::Config::new(
        path,
        SequenceNumberCounter::default(),
        SequenceNumberCounter::default(),
    )
    .open()?;

    tree.insert("a", "a", 0);
    tree.insert("b", "b", 0);
    tree.insert("c", "c", 0);
    tree.insert("d", "d", 0);
    tree.insert("e", "e", 0);
    assert_eq!(
        b"a",
        &*tree.first_key_value(SeqNo::MAX, None).unwrap().key()?
    );

    tree.remove_weak("a", 1);
    assert_eq!(
        b"b",
        &*tree.first_key_value(SeqNo::MAX, None).unwrap().key()?
    );

    tree.remove_weak("b", 1);
    assert_eq!(
        b"c",
        &*tree.first_key_value(SeqNo::MAX, None).unwrap().key()?
    );

    tree.remove_weak("c", 1);
    assert_eq!(
        b"d",
        &*tree.first_key_value(SeqNo::MAX, None).unwrap().key()?
    );

    tree.remove_weak("d", 1);
    assert_eq!(
        b"e",
        &*tree.first_key_value(SeqNo::MAX, None).unwrap().key()?
    );

    tree.remove_weak("e", 1);
    assert!(tree.is_empty(SeqNo::MAX, None)?);

    Ok(())
}

#[test]
fn tree_weak_delete_queue_reverse() -> lsm_tree::Result<()> {
    let folder = tempfile::tempdir()?;
    let path = folder.path();

    let tree = lsm_tree::Config::new(
        path,
        SequenceNumberCounter::default(),
        SequenceNumberCounter::default(),
    )
    .open()?;

    tree.insert("a", "a", 0);
    tree.insert("b", "b", 0);
    tree.insert("c", "c", 0);
    tree.insert("d", "d", 0);
    tree.insert("e", "e", 0);
    assert_eq!(
        b"e",
        &*tree.last_key_value(SeqNo::MAX, None).unwrap().key()?
    );

    tree.remove_weak("e", 1);
    assert_eq!(
        b"d",
        &*tree.last_key_value(SeqNo::MAX, None).unwrap().key()?
    );

    tree.remove_weak("d", 1);
    assert_eq!(
        b"c",
        &*tree.last_key_value(SeqNo::MAX, None).unwrap().key()?
    );

    tree.remove_weak("c", 1);
    assert_eq!(
        b"b",
        &*tree.last_key_value(SeqNo::MAX, None).unwrap().key()?
    );

    tree.remove_weak("b", 1);
    assert_eq!(
        b"a",
        &*tree.last_key_value(SeqNo::MAX, None).unwrap().key()?
    );

    tree.remove_weak("a", 1);
    assert!(tree.is_empty(SeqNo::MAX, None)?);

    Ok(())
}
