async_wrr_queue 0.1.3

[async & high performance] queued weighted round-robin load balance algorithm
Documentation
use async_wrr_queue::*;

#[cfg(feature = "tokio")]
#[tokio::test]
async fn tokio_test_usage() {
    let mut queue = WrrQueue::new();
    queue
        .insert_many(vec![("a".to_string(), 1usize), ("b".to_string(), 2usize)])
        .await;
    let mut expected = ["b", "a", "b"].iter().cycle();
    for _ in 0..20 {
        assert_eq!(
            expected.next().unwrap(),
            queue.select().await.unwrap().data()
        );
    }
}

#[cfg(feature = "tokio")]
#[tokio::test]
async fn tokio_test_all_equal() {
    let mut queue = WrrQueue::new();
    queue
        .insert_many(vec![("a".to_string(), 1usize), ("b".to_string(), 1usize)])
        .await;
    let mut expected = ["a", "b"].iter().cycle();
    for _ in 0..20 {
        assert_eq!(
            expected.next().unwrap(),
            queue.select().await.unwrap().data()
        );
    }
}

#[cfg(feature = "tokio")]
#[tokio::test]
async fn tokio_complex_test() {
    let mut queue = WrrQueue::new();
    queue.insert_many(vec![("a", 1usize), ("b", 2usize)]).await;
    queue.insert(("c", 3usize)).await;
    queue.insert_many(vec![("d", 5usize), ("e", 2usize)]).await;
    let mut expected = [
        "d", "c", "b", "d", "e", "d", "c", "a", "d", "b", "e", "c", "d",
    ]
    .iter()
    .cycle();
    for _ in 0..30 {
        let select = queue.select().await;
        assert_eq!(expected.next().unwrap(), select.unwrap().data(),);
    }
}

#[cfg(feature = "blocking")]
#[test]
fn test_usage() {
    let mut queue = WrrQueue::new();
    queue.insert_many(vec![("a".to_string(), 1usize), ("b".to_string(), 2usize)]);
    let mut expected = ["b", "a", "b"].iter().cycle();
    for _ in 0..20 {
        assert_eq!(expected.next().unwrap(), queue.select().unwrap().data());
    }
}

#[cfg(feature = "blocking")]
#[test]
fn test_all_equal() {
    let mut queue = WrrQueue::new();
    queue.insert_many(vec![("a".to_string(), 1usize), ("b".to_string(), 1usize)]);
    let mut expected = ["a", "b"].iter().cycle();
    for _ in 0..20 {
        assert_eq!(expected.next().unwrap(), queue.select().unwrap().data());
    }
}

#[cfg(feature = "blocking")]
#[test]
fn complex_test() {
    let mut queue = WrrQueue::new();
    queue.insert_many(vec![("a", 1usize), ("b", 2usize)]);
    queue.insert(("c", 3usize));
    queue.insert_many(vec![("d", 5usize), ("e", 2usize)]);
    let mut expected = [
        "d", "c", "b", "d", "e", "d", "c", "a", "d", "b", "e", "c", "d",
    ]
    .iter()
    .cycle();
    for _ in 0..30 {
        let select = queue.select();
        assert_eq!(expected.next().unwrap(), select.unwrap().data(),);
    }
}