rantz_random 1.2.1

Mostly just a wrapper around fastrand for a bunch of types. Supports bevy and rantz_spatial2d.
Documentation
#[cfg(test)]
mod tests {
    use rantz_random::prelude::{RandomContainer, RandomWeightedContainer, WeightedTable};

    #[test]
    fn inserting_adds_to_values_and_weights() {
        let mut table = WeightedTable::new();

        table.insert(1, 10);

        assert_eq!(table.weights(), &vec![10]);
        assert_eq!(table.max_weight(), 10);
        assert_eq!(table.values(), &vec![1]);
    }

    #[test]
    fn inserting_multiple_adds_to_values_and_weights() {
        let mut table = WeightedTable::new();

        table.insert(1, 10);
        table.insert(2, 20);
        table.insert(3, 30);

        assert_eq!(table.weights(), &vec![10, 20, 30]);
        assert_eq!(table.max_weight(), 60);
        assert_eq!(table.values(), &vec![1, 2, 3]);
    }

    #[test]
    fn removing_removes_from_values_and_weights() {
        let mut table = WeightedTable::new();

        table.insert(1, 10);
        table.insert(2, 20);

        table.remove(&1);

        assert_eq!(table.weights(), &vec![20]);
        assert_eq!(table.max_weight(), 20);
        assert_eq!(table.values(), &vec![2]);
    }

    #[test]
    fn removing_multiple_removes_from_values_and_weights() {
        let mut table = WeightedTable::new();

        table.insert(1, 10);
        table.insert(2, 20);
        table.insert(3, 30);

        table.remove(&1);

        assert_eq!(table.weights(), &vec![20, 30]);
        assert_eq!(table.max_weight(), 50);
        assert_eq!(table.values(), &vec![2, 3]);
    }

    #[test]
    fn removing_all_removes_from_values_and_weights() {
        let mut table = WeightedTable::new();

        table.insert(1, 10);
        table.insert(2, 20);

        table.remove(&1);
        table.remove(&2);

        assert_eq!(table.weights(), &Vec::<u32>::new());
        assert_eq!(table.max_weight(), 0);
        assert_eq!(table.values(), &Vec::<u32>::new());
    }

    #[test]
    fn clear_removes_from_values_and_weights() {
        let mut table = WeightedTable::new();

        table.insert(1, 10);
        table.insert(2, 20);
        table.insert(3, 30);

        table.clear();

        assert_eq!(table.weights(), &Vec::<u32>::new());
        assert_eq!(table.max_weight(), 0);
        assert_eq!(table.values(), &Vec::<u32>::new());
    }

    #[test]
    fn inserting_the_same_value_updates_that_values_weight() {
        let mut table = WeightedTable::new();

        table.insert(1, 10);
        table.insert(1, 20);

        assert_eq!(table.weights(), &vec![20]);
        assert_eq!(table.max_weight(), 20);
        assert_eq!(table.values(), &vec![1]);
    }

    #[test]
    fn implements_get_entry() {
        let mut table = WeightedTable::new();
        table.insert(1, 10);

        assert_eq!(table.get_entry(0), Some((1, 10)));
    }

    #[test]
    fn implements_get_entry_ref() {
        let mut table = WeightedTable::new();
        table.insert(1, 10);

        assert_eq!(table.get_entry_ref(0), Some((&1, &10)));
    }

    #[test]
    fn implements_get_entry_mut() {
        let mut table = WeightedTable::new();
        table.insert(1, 10);

        assert_eq!(table.get_entry_mut(0), Some((&mut 1, &mut 10)));
    }

    #[test]
    fn implements_get_weight() {
        let mut table = WeightedTable::new();
        table.insert(1, 10);

        assert_eq!(table.get_weight(&1), Some(10));
    }

    #[test]
    fn implements_get_weight_mut() {
        let mut table = WeightedTable::new();
        table.insert(1, 10);

        assert_eq!(table.get_weight_mut(&1), Some(&mut 10));
    }

    #[test]
    fn changing_weight_with_get_weight_mut_updates_weight() {
        let mut table = WeightedTable::new();
        table.insert(1, 10);
        *table.get_weight_mut(&1).unwrap() = 20;

        assert_eq!(table.get_weight_mut(&1), Some(&mut 20));
    }

    #[test]
    fn changing_entry_with_get_entry_mut_updates_entry() {
        let mut table = WeightedTable::new();
        table.insert(1, 10);
        let entry = table.get_entry_mut(0).unwrap();
        *entry.0 = 2;
        *entry.1 = 40;

        assert_eq!(table.get_entry(0), Some((2, 40)));
    }

    #[test]
    fn implements_iter() {
        let mut table = WeightedTable::new();
        table.insert(1, 10);
        table.insert(2, 20);

        let mut iter = table.iter();

        assert_eq!(iter.next(), Some((&1, &10)));
        assert_eq!(iter.next(), Some((&2, &20)));
        assert_eq!(iter.next(), None);
    }

    #[test]
    fn can_iter() {
        let mut table = WeightedTable::new();
        table.insert(1, 10);

        for (v, w) in table.iter() {
            assert!(v == &1);
            assert!(w == &10);
        }
    }

    #[test]
    fn implements_iter_mut() {
        let mut table = WeightedTable::new();
        table.insert(1, 10);
        table.insert(2, 20);

        let mut iter = table.iter_mut();

        assert_eq!(iter.next(), Some((&mut 1, &mut 10)));
        assert_eq!(iter.next(), Some((&mut 2, &mut 20)));
        assert_eq!(iter.next(), None);
    }

    #[test]
    fn can_iter_mut() {
        let mut table = WeightedTable::new();
        table.insert(1, 10);

        for (v, w) in table.iter_mut() {
            assert!(v == &mut 1);
            assert!(w == &mut 10);
        }
    }

    #[test]
    fn iter_mut_changes_underlying_table() {
        let mut table = WeightedTable::new();
        table.insert(1, 10);

        for (v, w) in table.iter_mut() {
            *v = 2;
            *w = 20;
        }

        assert_eq!(table.get_entry(0), Some((2, 20)));
    }

    #[test]
    fn can_iter_without_call() {
        let mut table = WeightedTable::new();
        table.insert(1, 10);

        for v in table {
            assert!(v == 1);
        }
    }

    #[test]
    fn implements_random() {
        let mut table = WeightedTable::new();
        table.insert(1, 10);

        assert_eq!(table.random(), Some(1));
    }

    #[test]
    fn empty_table_returns_none() {
        let table = WeightedTable::<u32>::new();

        assert_eq!(table.random(), None);
        assert_eq!(table.weighted_random(), None);
        assert_eq!(table.weighted_random_with_weight(1), None);
    }

    #[test]
    fn implements_weighted_random() {
        let mut table = WeightedTable::new();
        table.insert(1, 10);

        assert_eq!(table.weighted_random(), Some(1));
    }

    #[test]
    fn weighted_random_returns_correct_value() {
        let mut table = WeightedTable::new();
        table.insert(1, 10);
        table.insert(2, 10);

        assert_eq!(table.weighted_random_with_weight(20), Some(2));
    }

    #[test]
    fn implements_combine() {
        let mut table = WeightedTable::new();
        table.insert(1, 10);
        let mut table2 = WeightedTable::new();
        table2.insert(1, 10);
        table2.insert(2, 20);

        table.combine(table2);

        assert_eq!(table.get_entry(0), Some((1, 20)));
        assert_eq!(table.get_entry(1), Some((2, 20)));
    }

    #[test]
    fn handles_exact_random_value() {
        let mut table = WeightedTable::new();
        table.insert(1, 10);
        table.insert(2, 10);

        assert_eq!(table.random_with(10), (1, 10));
        assert_eq!(table.random_with(20), (2, 10));
    }
}