mod sparse_entry;
mod sparse_key;
mod storage;
pub use sparse_key::SparseKey;
use sparse_entry::MAX_EPOCH;
use sparse_entry::MAX_SPARSE_INDEX;
#[derive(Clone)]
pub struct SparseSet<T> {
storage: storage::SparseArrayStorage<T>,
next_free_sparse_entry: usize,
}
#[allow(dead_code)]
impl<T> SparseSet<T> {
pub fn new() -> Self {
assert!(size_of::<T>() > 0, "Zero-sized types are not supported");
Self {
storage: storage::SparseArrayStorage::new(),
next_free_sparse_entry: MAX_SPARSE_INDEX,
}
}
pub fn with_capacity(capacity: usize) -> Self {
assert!(size_of::<T>() > 0, "Zero-sized types are not supported");
Self {
storage: storage::SparseArrayStorage::with_capacity(capacity),
next_free_sparse_entry: MAX_SPARSE_INDEX,
}
}
pub fn from_vec(vec: Vec<T>) -> Self {
let mut result = Self::with_capacity(vec.len());
result.extend_with_vec(vec);
result
}
pub fn reserve(&mut self, additional: usize) {
self.storage.reserve(additional);
}
pub fn push(&mut self, value: T) -> SparseKey {
self.insert_at_position_unchecked(self.storage.get_dense_len(), value)
}
pub fn insert_at_position(&mut self, position: usize, value: T) -> SparseKey {
assert!(position <= self.len());
let key = self.insert_at_position_unchecked(position, value);
for i in position + 1..self.storage.get_dense_len() {
self.project_dense_key_to_sparse(i);
}
key
}
pub fn resize(&mut self, new_len: usize, value: T)
where
T: Clone,
{
if new_len > self.storage.get_dense_len() {
self.reserve(new_len - self.storage.get_dense_len());
for i in self.storage.get_dense_len()..new_len {
self.insert_at_position_unchecked(i, value.clone());
}
} else {
for i in new_len..self.storage.get_dense_len() {
self.remove_by_index(i);
}
}
}
pub fn swap_remove(&mut self, key: SparseKey) -> Option<T> {
assert!(key.sparse_index < self.storage.get_sparse_len());
let sparse_entry = self.storage.get_sparse_mut()[key.sparse_index];
if sparse_entry.is_alive() && sparse_entry.epoch() == key.epoch {
let swapped_sparse_index =
self.storage.get_dense_keys()[self.storage.get_dense_len() - 1].sparse_index;
self.storage.get_sparse_mut()[swapped_sparse_index]
.set_dense_index(sparse_entry.dense_index());
let removed_value = self.storage.swap_remove_dense(sparse_entry.dense_index());
self.mark_as_free(key);
Some(removed_value)
} else {
None
}
}
pub fn remove(&mut self, key: SparseKey) -> Option<T> {
assert!(key.sparse_index < self.storage.get_sparse_len());
let sparse_entry = self.storage.get_sparse()[key.sparse_index];
if sparse_entry.is_alive() && sparse_entry.epoch() == key.epoch {
for i in sparse_entry.dense_index() + 1..self.storage.get_dense_len() {
let sparse_index = self.storage.get_dense_keys()[i].sparse_index;
self.storage.get_sparse_mut()[sparse_index].dense_index_move_left();
}
let removed_value = self.storage.remove_dense(sparse_entry.dense_index());
self.mark_as_free(key);
Some(removed_value)
} else {
None
}
}
pub fn swap_remove_by_index(&mut self, index: usize) -> Option<T> {
let key = self.storage.get_dense_keys()[index];
self.swap_remove(key)
}
pub fn remove_by_index(&mut self, index: usize) -> Option<T> {
let key = self.storage.get_dense_keys()[index];
self.remove(key)
}
pub fn retain<F>(&mut self, mut f: F)
where
F: FnMut(&T) -> bool,
{
for i in (0..self.storage.get_dense_len()).rev() {
if !f(&self.storage.get_dense_values()[i]) {
self.remove_by_index(i);
}
}
}
pub fn clear(&mut self) {
for i in 0..self.storage.get_dense_len() {
self.mark_as_free(self.storage.get_dense_keys()[i]);
}
self.storage.clear_dense();
}
pub fn swap(&mut self, key1: SparseKey, key2: SparseKey) {
assert!(key1.sparse_index < self.storage.get_sparse_len());
assert!(key2.sparse_index < self.storage.get_sparse_len());
let sparse_entry1 = self.storage.get_sparse()[key1.sparse_index];
let sparse_entry2 = self.storage.get_sparse()[key2.sparse_index];
if sparse_entry1.is_alive() && sparse_entry2.is_alive() {
self.storage
.get_dense_values_mut()
.swap(sparse_entry1.dense_index(), sparse_entry2.dense_index());
self.storage
.get_dense_keys_mut()
.swap(sparse_entry1.dense_index(), sparse_entry2.dense_index());
let sparse_array = self.storage.get_sparse_mut();
sparse_array[key1.sparse_index].replace_pointed_to_value(sparse_entry2.dense_index());
sparse_array[key2.sparse_index].replace_pointed_to_value(sparse_entry1.dense_index());
} else {
panic!("Cannot swap elements that are not alive");
}
}
pub fn swap_by_index(&mut self, index1: usize, index2: usize) {
if index1 >= self.storage.get_dense_len() || index2 >= self.storage.get_dense_len() {
panic!(
"The index is out of bounds: {} and {}, len is {}",
index1,
index2,
self.storage.get_dense_len()
);
}
let key1 = self.storage.get_dense_keys()[index1];
let key2 = self.storage.get_dense_keys()[index2];
self.storage.get_dense_values_mut().swap(index1, index2);
self.storage.get_dense_keys_mut().swap(index1, index2);
let sparse_array = self.storage.get_sparse_mut();
sparse_array[key1.sparse_index].replace_pointed_to_value(index2);
sparse_array[key2.sparse_index].replace_pointed_to_value(index1);
}
pub fn rotate_left(&mut self, start_index: usize, end_index: usize, mid: usize) {
if start_index >= end_index {
panic!(
"start_index must be less than end_index: {} and {}",
start_index, end_index
);
}
if end_index > self.storage.get_dense_len() {
panic!(
"end_index must be less than the length of the SparseSet: {}, len is {}",
end_index,
self.storage.get_dense_len()
);
}
self.storage.get_dense_values_mut()[start_index..end_index].rotate_left(mid);
self.storage.get_dense_keys_mut()[start_index..end_index].rotate_left(mid);
for i in start_index..end_index {
self.project_dense_key_to_sparse(i);
}
}
pub fn rotate_right(&mut self, start_index: usize, end_index: usize, k: usize) {
if start_index >= end_index {
panic!(
"start_index must be less than end_index: {} and {}",
start_index, end_index
);
}
if end_index > self.storage.get_dense_len() {
panic!(
"end_index must be less than the length of the SparseSet: {}, len is {}",
end_index,
self.storage.get_dense_len()
);
}
self.storage.get_dense_values_mut()[start_index..end_index].rotate_right(k);
self.storage.get_dense_keys_mut()[start_index..end_index].rotate_right(k);
for i in start_index..end_index {
self.project_dense_key_to_sparse(i);
}
}
pub fn extend_with_vec(&mut self, values: Vec<T>) {
self.storage.reserve(values.len());
for value in values {
self.push(value);
}
}
pub fn into_vec(self) -> Vec<T> {
self.storage.into_dense_values()
}
pub fn get(&self, key: SparseKey) -> Option<&T> {
assert!(key.sparse_index < self.storage.get_sparse_len());
let sparse_entry = self.storage.get_sparse()[key.sparse_index];
if sparse_entry.is_alive() && sparse_entry.epoch() == key.epoch {
Some(&self.storage.get_dense_values()[sparse_entry.dense_index()])
} else {
None
}
}
pub fn get_mut(&mut self, key: SparseKey) -> Option<&mut T> {
assert!(key.sparse_index < self.storage.get_sparse_len());
let sparse_entry = self.storage.get_sparse()[key.sparse_index];
if sparse_entry.is_alive() && sparse_entry.epoch() == key.epoch {
Some(&mut self.storage.get_dense_values_mut()[sparse_entry.dense_index()])
} else {
None
}
}
pub fn get_by_index(&self, index: usize) -> Option<&T> {
self.storage.get_dense_values().get(index)
}
pub fn get_by_index_mut(&mut self, index: usize) -> Option<&mut T> {
self.storage.get_dense_values_mut().get_mut(index)
}
pub fn contains(&self, key: SparseKey) -> bool {
if key.sparse_index >= self.storage.get_sparse_len() {
debug_assert!(false, "The key is not valid for this SparseSet");
return false;
}
let sparse_entry = self.storage.get_sparse()[key.sparse_index];
sparse_entry.is_alive() && sparse_entry.epoch() == key.epoch
}
pub fn is_valid_index(&self, index: usize) -> bool {
index < self.storage.get_sparse_len()
}
pub fn len(&self) -> usize {
self.storage.get_dense_len()
}
pub fn capacity(&self) -> usize {
self.storage.get_dense_capacity()
}
pub fn is_empty(&self) -> bool {
self.storage.get_dense_values().is_empty()
}
pub fn values(&self) -> impl DoubleEndedIterator<Item = &T> {
self.storage.get_dense_values().iter()
}
pub fn values_mut(&mut self) -> impl DoubleEndedIterator<Item = &mut T> {
self.storage.get_dense_values_mut().iter_mut()
}
pub fn keys(&self) -> impl DoubleEndedIterator<Item = SparseKey> + '_ {
self.storage.get_dense_keys().iter().copied()
}
pub fn get_key(&self, index: usize) -> Option<SparseKey> {
self.storage.get_dense_keys().get(index).copied()
}
pub fn index(&self, key: SparseKey) -> Option<usize> {
assert!(key.sparse_index < self.storage.get_sparse_len());
let sparse_entry = self.storage.get_sparse()[key.sparse_index];
if sparse_entry.is_alive() && sparse_entry.epoch() == key.epoch {
Some(sparse_entry.dense_index())
} else {
None
}
}
pub fn key_values(&self) -> impl DoubleEndedIterator<Item = (SparseKey, &T)> {
self.storage
.get_dense_keys()
.iter()
.copied()
.zip(self.storage.get_dense_values().iter())
}
fn insert_at_position_unchecked(&mut self, position: usize, value: T) -> SparseKey {
if self.next_free_sparse_entry != MAX_SPARSE_INDEX {
let new_sparse_index = self.next_free_sparse_entry;
let free_sparse_entry = self.storage.get_sparse()[new_sparse_index];
self.next_free_sparse_entry = free_sparse_entry.next_free();
let key = SparseKey {
sparse_index: new_sparse_index,
epoch: free_sparse_entry.next_epoch(),
};
self.storage
.insert_with_existing_sparse_item(position, key, value);
key
} else {
self.storage.insert_with_new_sparse_item(position, value)
}
}
fn mark_as_free(&mut self, key: SparseKey) {
self.storage.get_sparse_mut()[key.sparse_index].mark_free(self.next_free_sparse_entry);
if key.epoch < MAX_EPOCH {
self.next_free_sparse_entry = key.sparse_index;
}
}
fn project_dense_key_to_sparse(&mut self, dense_index: usize) {
let key = self.storage.get_dense_keys()[dense_index];
self.storage.get_sparse_mut()[key.sparse_index].replace_pointed_to_value(dense_index);
}
#[cfg(test)]
fn test_only_set_sparse_epoch_by_index(
&mut self,
dense_index: usize,
epoch: usize,
) -> SparseKey {
assert!(self.is_valid_index(dense_index));
self.storage.get_dense_keys_mut()[dense_index].epoch = epoch;
let sparse_index = self.storage.get_dense_keys_mut()[dense_index].sparse_index;
self.storage.get_sparse_mut()[sparse_index] =
sparse_entry::SparseEntry::new_alive(dense_index, epoch);
self.storage.get_dense_keys()[dense_index]
}
}
impl<T> Default for SparseSet<T> {
fn default() -> Self {
Self::new()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn empty_sparse_set_created_with_new_no_items() {
let sparse_set: SparseSet<i32> = SparseSet::new();
assert_eq!(sparse_set.len(), 0);
for _ in sparse_set.values() {
assert!(false);
}
}
#[test]
fn empty_sparse_set_created_with_default_no_items() {
let sparse_set: SparseSet<i32> = SparseSet::default();
assert_eq!(sparse_set.len(), 0);
for _ in sparse_set.values() {
assert!(false);
}
}
#[test]
fn empty_sparse_set_created_with_capacity_no_items() {
let sparse_set: SparseSet<i32> = SparseSet::with_capacity(10);
assert_eq!(sparse_set.len(), 0);
for _ in sparse_set.values() {
assert!(false);
}
}
#[test]
fn empty_sparse_set_push_item_has_one_item() {
let mut sparse_set: SparseSet<i32> = SparseSet::new();
let key = sparse_set.push(42);
assert_eq!(sparse_set.len(), 1);
assert_eq!(sparse_set.get_key(0), Some(key));
assert_eq!(sparse_set.get(key), Some(&42));
}
#[test]
fn empty_sparse_set_with_capacity_push_item_has_one_item() {
let mut sparse_set: SparseSet<i32> = SparseSet::with_capacity(10);
let key = sparse_set.push(42);
assert_eq!(sparse_set.len(), 1);
assert_eq!(sparse_set.get_key(0), Some(key));
assert_eq!(sparse_set.get(key), Some(&42));
}
#[test]
fn empty_sparse_set_insert_item_at_zero_position_has_one_item() {
let mut sparse_set: SparseSet<i32> = SparseSet::new();
let key = sparse_set.insert_at_position(0, 42);
assert_eq!(sparse_set.len(), 1);
assert_eq!(sparse_set.get_key(0), Some(key));
assert_eq!(sparse_set.get(key), Some(&42));
}
#[test]
fn empty_sparse_set_with_capacity_insert_item_at_zero_position_has_one_item() {
let mut sparse_set: SparseSet<i32> = SparseSet::with_capacity(1);
let key = sparse_set.insert_at_position(0, 42);
assert_eq!(sparse_set.len(), 1);
assert_eq!(sparse_set.get_key(0), Some(key));
assert_eq!(sparse_set.get(key), Some(&42));
}
#[test]
fn sparse_set_with_three_items_insert_item_in_the_middle_sparse_set_has_four_items() {
let mut sparse_set: SparseSet<i32> = SparseSet::with_capacity(3);
let key1 = sparse_set.insert_at_position(0, 41);
let key2 = sparse_set.insert_at_position(1, 42);
let key3 = sparse_set.insert_at_position(2, 43);
let new_key = sparse_set.insert_at_position(1, 44);
assert_eq!(sparse_set.len(), 4);
assert_eq!(sparse_set.get_by_index(0), Some(&41));
assert_eq!(sparse_set.get_by_index(1), Some(&44));
assert_eq!(sparse_set.get_by_index(2), Some(&42));
assert_eq!(sparse_set.get_by_index(3), Some(&43));
assert_eq!(sparse_set.get(key1), Some(&41));
assert_eq!(sparse_set.get(key2), Some(&42));
assert_eq!(sparse_set.get(key3), Some(&43));
assert_eq!(sparse_set.get(new_key), Some(&44));
}
#[test]
#[should_panic]
fn sparse_set_with_one_item_insert_item_at_incorrect_position_panics() {
let mut sparse_set = SparseSet::new();
sparse_set.push(42);
sparse_set.insert_at_position(2, 41);
}
#[test]
fn empty_sparse_set_resize_to_0_sparse_set_is_empty() {
let mut sparse_set = SparseSet::new();
sparse_set.resize(0, 42);
assert!(sparse_set.is_empty());
}
#[test]
fn empty_sparse_set_resize_to_ten_sparse_set_has_ten_identical_items() {
let mut sparse_set = SparseSet::new();
sparse_set.resize(10, 42);
assert_eq!(sparse_set.len(), 10);
for i in 0..10 {
assert_eq!(sparse_set.get_by_index(i), Some(&42));
}
}
#[test]
fn sparse_set_with_three_items_resize_to_two_items_sparse_set_has_two_items() {
let mut sparse_set = SparseSet::new();
let key1 = sparse_set.push(42);
let key2 = sparse_set.push(43);
let key3 = sparse_set.push(44);
sparse_set.resize(2, 45);
assert_eq!(sparse_set.len(), 2);
assert_eq!(sparse_set.get(key1), Some(&42));
assert_eq!(sparse_set.get(key2), Some(&43));
assert_eq!(sparse_set.get(key3), None);
}
#[test]
fn empty_vec_create_sparse_set_from_vec_sparse_set_is_empty() {
let sparse_set: SparseSet<i32> = SparseSet::from_vec(vec![]);
assert_eq!(sparse_set.len(), 0);
}
#[test]
fn vec_with_three_values_create_sparse_set_from_vec_sparse_set_has_three_items() {
let sparse_set: SparseSet<i32> = SparseSet::from_vec(vec![1, 2, 3]);
assert_eq!(sparse_set.len(), 3);
assert_eq!(sparse_set.get_by_index(0), Some(&1));
assert_eq!(sparse_set.get_by_index(1), Some(&2));
assert_eq!(sparse_set.get_by_index(2), Some(&3));
}
#[test]
fn sparse_set_with_three_items_get_key_the_expected_key_is_returned() {
let mut sparse_set: SparseSet<i32> = SparseSet::new();
let key1 = sparse_set.push(42);
let key2 = sparse_set.push(43);
let key3 = sparse_set.push(44);
assert_eq!(sparse_set.get_key(0), Some(key1));
assert_eq!(sparse_set.get_key(1), Some(key2));
assert_eq!(sparse_set.get_key(2), Some(key3));
}
#[test]
fn sparse_set_with_three_items_get_key_out_of_bounds_returns_none() {
let mut sparse_set: SparseSet<i32> = SparseSet::new();
sparse_set.push(42);
sparse_set.push(43);
sparse_set.push(44);
assert_eq!(sparse_set.get_key(3), None);
assert_eq!(sparse_set.get_key(4), None);
}
#[test]
fn sparse_set_with_three_items_remove_and_add_item_and_get_key_the_expected_key_is_returned() {
let mut sparse_set: SparseSet<i32> = SparseSet::new();
let key1 = sparse_set.push(42);
let key2 = sparse_set.push(43);
let key3 = sparse_set.push(44);
sparse_set.remove(key1);
let key4 = sparse_set.push(45);
assert_eq!(sparse_set.get_key(0), Some(key2));
assert_eq!(sparse_set.get_key(1), Some(key3));
assert_eq!(sparse_set.get_key(2), Some(key4));
}
#[test]
fn sparse_set_with_one_item_mutate_the_item_the_item_is_changed() {
let mut sparse_set: SparseSet<i32> = SparseSet::new();
let key = sparse_set.push(42);
*sparse_set.get_mut(key).unwrap() = 43;
assert_eq!(sparse_set.len(), 1);
assert_eq!(sparse_set.get(key), Some(&43));
}
#[test]
fn sparse_set_with_one_item_get_item_by_index_the_item_is_returned() {
let mut sparse_set: SparseSet<i32> = SparseSet::new();
sparse_set.push(42);
assert_eq!(sparse_set.get_by_index(0), Some(&42));
}
#[test]
fn sparse_set_with_one_item_get_item_by_wrong_index_none_is_returned() {
let mut sparse_set: SparseSet<i32> = SparseSet::new();
sparse_set.push(42);
assert_eq!(sparse_set.get_by_index(1), None);
}
#[test]
fn sparse_set_with_one_item_get_mutable_ref_by_index_and_mutate_the_item_is_changed() {
let mut sparse_set: SparseSet<i32> = SparseSet::new();
let key = sparse_set.push(42);
let mutable_ref = sparse_set.get_by_index_mut(0).unwrap();
*mutable_ref = 43;
assert_eq!(sparse_set.get(key), Some(&43));
}
#[test]
fn sparse_set_with_one_item_remove_item_no_items() {
let mut sparse_set: SparseSet<i32> = SparseSet::new();
let key = sparse_set.push(42);
sparse_set.remove(key);
assert_eq!(sparse_set.len(), 0);
assert_eq!(sparse_set.get_key(0), None);
assert_eq!(sparse_set.get(key), None);
}
#[test]
fn sparse_set_with_one_item_swap_remove_item_no_items() {
let mut sparse_set: SparseSet<i32> = SparseSet::new();
let key = sparse_set.push(42);
sparse_set.swap_remove(key);
assert_eq!(sparse_set.len(), 0);
assert_eq!(sparse_set.get_key(0), None);
assert_eq!(sparse_set.get(key), None);
}
#[test]
fn sparse_set_with_one_item_add_second_item_and_remove_first_item_only_second_item_remains() {
let mut sparse_set: SparseSet<i32> = SparseSet::new();
let key1 = sparse_set.push(42);
let key2 = sparse_set.push(43);
sparse_set.remove(key1);
assert_eq!(sparse_set.len(), 1);
assert_eq!(sparse_set.get_key(0), Some(key2));
assert_eq!(sparse_set.get_key(1), None);
assert_eq!(sparse_set.get(key1), None);
assert_eq!(sparse_set.get(key2), Some(&43));
}
#[test]
fn sparse_set_with_one_item_remove_item_and_add_two_new_items_has_two_items() {
let mut sparse_set: SparseSet<i32> = SparseSet::new();
let key1 = sparse_set.push(42);
sparse_set.remove(key1);
let key2 = sparse_set.push(43);
let key3 = sparse_set.push(44);
assert_eq!(sparse_set.len(), 2);
assert_eq!(sparse_set.get_key(0), Some(key2));
assert_eq!(sparse_set.get_key(1), Some(key3));
assert_eq!(sparse_set.get_key(2), None);
assert_eq!(sparse_set.get(key1), None);
assert_eq!(sparse_set.get(key2), Some(&43));
assert_eq!(sparse_set.get(key3), Some(&44));
}
#[test]
fn sparse_set_with_two_items_remove_first_item_has_one_item() {
let mut sparse_set: SparseSet<i32> = SparseSet::new();
let key1 = sparse_set.push(42);
let key2 = sparse_set.push(43);
sparse_set.remove(key1);
assert_eq!(sparse_set.len(), 1);
assert_eq!(sparse_set.get_key(0), Some(key2));
assert_eq!(sparse_set.get_key(1), None);
assert_eq!(sparse_set.get(key1), None);
assert_eq!(sparse_set.get(key2), Some(&43));
}
#[test]
fn sparse_set_with_two_items_swap_remove_first_item_has_one_item() {
let mut sparse_set: SparseSet<i32> = SparseSet::new();
let key1 = sparse_set.push(42);
let key2 = sparse_set.push(43);
sparse_set.swap_remove(key1);
assert_eq!(sparse_set.len(), 1);
assert_eq!(sparse_set.get_key(0), Some(key2));
assert_eq!(sparse_set.get_key(1), None);
assert_eq!(sparse_set.get(key1), None);
assert_eq!(sparse_set.get(key2), Some(&43));
}
#[test]
fn sparse_set_with_two_items_remove_second_item_has_one_item() {
let mut sparse_set: SparseSet<i32> = SparseSet::new();
let key1 = sparse_set.push(42);
let key2 = sparse_set.push(43);
sparse_set.remove(key2);
assert_eq!(sparse_set.len(), 1);
assert_eq!(sparse_set.get_key(0), Some(key1));
assert_eq!(sparse_set.get_key(1), None);
assert_eq!(sparse_set.get(key1), Some(&42));
assert_eq!(sparse_set.get(key2), None);
}
#[test]
fn sparse_set_with_two_items_swap_remove_second_item_has_one_item() {
let mut sparse_set: SparseSet<i32> = SparseSet::new();
let key1 = sparse_set.push(42);
let key2 = sparse_set.push(43);
sparse_set.swap_remove(key2);
assert_eq!(sparse_set.len(), 1);
assert_eq!(sparse_set.get_key(0), Some(key1));
assert_eq!(sparse_set.get_key(1), None);
assert_eq!(sparse_set.get(key1), Some(&42));
assert_eq!(sparse_set.get(key2), None);
}
#[test]
fn sparse_set_with_one_item_remove_an_item_and_push_new_item_has_one_item() {
let mut sparse_set: SparseSet<i32> = SparseSet::new();
let key = sparse_set.push(42);
sparse_set.remove(key);
let new_key = sparse_set.push(43);
assert_eq!(sparse_set.len(), 1);
assert_eq!(sparse_set.get_key(0), Some(new_key));
assert_eq!(sparse_set.get_key(1), None);
assert_eq!(sparse_set.get(key), None);
assert_eq!(sparse_set.get(new_key), Some(&43));
}
#[test]
fn sparse_set_with_one_item_swap_remove_an_item_and_push_new_item_has_one_item() {
let mut sparse_set: SparseSet<i32> = SparseSet::new();
let key = sparse_set.push(42);
sparse_set.swap_remove(key);
let new_key = sparse_set.push(43);
assert_eq!(sparse_set.len(), 1);
assert_eq!(sparse_set.get_key(0), Some(new_key));
assert_eq!(sparse_set.get_key(1), None);
assert_eq!(sparse_set.get(key), None);
assert_eq!(sparse_set.get(new_key), Some(&43));
}
#[test]
fn sparse_set_with_five_items_remove_first_item_order_is_not_changed() {
let mut sparse_set: SparseSet<i32> = SparseSet::new();
let key1 = sparse_set.push(42);
let key2 = sparse_set.push(43);
let key3 = sparse_set.push(44);
let key4 = sparse_set.push(45);
let key5 = sparse_set.push(46);
sparse_set.remove(key1);
assert_eq!(sparse_set.len(), 4);
for (i, value) in sparse_set.values().enumerate() {
if i == 0 {
assert_eq!(value, &43);
} else if i == 1 {
assert_eq!(value, &44);
} else if i == 2 {
assert_eq!(value, &45);
} else {
assert_eq!(value, &46);
}
}
assert_eq!(sparse_set.get_key(0), Some(key2));
assert_eq!(sparse_set.get_key(1), Some(key3));
assert_eq!(sparse_set.get_key(2), Some(key4));
assert_eq!(sparse_set.get_key(3), Some(key5));
assert_eq!(sparse_set.get_key(4), None);
assert_eq!(sparse_set.get(key1), None);
assert_eq!(sparse_set.get(key2), Some(&43));
assert_eq!(sparse_set.get(key3), Some(&44));
assert_eq!(sparse_set.get(key4), Some(&45));
assert_eq!(sparse_set.get(key5), Some(&46));
}
#[test]
fn sparse_set_with_one_item_remove_item_twice_no_items() {
let mut sparse_set: SparseSet<i32> = SparseSet::new();
let key = sparse_set.push(42);
sparse_set.remove(key);
sparse_set.remove(key);
assert_eq!(sparse_set.len(), 0);
assert_eq!(sparse_set.get_key(0), None);
assert_eq!(sparse_set.get(key), None);
}
#[test]
fn sparse_set_with_one_item_swap_remove_item_twice_no_items() {
let mut sparse_set: SparseSet<i32> = SparseSet::new();
let key = sparse_set.push(42);
sparse_set.swap_remove(key);
sparse_set.swap_remove(key);
assert_eq!(sparse_set.len(), 0);
assert_eq!(sparse_set.get_key(0), None);
assert_eq!(sparse_set.get(key), None);
}
#[test]
fn sparse_set_with_no_items_clear_no_items() {
let mut sparse_set: SparseSet<i32> = SparseSet::new();
sparse_set.clear();
assert_eq!(sparse_set.len(), 0);
}
#[test]
fn sparse_set_with_five_items_remove_first_item_by_index_order_is_not_changed() {
let mut sparse_set: SparseSet<i32> = SparseSet::new();
let key1 = sparse_set.push(42);
let key2 = sparse_set.push(43);
let key3 = sparse_set.push(44);
let key4 = sparse_set.push(45);
let key5 = sparse_set.push(46);
sparse_set.remove_by_index(0);
assert_eq!(sparse_set.len(), 4);
assert_eq!(sparse_set.get_key(0), Some(key2));
assert_eq!(sparse_set.get_key(1), Some(key3));
assert_eq!(sparse_set.get_key(2), Some(key4));
assert_eq!(sparse_set.get_key(3), Some(key5));
assert_eq!(sparse_set.get_key(4), None);
assert_eq!(sparse_set.get(key1), None);
assert_eq!(sparse_set.get(key2), Some(&43));
assert_eq!(sparse_set.get(key3), Some(&44));
assert_eq!(sparse_set.get(key4), Some(&45));
assert_eq!(sparse_set.get(key5), Some(&46));
}
#[test]
fn sparse_set_with_five_items_swap_remove_first_item_by_index_order_is_not_changed() {
let mut sparse_set: SparseSet<i32> = SparseSet::new();
let key1 = sparse_set.push(42);
let key2 = sparse_set.push(43);
let key3 = sparse_set.push(44);
let key4 = sparse_set.push(45);
let key5 = sparse_set.push(46);
sparse_set.swap_remove_by_index(0);
assert_eq!(sparse_set.len(), 4);
assert_eq!(sparse_set.get_key(0), Some(key5));
assert_eq!(sparse_set.get_key(1), Some(key2));
assert_eq!(sparse_set.get_key(2), Some(key3));
assert_eq!(sparse_set.get_key(3), Some(key4));
assert_eq!(sparse_set.get_key(4), None);
assert_eq!(sparse_set.get(key1), None);
assert_eq!(sparse_set.get(key2), Some(&43));
assert_eq!(sparse_set.get(key3), Some(&44));
assert_eq!(sparse_set.get(key4), Some(&45));
assert_eq!(sparse_set.get(key5), Some(&46));
}
#[test]
#[should_panic]
fn sparse_set_with_two_items_remove_third_item_by_index_panics() {
let mut sparse_set: SparseSet<i32> = SparseSet::new();
sparse_set.push(42);
sparse_set.push(43);
sparse_set.remove_by_index(2);
}
#[test]
fn sparse_set_with_no_items_retain_no_items() {
let mut sparse_set: SparseSet<i32> = SparseSet::new();
sparse_set.retain(|&x| x != 42);
assert_eq!(sparse_set.len(), 0);
}
#[test]
fn sparse_set_with_three_items_retain_to_leave_one_item_one_item_left() {
let mut sparse_set: SparseSet<i32> = SparseSet::new();
let key1 = sparse_set.push(42);
let key2 = sparse_set.push(43);
let key3 = sparse_set.push(44);
sparse_set.retain(|&x| x == 43);
assert_eq!(sparse_set.len(), 1);
assert_eq!(sparse_set.get(key1), None);
assert_eq!(sparse_set.get(key2), Some(&43));
assert_eq!(sparse_set.get(key3), None);
}
#[test]
fn sparse_set_with_three_items_retain_to_leave_two_items_two_items_left() {
let mut sparse_set: SparseSet<i32> = SparseSet::new();
let key1 = sparse_set.push(42);
let key2 = sparse_set.push(43);
let key3 = sparse_set.push(44);
sparse_set.retain(|&x| x != 43);
assert_eq!(sparse_set.len(), 2);
assert_eq!(sparse_set.get(key1), Some(&42));
assert_eq!(sparse_set.get(key2), None);
assert_eq!(sparse_set.get(key3), Some(&44));
}
#[test]
fn sparse_set_with_one_item_clear_no_items() {
let mut sparse_set: SparseSet<i32> = SparseSet::new();
sparse_set.push(42);
sparse_set.push(43);
sparse_set.push(44);
sparse_set.clear();
assert_eq!(sparse_set.len(), 0);
}
#[test]
fn sparse_set_with_three_items_clear_and_add_new_items_old_keys_are_invalid() {
let mut sparse_set: SparseSet<i32> = SparseSet::new();
let key1 = sparse_set.push(42);
let key2 = sparse_set.push(43);
let key3 = sparse_set.push(44);
sparse_set.clear();
let key4 = sparse_set.push(45);
let key5 = sparse_set.push(46);
let key6 = sparse_set.push(47);
assert_eq!(sparse_set.len(), 3);
assert_eq!(sparse_set.contains(key1), false);
assert_eq!(sparse_set.contains(key2), false);
assert_eq!(sparse_set.contains(key3), false);
assert_eq!(sparse_set.contains(key4), true);
assert_eq!(sparse_set.contains(key5), true);
assert_eq!(sparse_set.contains(key6), true);
}
#[test]
fn sparse_set_with_three_items_get_index_the_expected_index_is_returned() {
let mut sparse_set: SparseSet<i32> = SparseSet::new();
let key1 = sparse_set.push(42);
let key2 = sparse_set.push(43);
let key3 = sparse_set.push(44);
assert_eq!(sparse_set.index(key1), Some(0));
assert_eq!(sparse_set.index(key2), Some(1));
assert_eq!(sparse_set.index(key3), Some(2));
}
#[test]
fn sparse_set_with_two_items_remove_item_and_get_its_index_returns_none() {
let mut sparse_set: SparseSet<i32> = SparseSet::new();
let key1 = sparse_set.push(42);
let key2 = sparse_set.push(43);
sparse_set.remove(key1);
assert_eq!(sparse_set.index(key1), None);
assert_eq!(sparse_set.index(key2), Some(0));
}
#[test]
fn sparse_set_with_three_items_iterate_over_values_the_values_are_iterated_in_order() {
let mut sparse_set: SparseSet<i32> = SparseSet::new();
sparse_set.push(42);
sparse_set.push(43);
sparse_set.push(44);
for (i, value) in sparse_set.values().enumerate() {
if i == 0 {
assert_eq!(value, &42);
} else if i == 1 {
assert_eq!(value, &43);
} else {
assert_eq!(value, &44);
}
}
}
#[test]
fn sparse_set_with_three_items_iterate_over_keys_the_keys_are_iterated_in_order() {
let mut sparse_set: SparseSet<i32> = SparseSet::new();
sparse_set.push(42);
sparse_set.push(43);
sparse_set.push(44);
for (i, key) in sparse_set.keys().enumerate() {
if i == 0 {
assert_eq!(sparse_set.get(key), Some(&42));
} else if i == 1 {
assert_eq!(sparse_set.get(key), Some(&43));
} else {
assert_eq!(sparse_set.get(key), Some(&44));
}
}
}
#[test]
fn sparse_set_with_three_items_iterate_over_key_values_the_key_values_are_iterated_in_order() {
let mut sparse_set: SparseSet<i32> = SparseSet::new();
let key1 = sparse_set.push(42);
let key2 = sparse_set.push(43);
let key3 = sparse_set.push(44);
for (i, (key, value)) in sparse_set.key_values().enumerate() {
if i == 0 {
assert_eq!(value, &42);
assert_eq!(key, key1);
} else if i == 1 {
assert_eq!(value, &43);
assert_eq!(key, key2);
} else {
assert_eq!(value, &44);
assert_eq!(key, key3);
}
}
}
#[test]
fn sparse_set_with_one_item_iterate_over_values_and_mutate_the_value_is_changed() {
let mut sparse_set: SparseSet<i32> = SparseSet::new();
let key = sparse_set.push(42);
for value in sparse_set.values_mut() {
*value = 43;
}
assert_eq!(sparse_set.len(), 1);
assert_eq!(sparse_set.get(key), Some(&43));
}
#[test]
fn sparse_set_with_two_items_swap_the_items_the_items_are_swapped_in_order_but_not_by_keys() {
let mut sparse_set: SparseSet<i32> = SparseSet::new();
let key1 = sparse_set.push(42);
let key2 = sparse_set.push(43);
sparse_set.swap(key1, key2);
assert_eq!(sparse_set.len(), 2);
for (i, value) in sparse_set.values().enumerate() {
if i == 0 {
assert_eq!(value, &43);
} else {
assert_eq!(value, &42);
}
}
assert_eq!(sparse_set.get_key(0), Some(key2));
assert_eq!(sparse_set.get_key(1), Some(key1));
assert_eq!(sparse_set.get(key1), Some(&42));
assert_eq!(sparse_set.get(key2), Some(&43));
}
#[test]
fn sparse_set_with_one_item_try_swapping_with_itself_does_nothing() {
let mut sparse_set: SparseSet<i32> = SparseSet::new();
let key = sparse_set.push(42);
sparse_set.swap(key, key);
assert_eq!(sparse_set.len(), 1);
assert_eq!(sparse_set.get_key(0), Some(key));
assert_eq!(sparse_set.get(key), Some(&42));
}
#[test]
fn sparse_set_with_two_items_swap_the_items_by_indices_the_items_are_swapped_in_order_but_not_by_keys(
) {
let mut sparse_set: SparseSet<i32> = SparseSet::new();
let key1 = sparse_set.push(42);
let key2 = sparse_set.push(43);
sparse_set.swap_by_index(0, 1);
assert_eq!(sparse_set.len(), 2);
for (i, value) in sparse_set.values().enumerate() {
if i == 0 {
assert_eq!(value, &43);
} else {
assert_eq!(value, &42);
}
}
assert_eq!(sparse_set.get_key(0), Some(key2));
assert_eq!(sparse_set.get_key(1), Some(key1));
assert_eq!(sparse_set.get(key1), Some(&42));
assert_eq!(sparse_set.get(key2), Some(&43));
}
#[test]
fn sparse_set_with_one_item_try_swapping_with_itself_by_index_does_nothing() {
let mut sparse_set: SparseSet<i32> = SparseSet::new();
let key = sparse_set.push(42);
sparse_set.swap_by_index(0, 0);
assert_eq!(sparse_set.len(), 1);
assert_eq!(sparse_set.get_key(0), Some(key));
assert_eq!(sparse_set.get(key), Some(&42));
}
#[test]
#[should_panic]
fn sparse_set_with_one_item_try_swapping_with_non_existing_element_by_index_panics() {
let mut sparse_set: SparseSet<i32> = SparseSet::new();
sparse_set.push(42);
sparse_set.swap_by_index(0, 1);
}
#[test]
fn sparse_set_with_five_items_clone_the_set_cloned_set_has_the_same_items() {
let mut sparse_set: SparseSet<i32> = SparseSet::new();
let key1 = sparse_set.push(42);
let key2 = sparse_set.push(43);
let key3 = sparse_set.push(44);
let key4 = sparse_set.push(45);
let key5 = sparse_set.push(46);
let cloned_sparse_set = sparse_set.clone();
assert_eq!(cloned_sparse_set.len(), 5);
assert_eq!(cloned_sparse_set.get_key(0), Some(key1));
assert_eq!(cloned_sparse_set.get_key(1), Some(key2));
assert_eq!(cloned_sparse_set.get_key(2), Some(key3));
assert_eq!(cloned_sparse_set.get_key(3), Some(key4));
assert_eq!(cloned_sparse_set.get_key(4), Some(key5));
assert_eq!(cloned_sparse_set.get(key1), Some(&42));
assert_eq!(cloned_sparse_set.get(key2), Some(&43));
assert_eq!(cloned_sparse_set.get(key3), Some(&44));
assert_eq!(cloned_sparse_set.get(key4), Some(&45));
assert_eq!(cloned_sparse_set.get(key5), Some(&46));
}
#[test]
fn sparse_set_with_one_item_check_if_contains_returns_true() {
let mut sparse_set: SparseSet<i32> = SparseSet::new();
let key = sparse_set.push(42);
assert!(sparse_set.contains(key));
}
#[test]
fn sparse_set_with_one_item_remove_the_item_and_check_if_contains_returns_false() {
let mut sparse_set: SparseSet<i32> = SparseSet::new();
let key = sparse_set.push(42);
sparse_set.swap_remove(key);
assert!(!sparse_set.contains(key));
}
#[test]
#[should_panic]
fn sparse_set_with_two_items_remove_item_and_try_to_swap_it_panics() {
let mut sparse_set: SparseSet<i32> = SparseSet::new();
let key1 = sparse_set.push(42);
let key2 = sparse_set.push(43);
sparse_set.remove(key1);
sparse_set.swap(key1, key2);
}
#[test]
#[should_panic]
fn two_sparse_sets_with_different_sizes_try_to_access_non_existent_key_panics() {
let mut sparse_set1: SparseSet<i32> = SparseSet::with_capacity(1);
let key1 = sparse_set1.push(42);
let sparse_set2: SparseSet<i32> = SparseSet::new();
sparse_set2.get(key1);
}
#[test]
#[should_panic]
fn two_sparse_sets_with_different_sizes_try_to_remove_non_existent_key_panics() {
let mut sparse_set1: SparseSet<i32> = SparseSet::with_capacity(1);
let key1 = sparse_set1.push(42);
let mut sparse_set2: SparseSet<i32> = SparseSet::new();
sparse_set2.remove(key1);
}
#[test]
#[should_panic]
fn two_sparse_sets_with_different_sizes_try_to_swap_remove_non_existent_key_panics() {
let mut sparse_set1: SparseSet<i32> = SparseSet::with_capacity(1);
let key1 = sparse_set1.push(42);
let mut sparse_set2: SparseSet<i32> = SparseSet::new();
sparse_set2.swap_remove(key1);
}
#[test]
#[should_panic]
fn two_sparse_sets_with_different_sizes_try_to_swap_non_existent_keys_panics() {
let mut sparse_set1: SparseSet<i32> = SparseSet::with_capacity(1);
sparse_set1.push(42);
let key2 = sparse_set1.push(43);
let mut sparse_set2: SparseSet<i32> = SparseSet::new();
let key3 = sparse_set2.push(44);
sparse_set2.swap(key2, key3);
}
#[test]
fn sparse_set_with_one_item_rotate_left_has_that_same_item() {
let mut sparse_set: SparseSet<i32> = SparseSet::new();
let key = sparse_set.push(42);
sparse_set.rotate_left(0, 1, 1);
assert_eq!(sparse_set.len(), 1);
assert_eq!(sparse_set.get_key(0), Some(key));
assert_eq!(sparse_set.get(key), Some(&42));
}
#[test]
fn sparse_set_with_two_items_rotate_left_once_items_change_position_with_stable_keys() {
let mut sparse_set: SparseSet<i32> = SparseSet::new();
let key1 = sparse_set.push(42);
let key2 = sparse_set.push(43);
sparse_set.rotate_left(0, 2, 1);
assert_eq!(sparse_set.len(), 2);
assert_eq!(sparse_set.get_key(0), Some(key2));
assert_eq!(sparse_set.get_key(1), Some(key1));
assert_eq!(sparse_set.get(key1), Some(&42));
assert_eq!(sparse_set.get(key2), Some(&43));
}
#[test]
fn sparse_set_with_two_items_rotate_left_twice_items_return_to_the_same_positions() {
let mut sparse_set: SparseSet<i32> = SparseSet::new();
let key1 = sparse_set.push(42);
let key2 = sparse_set.push(43);
sparse_set.rotate_left(0, 2, 2);
assert_eq!(sparse_set.len(), 2);
assert_eq!(sparse_set.get_key(0), Some(key1));
assert_eq!(sparse_set.get_key(1), Some(key2));
assert_eq!(sparse_set.get(key1), Some(&42));
assert_eq!(sparse_set.get(key2), Some(&43));
}
#[test]
fn sparse_set_with_three_items_rotate_left_once_items_change_position_with_stable_keys() {
let mut sparse_set: SparseSet<i32> = SparseSet::new();
let key1 = sparse_set.push(42);
let key2 = sparse_set.push(43);
let key3 = sparse_set.push(44);
sparse_set.rotate_left(0, 3, 1);
assert_eq!(sparse_set.len(), 3);
assert_eq!(sparse_set.get_key(0), Some(key2));
assert_eq!(sparse_set.get_key(1), Some(key3));
assert_eq!(sparse_set.get_key(2), Some(key1));
assert_eq!(sparse_set.get(key1), Some(&42));
assert_eq!(sparse_set.get(key2), Some(&43));
assert_eq!(sparse_set.get(key3), Some(&44));
}
#[test]
fn sparse_set_with_three_items_rotate_left_twice_items_change_position_with_stable_keys() {
let mut sparse_set: SparseSet<i32> = SparseSet::new();
let key1 = sparse_set.push(42);
let key2 = sparse_set.push(43);
let key3 = sparse_set.push(44);
sparse_set.rotate_left(0, 3, 2);
assert_eq!(sparse_set.len(), 3);
assert_eq!(sparse_set.get_key(0), Some(key3));
assert_eq!(sparse_set.get_key(1), Some(key1));
assert_eq!(sparse_set.get_key(2), Some(key2));
assert_eq!(sparse_set.get(key1), Some(&42));
assert_eq!(sparse_set.get(key2), Some(&43));
assert_eq!(sparse_set.get(key3), Some(&44));
}
#[test]
fn sparse_set_with_four_items_rotate_middle_two_left_once_items_change_position_with_stable_keys(
) {
let mut sparse_set: SparseSet<i32> = SparseSet::new();
let key1 = sparse_set.push(42);
let key2 = sparse_set.push(43);
let key3 = sparse_set.push(44);
let key4 = sparse_set.push(45);
sparse_set.rotate_left(1, 3, 1);
assert_eq!(sparse_set.len(), 4);
assert_eq!(sparse_set.get_key(0), Some(key1));
assert_eq!(sparse_set.get_key(1), Some(key3));
assert_eq!(sparse_set.get_key(2), Some(key2));
assert_eq!(sparse_set.get_key(3), Some(key4));
assert_eq!(sparse_set.get(key1), Some(&42));
assert_eq!(sparse_set.get(key2), Some(&43));
assert_eq!(sparse_set.get(key3), Some(&44));
assert_eq!(sparse_set.get(key4), Some(&45));
}
#[test]
#[should_panic]
fn sparse_set_with_one_item_rotate_left_out_of_bounds_panics() {
let mut sparse_set: SparseSet<i32> = SparseSet::new();
sparse_set.push(42);
sparse_set.rotate_left(0, 2, 2);
}
#[test]
fn sparse_set_with_one_item_rotate_right_has_that_same_item() {
let mut sparse_set: SparseSet<i32> = SparseSet::new();
let key = sparse_set.push(42);
sparse_set.rotate_right(0, 1, 1);
assert_eq!(sparse_set.len(), 1);
assert_eq!(sparse_set.get_key(0), Some(key));
assert_eq!(sparse_set.get(key), Some(&42));
}
#[test]
fn sparse_set_with_two_items_rotate_right_once_items_change_position_with_stable_keys() {
let mut sparse_set: SparseSet<i32> = SparseSet::new();
let key1 = sparse_set.push(42);
let key2 = sparse_set.push(43);
sparse_set.rotate_right(0, 2, 1);
assert_eq!(sparse_set.len(), 2);
assert_eq!(sparse_set.get_key(0), Some(key2));
assert_eq!(sparse_set.get_key(1), Some(key1));
assert_eq!(sparse_set.get(key1), Some(&42));
assert_eq!(sparse_set.get(key2), Some(&43));
}
#[test]
fn sparse_set_with_two_items_rotate_right_twice_items_return_to_the_same_positions() {
let mut sparse_set: SparseSet<i32> = SparseSet::new();
let key1 = sparse_set.push(42);
let key2 = sparse_set.push(43);
sparse_set.rotate_right(0, 2, 2);
assert_eq!(sparse_set.len(), 2);
assert_eq!(sparse_set.get_key(0), Some(key1));
assert_eq!(sparse_set.get_key(1), Some(key2));
assert_eq!(sparse_set.get(key1), Some(&42));
assert_eq!(sparse_set.get(key2), Some(&43));
}
#[test]
fn sparse_set_with_three_items_rotate_right_once_items_change_position_with_stable_keys() {
let mut sparse_set: SparseSet<i32> = SparseSet::new();
let key1 = sparse_set.push(42);
let key2 = sparse_set.push(43);
let key3 = sparse_set.push(44);
sparse_set.rotate_right(0, 3, 1);
assert_eq!(sparse_set.len(), 3);
assert_eq!(sparse_set.get_key(0), Some(key3));
assert_eq!(sparse_set.get_key(1), Some(key1));
assert_eq!(sparse_set.get_key(2), Some(key2));
assert_eq!(sparse_set.get(key1), Some(&42));
assert_eq!(sparse_set.get(key2), Some(&43));
assert_eq!(sparse_set.get(key3), Some(&44));
}
#[test]
fn sparse_set_with_three_items_rotate_right_twice_items_change_position_with_stable_keys() {
let mut sparse_set: SparseSet<i32> = SparseSet::new();
let key1 = sparse_set.push(42);
let key2 = sparse_set.push(43);
let key3 = sparse_set.push(44);
sparse_set.rotate_right(0, 3, 2);
assert_eq!(sparse_set.len(), 3);
assert_eq!(sparse_set.get_key(0), Some(key2));
assert_eq!(sparse_set.get_key(1), Some(key3));
assert_eq!(sparse_set.get_key(2), Some(key1));
assert_eq!(sparse_set.get(key1), Some(&42));
assert_eq!(sparse_set.get(key2), Some(&43));
assert_eq!(sparse_set.get(key3), Some(&44));
}
#[test]
fn sparse_set_with_four_items_rotate_middle_two_right_once_items_change_position_with_stable_keys(
) {
let mut sparse_set: SparseSet<i32> = SparseSet::new();
let key1 = sparse_set.push(42);
let key2 = sparse_set.push(43);
let key3 = sparse_set.push(44);
let key4 = sparse_set.push(45);
sparse_set.rotate_right(1, 3, 1);
assert_eq!(sparse_set.len(), 4);
assert_eq!(sparse_set.get_key(0), Some(key1));
assert_eq!(sparse_set.get_key(1), Some(key3));
assert_eq!(sparse_set.get_key(2), Some(key2));
assert_eq!(sparse_set.get_key(3), Some(key4));
assert_eq!(sparse_set.get(key1), Some(&42));
assert_eq!(sparse_set.get(key2), Some(&43));
assert_eq!(sparse_set.get(key3), Some(&44));
assert_eq!(sparse_set.get(key4), Some(&45));
}
#[test]
#[should_panic]
fn sparse_set_with_one_item_rotate_right_out_of_bounds_panics() {
let mut sparse_set: SparseSet<i32> = SparseSet::new();
sparse_set.push(42);
sparse_set.rotate_right(0, 2, 2);
}
#[test]
fn sparse_set_with_no_items_capacity() {
let sparse_set: SparseSet<i32> = SparseSet::new();
assert_eq!(sparse_set.capacity(), 0);
}
#[test]
fn sparse_set_with_no_items_add_item_and_check_capacity_returns_four() {
let mut sparse_set: SparseSet<i32> = SparseSet::new();
sparse_set.push(42);
assert_eq!(sparse_set.capacity(), 4);
}
#[test]
fn sparse_set_of_big_array_with_no_items_add_item_and_check_capacity_returns_four() {
let mut sparse_set: SparseSet<[i8; 1025]> = SparseSet::new();
sparse_set.push([0; 1025]);
assert_eq!(sparse_set.capacity(), 1);
}
#[test]
fn sparse_set_with_no_items_add_five_items_and_check_capacity_returns_eight() {
let mut sparse_set: SparseSet<i32> = SparseSet::new();
sparse_set.push(42);
sparse_set.push(43);
sparse_set.push(44);
sparse_set.push(45);
assert_eq!(sparse_set.capacity(), 4);
sparse_set.push(46);
assert_eq!(sparse_set.capacity(), 8);
}
#[test]
fn sparse_set_with_capacity_of_seven_items_add_item_and_check_capacity() {
let mut sparse_set: SparseSet<i32> = SparseSet::with_capacity(6);
sparse_set.push(42);
sparse_set.push(43);
sparse_set.push(44);
sparse_set.push(45);
sparse_set.push(46);
sparse_set.push(47);
assert_eq!(sparse_set.capacity(), 6);
sparse_set.push(48);
assert_eq!(sparse_set.capacity(), 12);
}
#[test]
fn empty_sparse_set_reserve_zero_and_check_capacity_returns_zero() {
let mut sparse_set: SparseSet<i32> = SparseSet::new();
sparse_set.reserve(0);
assert_eq!(sparse_set.capacity(), 0);
}
#[test]
fn empty_sparse_set_reserve_eight_and_check_capacity_returns_eight() {
let mut sparse_set: SparseSet<i32> = SparseSet::new();
sparse_set.reserve(8);
assert_eq!(sparse_set.capacity(), 8);
}
#[test]
fn sparse_set_with_capacity_of_six_reserve_zero_and_check_capacity_returns_six() {
let mut sparse_set: SparseSet<i32> = SparseSet::with_capacity(6);
sparse_set.reserve(0);
assert_eq!(sparse_set.capacity(), 6);
}
#[test]
fn sparse_set_with_capacity_of_six_reserve_eight_and_check_capacity_returns_eight() {
let mut sparse_set: SparseSet<i32> = SparseSet::with_capacity(6);
sparse_set.reserve(8);
assert_eq!(sparse_set.capacity(), 8);
}
#[test]
fn sparse_set_with_capacity_of_six_and_one_element_reserve_zero_and_check_capacity_returns_six()
{
let mut sparse_set: SparseSet<i32> = SparseSet::with_capacity(6);
sparse_set.push(42);
sparse_set.reserve(0);
assert_eq!(sparse_set.capacity(), 6);
}
#[test]
fn sparse_set_with_capacity_of_six_and_one_element_reserve_eight_and_check_capacity_returns_nine(
) {
let mut sparse_set: SparseSet<i32> = SparseSet::with_capacity(6);
sparse_set.push(42);
sparse_set.reserve(8);
assert_eq!(sparse_set.capacity(), 9);
}
#[test]
fn sparse_set_with_capacity_of_six_reserve_four_and_check_capacity_returns_six() {
let mut sparse_set: SparseSet<i32> = SparseSet::with_capacity(6);
sparse_set.reserve(4);
assert_eq!(sparse_set.capacity(), 6);
}
#[test]
fn sparse_set_with_capacity_of_six_reserve_six_and_check_capacity_returns_six() {
let mut sparse_set: SparseSet<i32> = SparseSet::with_capacity(6);
sparse_set.reserve(6);
assert_eq!(sparse_set.capacity(), 6);
}
#[test]
fn sparse_set_with_capacity_of_two_reserve_four_and_add_five_elements_capacity_is_expected_at_all_steps(
) {
let mut sparse_set: SparseSet<i32> = SparseSet::with_capacity(2);
assert_eq!(sparse_set.capacity(), 2);
sparse_set.reserve(4);
assert_eq!(sparse_set.capacity(), 4);
sparse_set.push(42);
assert_eq!(sparse_set.capacity(), 4);
sparse_set.push(43);
assert_eq!(sparse_set.capacity(), 4);
sparse_set.push(44);
assert_eq!(sparse_set.capacity(), 4);
sparse_set.push(45);
assert_eq!(sparse_set.capacity(), 4);
sparse_set.push(46);
assert_eq!(sparse_set.capacity(), 8);
}
#[test]
fn sparse_set_with_two_elements_reserve_four_and_add_five_elements_all_elements_are_added() {
let mut sparse_set: SparseSet<i32> = SparseSet::with_capacity(2);
let key1 = sparse_set.push(42);
let key2 = sparse_set.push(43);
sparse_set.reserve(4);
assert_eq!(sparse_set.capacity(), 6);
let key3 = sparse_set.push(44);
let key4 = sparse_set.push(45);
let key5 = sparse_set.push(46);
let key6 = sparse_set.push(47);
assert_eq!(sparse_set.capacity(), 6);
let key7 = sparse_set.push(48);
assert_eq!(sparse_set.capacity(), 12);
assert_eq!(sparse_set.len(), 7);
assert_eq!(sparse_set.get_key(0), Some(key1));
assert_eq!(sparse_set.get_key(1), Some(key2));
assert_eq!(sparse_set.get_key(2), Some(key3));
assert_eq!(sparse_set.get_key(3), Some(key4));
assert_eq!(sparse_set.get_key(4), Some(key5));
assert_eq!(sparse_set.get_key(5), Some(key6));
assert_eq!(sparse_set.get_key(6), Some(key7));
assert_eq!(sparse_set.get(key1), Some(&42));
assert_eq!(sparse_set.get(key2), Some(&43));
assert_eq!(sparse_set.get(key3), Some(&44));
assert_eq!(sparse_set.get(key4), Some(&45));
assert_eq!(sparse_set.get(key5), Some(&46));
assert_eq!(sparse_set.get(key6), Some(&47));
assert_eq!(sparse_set.get(key7), Some(&48));
}
#[test]
fn empty_sparse_set_extend_with_vec_has_all_vec_elements() {
let mut sparse_set: SparseSet<i32> = SparseSet::new();
sparse_set.extend_with_vec(vec![42, 43, 44]);
assert_eq!(sparse_set.len(), 3);
assert_eq!(sparse_set.get(sparse_set.get_key(0).unwrap()), Some(&42));
assert_eq!(sparse_set.get(sparse_set.get_key(1).unwrap()), Some(&43));
assert_eq!(sparse_set.get(sparse_set.get_key(2).unwrap()), Some(&44));
}
#[test]
fn sparse_set_with_two_elements_extend_with_vec_has_all_elements() {
let mut sparse_set: SparseSet<i32> = SparseSet::new();
let key1 = sparse_set.push(42);
let key2 = sparse_set.push(43);
sparse_set.extend_with_vec(vec![44, 45, 46]);
assert_eq!(sparse_set.len(), 5);
assert_eq!(sparse_set.get(key1), Some(&42));
assert_eq!(sparse_set.get(key2), Some(&43));
assert_eq!(sparse_set.get(sparse_set.get_key(2).unwrap()), Some(&44));
assert_eq!(sparse_set.get(sparse_set.get_key(3).unwrap()), Some(&45));
assert_eq!(sparse_set.get(sparse_set.get_key(4).unwrap()), Some(&46));
}
#[test]
fn sparse_set_with_two_elements_extend_with_empty_vec_sparse_set_has_two_elements() {
let mut sparse_set: SparseSet<i32> = SparseSet::new();
let key1 = sparse_set.push(42);
let key2 = sparse_set.push(43);
sparse_set.extend_with_vec(Vec::new());
assert_eq!(sparse_set.len(), 2);
assert_eq!(sparse_set.get(key1), Some(&42));
assert_eq!(sparse_set.get(key2), Some(&43));
}
#[test]
fn empty_sparse_set_consume_into_vec_has_0_elements() {
let sparse_set: SparseSet<i32> = SparseSet::new();
let vec: Vec<i32> = sparse_set.into_vec();
assert_eq!(vec, Vec::<i32>::new());
}
#[test]
fn sparse_set_with_capacity_three_and_three_elements_consume_into_vec_vec_has_two_elements() {
let mut sparse_set: SparseSet<i32> = SparseSet::with_capacity(3);
sparse_set.push(1);
sparse_set.push(2);
sparse_set.push(3);
let vec: Vec<i32> = sparse_set.into_vec();
assert_eq!(vec, vec![1, 2, 3]);
}
#[test]
fn sparse_set_with_capacity_three_and_two_elements_consume_into_vec_vec_has_two_elements() {
let mut sparse_set: SparseSet<i32> = SparseSet::with_capacity(3);
sparse_set.push(1);
sparse_set.push(2);
let vec: Vec<i32> = sparse_set.into_vec();
assert_eq!(vec, vec![1, 2]);
}
#[test]
fn sparse_set_with_three_elements_remove_and_add_one_beyond_max_epoch_sparse_set_is_still_valid(
) {
let mut sparse_set: SparseSet<i32> = SparseSet::with_capacity(3);
let key1 = sparse_set.push(42);
let key2_original = sparse_set.push(43);
let key3 = sparse_set.push(44);
let key2 = sparse_set.test_only_set_sparse_epoch_by_index(1, MAX_EPOCH);
assert_eq!(sparse_set.contains(key2), true); sparse_set.remove(key2);
let key4 = sparse_set.push(45);
assert_eq!(sparse_set.len(), 3);
assert_eq!(sparse_set.get(key1), Some(&42));
assert_eq!(sparse_set.get(key2_original), None);
assert_eq!(sparse_set.get(key2), None);
assert_eq!(sparse_set.get(key3), Some(&44));
assert_eq!(sparse_set.get(key4), Some(&45));
assert_eq!(sparse_set.get_by_index(0), Some(&42));
assert_eq!(sparse_set.get_by_index(1), Some(&44));
assert_eq!(sparse_set.get_by_index(2), Some(&45));
assert_eq!(sparse_set.capacity(), 6);
let key5 = sparse_set.push(46);
let key6 = sparse_set.push(47);
let key7 = sparse_set.push(48);
let key8 = sparse_set.push(49);
assert_eq!(sparse_set.len(), 7);
assert_eq!(sparse_set.get(key1), Some(&42));
assert_eq!(sparse_set.get(key2_original), None);
assert_eq!(sparse_set.get(key2), None);
assert_eq!(sparse_set.get(key3), Some(&44));
assert_eq!(sparse_set.get(key4), Some(&45));
assert_eq!(sparse_set.get(key5), Some(&46));
assert_eq!(sparse_set.get(key6), Some(&47));
assert_eq!(sparse_set.get(key7), Some(&48));
assert_eq!(sparse_set.get(key8), Some(&49));
assert_eq!(sparse_set.get_by_index(0), Some(&42));
assert_eq!(sparse_set.get_by_index(1), Some(&44));
assert_eq!(sparse_set.get_by_index(2), Some(&45));
assert_eq!(sparse_set.get_by_index(3), Some(&46));
assert_eq!(sparse_set.get_by_index(4), Some(&47));
assert_eq!(sparse_set.get_by_index(5), Some(&48));
assert_eq!(sparse_set.get_by_index(6), Some(&49));
assert_eq!(sparse_set.capacity(), 12);
}
#[test]
fn empty_sparse_set_of_strings_created_no_items() {
let sparse_set: SparseSet<String> = SparseSet::new();
assert_eq!(sparse_set.len(), 0);
for _ in sparse_set.values() {
assert!(false);
}
}
#[test]
fn empty_sparse_set_of_strings_created_with_capacity_no_items() {
let sparse_set: SparseSet<String> = SparseSet::with_capacity(10);
assert_eq!(sparse_set.len(), 0);
for _ in sparse_set.values() {
assert!(false);
}
}
#[test]
fn empty_sparse_set_of_strings_push_item_has_one_item() {
let mut sparse_set: SparseSet<String> = SparseSet::new();
let expected = "42".to_string();
let key = sparse_set.push("42".to_string());
assert_eq!(sparse_set.len(), 1);
assert_eq!(sparse_set.get_key(0), Some(key));
assert_eq!(sparse_set.get(key), Some(&expected));
}
#[test]
fn empty_sparse_set_of_strings_with_capacity_push_item_has_one_item() {
let mut sparse_set: SparseSet<String> = SparseSet::with_capacity(10);
let key = sparse_set.push("42".to_string());
assert_eq!(sparse_set.len(), 1);
assert_eq!(sparse_set.get_key(0), Some(key));
assert_eq!(sparse_set.get(key), Some(&"42".to_string()));
}
#[test]
fn empty_sparse_set_of_strings_insert_item_at_zero_position_has_one_item() {
let mut sparse_set: SparseSet<String> = SparseSet::new();
let key = sparse_set.insert_at_position(0, "42".to_string());
assert_eq!(sparse_set.len(), 1);
assert_eq!(sparse_set.get_key(0), Some(key));
assert_eq!(sparse_set.get(key), Some(&"42".to_string()));
}
#[test]
fn empty_sparse_set_of_strings_with_capacity_insert_item_at_zero_position_has_one_item() {
let mut sparse_set: SparseSet<String> = SparseSet::with_capacity(1);
let key = sparse_set.insert_at_position(0, "42".to_string());
assert_eq!(sparse_set.len(), 1);
assert_eq!(sparse_set.get_key(0), Some(key));
assert_eq!(sparse_set.get(key), Some(&"42".to_string()));
}
#[test]
fn sparse_set_of_strings_with_three_items_insert_item_in_the_middle_sparse_set_has_four_items()
{
let mut sparse_set: SparseSet<String> = SparseSet::with_capacity(3);
let key1 = sparse_set.insert_at_position(0, "41".to_string());
let key2 = sparse_set.insert_at_position(1, "42".to_string());
let key3 = sparse_set.insert_at_position(2, "43".to_string());
let new_key = sparse_set.insert_at_position(1, "44".to_string());
assert_eq!(sparse_set.len(), 4);
assert_eq!(sparse_set.get_by_index(0), Some(&"41".to_string()));
assert_eq!(sparse_set.get_by_index(1), Some(&"44".to_string()));
assert_eq!(sparse_set.get_by_index(2), Some(&"42".to_string()));
assert_eq!(sparse_set.get_by_index(3), Some(&"43".to_string()));
assert_eq!(sparse_set.get(key1), Some(&"41".to_string()));
assert_eq!(sparse_set.get(key2), Some(&"42".to_string()));
assert_eq!(sparse_set.get(key3), Some(&"43".to_string()));
assert_eq!(sparse_set.get(new_key), Some(&"44".to_string()));
}
#[test]
#[should_panic]
fn sparse_set_of_strings_with_one_item_insert_item_at_incorrect_position_panics() {
let mut sparse_set = SparseSet::new();
sparse_set.push("42".to_string());
sparse_set.insert_at_position(2, "41".to_string());
}
#[test]
fn empty_sparse_set_of_strings_resize_to_0_sparse_set_is_empty() {
let mut sparse_set: SparseSet<String> = SparseSet::new();
sparse_set.resize(0, "42".to_string());
assert!(sparse_set.is_empty());
}
#[test]
fn empty_sparse_set_of_strings_resize_to_ten_sparse_set_has_ten_identical_items() {
let mut sparse_set: SparseSet<String> = SparseSet::new();
sparse_set.resize(10, "42".to_string());
assert_eq!(sparse_set.len(), 10);
for i in 0..10 {
assert_eq!(sparse_set.get_by_index(i), Some(&"42".to_string()));
}
}
#[test]
fn sparse_set_of_strings_with_three_items_resize_to_two_items_sparse_set_has_two_items() {
let mut sparse_set: SparseSet<String> = SparseSet::new();
let key1 = sparse_set.push("42".to_string());
let key2 = sparse_set.push("43".to_string());
let key3 = sparse_set.push("44".to_string());
sparse_set.resize(2, "45".to_string());
assert_eq!(sparse_set.len(), 2);
assert_eq!(sparse_set.get(key1), Some(&"42".to_string()));
assert_eq!(sparse_set.get(key2), Some(&"43".to_string()));
assert_eq!(sparse_set.get(key3), None);
}
#[test]
fn empty_vec_create_sparse_set_of_strings_from_vec_sparse_set_is_empty() {
let sparse_set: SparseSet<String> = SparseSet::from_vec(vec![]);
assert_eq!(sparse_set.len(), 0);
}
#[test]
fn vec_with_three_values_create_sparse_set_of_strings_from_vec_sparse_set_has_three_items() {
let sparse_set: SparseSet<String> =
SparseSet::from_vec(vec!["1".to_string(), "2".to_string(), "3".to_string()]);
assert_eq!(sparse_set.len(), 3);
assert_eq!(sparse_set.get_by_index(0), Some(&"1".to_string()));
assert_eq!(sparse_set.get_by_index(1), Some(&"2".to_string()));
assert_eq!(sparse_set.get_by_index(2), Some(&"3".to_string()));
}
#[test]
fn sparse_set_of_strings_with_three_items_get_key_the_expected_key_is_returned() {
let mut sparse_set: SparseSet<String> = SparseSet::new();
let key1 = sparse_set.push("42".to_string());
let key2 = sparse_set.push("43".to_string());
let key3 = sparse_set.push("44".to_string());
assert_eq!(sparse_set.get_key(0), Some(key1));
assert_eq!(sparse_set.get_key(1), Some(key2));
assert_eq!(sparse_set.get_key(2), Some(key3));
}
#[test]
fn sparse_set_of_strings_with_three_items_get_key_out_of_bounds_returns_none() {
let mut sparse_set: SparseSet<String> = SparseSet::new();
sparse_set.push("42".to_string());
sparse_set.push("43".to_string());
sparse_set.push("44".to_string());
assert_eq!(sparse_set.get_key(3), None);
assert_eq!(sparse_set.get_key(4), None);
}
#[test]
fn sparse_set_of_strings_with_three_items_remove_and_add_item_and_get_key_the_expected_key_is_returned(
) {
let mut sparse_set: SparseSet<String> = SparseSet::new();
let key1 = sparse_set.push("42".to_string());
let key2 = sparse_set.push("43".to_string());
let key3 = sparse_set.push("44".to_string());
sparse_set.remove(key1);
let key4 = sparse_set.push("45".to_string());
assert_eq!(sparse_set.get_key(0), Some(key2));
assert_eq!(sparse_set.get_key(1), Some(key3));
assert_eq!(sparse_set.get_key(2), Some(key4));
}
#[test]
fn sparse_set_of_strings_with_one_item_mutate_the_item_the_item_is_changed() {
let mut sparse_set: SparseSet<String> = SparseSet::new();
let key = sparse_set.push("42".to_string());
*sparse_set.get_mut(key).unwrap() = "43".to_string();
assert_eq!(sparse_set.len(), 1);
assert_eq!(sparse_set.get_key(0), Some(key));
assert_eq!(sparse_set.get(key), Some(&"43".to_string()));
}
#[test]
fn sparse_set_of_strings_with_one_item_get_item_by_index_the_item_is_returned() {
let mut sparse_set: SparseSet<String> = SparseSet::new();
sparse_set.push("42".to_string());
assert_eq!(sparse_set.get_by_index(0), Some(&"42".to_string()));
}
#[test]
fn sparse_set_of_strings_with_one_item_get_item_by_wrong_index_none_is_returned() {
let mut sparse_set: SparseSet<String> = SparseSet::new();
sparse_set.push("42".to_string());
assert_eq!(sparse_set.get_by_index(1), None);
}
#[test]
fn sparse_set_of_strings_with_one_item_get_mutable_ref_by_index_and_mutate_the_item_is_changed()
{
let mut sparse_set: SparseSet<String> = SparseSet::new();
let key = sparse_set.push("42".to_string());
let mutable_ref = sparse_set.get_by_index_mut(0).unwrap();
*mutable_ref = "43".to_string();
assert_eq!(sparse_set.get(key), Some(&"43".to_string()));
}
#[test]
fn sparse_set_of_strings_with_one_item_remove_item_no_items() {
let mut sparse_set: SparseSet<String> = SparseSet::new();
let key = sparse_set.push("42".to_string());
sparse_set.remove(key);
assert_eq!(sparse_set.len(), 0);
assert_eq!(sparse_set.get_key(0), None);
assert_eq!(sparse_set.get(key), None);
}
#[test]
fn sparse_set_of_strings_with_one_item_swap_remove_item_no_items() {
let mut sparse_set: SparseSet<String> = SparseSet::new();
let key = sparse_set.push("42".to_string());
sparse_set.swap_remove(key);
assert_eq!(sparse_set.len(), 0);
assert_eq!(sparse_set.get_key(0), None);
assert_eq!(sparse_set.get(key), None);
}
#[test]
fn sparse_set_of_strings_with_two_items_remove_first_item_has_one_item() {
let mut sparse_set: SparseSet<String> = SparseSet::new();
let key1 = sparse_set.push("42".to_string());
let key2 = sparse_set.push("43".to_string());
sparse_set.remove(key1);
assert_eq!(sparse_set.len(), 1);
assert_eq!(sparse_set.get_key(0), Some(key2));
assert_eq!(sparse_set.get_key(1), None);
assert_eq!(sparse_set.get(key1), None);
assert_eq!(sparse_set.get(key2), Some(&"43".to_string()));
}
#[test]
fn sparse_set_of_strings_with_two_items_swap_remove_first_item_has_one_item() {
let mut sparse_set: SparseSet<String> = SparseSet::new();
let key1 = sparse_set.push("42".to_string());
let key2 = sparse_set.push("43".to_string());
sparse_set.swap_remove(key1);
assert_eq!(sparse_set.len(), 1);
assert_eq!(sparse_set.get_key(0), Some(key2));
assert_eq!(sparse_set.get_key(1), None);
assert_eq!(sparse_set.get(key1), None);
assert_eq!(sparse_set.get(key2), Some(&"43".to_string()));
}
#[test]
fn sparse_set_of_strings_with_two_items_remove_second_item_has_one_item() {
let mut sparse_set: SparseSet<String> = SparseSet::new();
let key1 = sparse_set.push("42".to_string());
let key2 = sparse_set.push("43".to_string());
sparse_set.remove(key2);
assert_eq!(sparse_set.len(), 1);
assert_eq!(sparse_set.get_key(0), Some(key1));
assert_eq!(sparse_set.get_key(1), None);
assert_eq!(sparse_set.get(key1), Some(&"42".to_string()));
assert_eq!(sparse_set.get(key2), None);
}
#[test]
fn sparse_set_of_strings_with_two_items_swap_remove_second_item_has_one_item() {
let mut sparse_set: SparseSet<String> = SparseSet::new();
let key1 = sparse_set.push("42".to_string());
let key2 = sparse_set.push("43".to_string());
sparse_set.swap_remove(key2);
assert_eq!(sparse_set.len(), 1);
assert_eq!(sparse_set.get_key(0), Some(key1));
assert_eq!(sparse_set.get_key(1), None);
assert_eq!(sparse_set.get(key1), Some(&"42".to_string()));
assert_eq!(sparse_set.get(key2), None);
}
#[test]
fn sparse_set_of_strings_with_one_item_remove_an_item_and_push_new_item_has_one_item() {
let mut sparse_set: SparseSet<String> = SparseSet::new();
let key = sparse_set.push("42".to_string());
sparse_set.remove(key);
let new_key = sparse_set.push("43".to_string());
assert_eq!(sparse_set.len(), 1);
assert_eq!(sparse_set.get_key(0), Some(new_key));
assert_eq!(sparse_set.get_key(1), None);
assert_eq!(sparse_set.get(key), None);
assert_eq!(sparse_set.get(new_key), Some(&"43".to_string()));
}
#[test]
fn sparse_set_of_strings_with_one_item_swap_remove_an_item_and_push_new_item_has_one_item() {
let mut sparse_set: SparseSet<String> = SparseSet::new();
let key = sparse_set.push("42".to_string());
sparse_set.swap_remove(key);
let new_key = sparse_set.push("43".to_string());
assert_eq!(sparse_set.len(), 1);
assert_eq!(sparse_set.get_key(0), Some(new_key));
assert_eq!(sparse_set.get_key(1), None);
assert_eq!(sparse_set.get(key), None);
assert_eq!(sparse_set.get(new_key), Some(&"43".to_string()));
}
#[test]
fn sparse_set_of_strings_with_five_items_remove_first_item_order_is_not_changed() {
let mut sparse_set: SparseSet<String> = SparseSet::new();
let key1 = sparse_set.push("42".to_string());
let key2 = sparse_set.push("43".to_string());
let key3 = sparse_set.push("44".to_string());
let key4 = sparse_set.push("45".to_string());
let key5 = sparse_set.push("46".to_string());
sparse_set.remove(key1);
assert_eq!(sparse_set.len(), 4);
for (i, value) in sparse_set.values().enumerate() {
if i == 0 {
assert_eq!(value, &"43".to_string());
} else if i == 1 {
assert_eq!(value, &"44".to_string());
} else if i == 2 {
assert_eq!(value, &"45".to_string());
} else {
assert_eq!(value, &"46".to_string());
}
}
assert_eq!(sparse_set.get_key(0), Some(key2));
assert_eq!(sparse_set.get_key(1), Some(key3));
assert_eq!(sparse_set.get_key(2), Some(key4));
assert_eq!(sparse_set.get_key(3), Some(key5));
assert_eq!(sparse_set.get_key(4), None);
assert_eq!(sparse_set.get(key1), None);
assert_eq!(sparse_set.get(key2), Some(&"43".to_string()));
assert_eq!(sparse_set.get(key3), Some(&"44".to_string()));
assert_eq!(sparse_set.get(key4), Some(&"45".to_string()));
assert_eq!(sparse_set.get(key5), Some(&"46".to_string()));
}
#[test]
fn sparse_set_of_strings_with_one_item_remove_item_twice_no_items() {
let mut sparse_set: SparseSet<String> = SparseSet::new();
let key = sparse_set.push("42".to_string());
sparse_set.remove(key);
sparse_set.remove(key);
assert_eq!(sparse_set.len(), 0);
assert_eq!(sparse_set.get_key(0), None);
assert_eq!(sparse_set.get(key), None);
}
#[test]
fn sparse_set_of_strings_with_one_item_swap_remove_item_twice_no_items() {
let mut sparse_set: SparseSet<String> = SparseSet::new();
let key = sparse_set.push("42".to_string());
sparse_set.swap_remove(key);
sparse_set.swap_remove(key);
assert_eq!(sparse_set.len(), 0);
assert_eq!(sparse_set.get_key(0), None);
assert_eq!(sparse_set.get(key), None);
}
#[test]
fn sparse_set_of_strings_with_no_items_clear_no_items() {
let mut sparse_set: SparseSet<String> = SparseSet::new();
sparse_set.clear();
assert_eq!(sparse_set.len(), 0);
}
#[test]
fn sparse_set_of_strings_with_five_items_remove_first_item_by_index_order_is_not_changed() {
let mut sparse_set: SparseSet<String> = SparseSet::new();
let key1 = sparse_set.push("42".to_string());
let key2 = sparse_set.push("43".to_string());
let key3 = sparse_set.push("44".to_string());
let key4 = sparse_set.push("45".to_string());
let key5 = sparse_set.push("46".to_string());
sparse_set.remove_by_index(0);
assert_eq!(sparse_set.len(), 4);
assert_eq!(sparse_set.get_key(0), Some(key2));
assert_eq!(sparse_set.get_key(1), Some(key3));
assert_eq!(sparse_set.get_key(2), Some(key4));
assert_eq!(sparse_set.get_key(3), Some(key5));
assert_eq!(sparse_set.get_key(4), None);
assert_eq!(sparse_set.get(key1), None);
assert_eq!(sparse_set.get(key2), Some(&"43".to_string()));
assert_eq!(sparse_set.get(key3), Some(&"44".to_string()));
assert_eq!(sparse_set.get(key4), Some(&"45".to_string()));
assert_eq!(sparse_set.get(key5), Some(&"46".to_string()));
}
#[test]
fn sparse_set_of_strings_with_five_items_swap_remove_first_item_by_index_order_is_not_changed()
{
let mut sparse_set: SparseSet<String> = SparseSet::new();
let key1 = sparse_set.push("42".to_string());
let key2 = sparse_set.push("43".to_string());
let key3 = sparse_set.push("44".to_string());
let key4 = sparse_set.push("45".to_string());
let key5 = sparse_set.push("46".to_string());
sparse_set.swap_remove_by_index(0);
assert_eq!(sparse_set.len(), 4);
assert_eq!(sparse_set.get_key(0), Some(key5));
assert_eq!(sparse_set.get_key(1), Some(key2));
assert_eq!(sparse_set.get_key(2), Some(key3));
assert_eq!(sparse_set.get_key(3), Some(key4));
assert_eq!(sparse_set.get_key(4), None);
assert_eq!(sparse_set.get(key1), None);
assert_eq!(sparse_set.get(key2), Some(&"43".to_string()));
assert_eq!(sparse_set.get(key3), Some(&"44".to_string()));
assert_eq!(sparse_set.get(key4), Some(&"45".to_string()));
assert_eq!(sparse_set.get(key5), Some(&"46".to_string()));
}
#[test]
#[should_panic]
fn sparse_set_of_strings_with_two_items_remove_third_item_by_index_panics() {
let mut sparse_set: SparseSet<String> = SparseSet::new();
sparse_set.push("42".to_string());
sparse_set.push("43".to_string());
sparse_set.remove_by_index(2);
}
#[test]
fn sparse_set_of_strings_with_no_items_retain_no_items() {
let mut sparse_set: SparseSet<String> = SparseSet::new();
sparse_set.retain(|x| *x != "42".to_string());
assert_eq!(sparse_set.len(), 0);
}
#[test]
fn sparse_set_of_strings_with_three_items_retain_to_leave_one_item_one_item_left() {
let mut sparse_set: SparseSet<String> = SparseSet::new();
let key1 = sparse_set.push("42".to_string());
let key2 = sparse_set.push("43".to_string());
let key3 = sparse_set.push("44".to_string());
sparse_set.retain(|x| *x == "43".to_string());
assert_eq!(sparse_set.len(), 1);
assert_eq!(sparse_set.get(key1), None);
assert_eq!(sparse_set.get(key2), Some(&"43".to_string()));
assert_eq!(sparse_set.get(key3), None);
}
#[test]
fn sparse_set_of_strings_with_three_items_retain_to_leave_two_items_two_items_left() {
let mut sparse_set: SparseSet<String> = SparseSet::new();
let key1 = sparse_set.push("42".to_string());
let key2 = sparse_set.push("43".to_string());
let key3 = sparse_set.push("44".to_string());
sparse_set.retain(|x| *x != "43".to_string());
assert_eq!(sparse_set.len(), 2);
assert_eq!(sparse_set.get(key1), Some(&"42".to_string()));
assert_eq!(sparse_set.get(key2), None);
assert_eq!(sparse_set.get(key3), Some(&"44".to_string()));
}
#[test]
fn sparse_set_of_strings_with_one_item_clear_no_items() {
let mut sparse_set: SparseSet<String> = SparseSet::new();
sparse_set.push("42".to_string());
sparse_set.push("43".to_string());
sparse_set.push("44".to_string());
sparse_set.clear();
assert_eq!(sparse_set.len(), 0);
}
#[test]
fn sparse_set_of_strings_with_three_items_clear_and_add_new_items_old_keys_are_invalid() {
let mut sparse_set: SparseSet<String> = SparseSet::new();
let key1 = sparse_set.push("42".to_string());
let key2 = sparse_set.push("43".to_string());
let key3 = sparse_set.push("44".to_string());
sparse_set.clear();
let key4 = sparse_set.push("45".to_string());
let key5 = sparse_set.push("46".to_string());
let key6 = sparse_set.push("47".to_string());
assert_eq!(sparse_set.len(), 3);
assert_eq!(sparse_set.contains(key1), false);
assert_eq!(sparse_set.contains(key2), false);
assert_eq!(sparse_set.contains(key3), false);
assert_eq!(sparse_set.contains(key4), true);
assert_eq!(sparse_set.contains(key5), true);
assert_eq!(sparse_set.contains(key6), true);
}
#[test]
fn sparse_set_of_strings_with_three_items_iterate_over_values_the_values_are_iterated_in_order()
{
let mut sparse_set: SparseSet<String> = SparseSet::new();
sparse_set.push("42".to_string());
sparse_set.push("43".to_string());
sparse_set.push("44".to_string());
for (i, value) in sparse_set.values().enumerate() {
if i == 0 {
assert_eq!(value, &"42".to_string());
} else if i == 1 {
assert_eq!(value, &"43".to_string());
} else {
assert_eq!(value, &"44".to_string());
}
}
}
#[test]
fn sparse_set_of_strings_with_three_items_iterate_over_keys_the_keys_are_iterated_in_order() {
let mut sparse_set: SparseSet<String> = SparseSet::new();
sparse_set.push("42".to_string());
sparse_set.push("43".to_string());
sparse_set.push("44".to_string());
for (i, key) in sparse_set.keys().enumerate() {
let expected = if i == 0 {
"42".to_string()
} else if i == 1 {
"43".to_string()
} else {
"44".to_string()
};
assert_eq!(sparse_set.get(key), Some(&expected));
}
}
#[test]
fn sparse_set_of_strings_with_three_items_iterate_over_key_values_the_key_values_are_iterated_in_order(
) {
let mut sparse_set: SparseSet<String> = SparseSet::new();
let key1 = sparse_set.push("42".to_string());
let key2 = sparse_set.push("43".to_string());
let key3 = sparse_set.push("44".to_string());
for (i, (key, value)) in sparse_set.key_values().enumerate() {
if i == 0 {
assert_eq!(value, &"42".to_string());
assert_eq!(key, key1);
} else if i == 1 {
assert_eq!(value, &"43".to_string());
assert_eq!(key, key2);
} else {
assert_eq!(value, &"44".to_string());
assert_eq!(key, key3);
}
}
}
#[test]
fn sparse_set_of_strings_with_one_item_iterate_over_values_and_mutate_the_value_is_changed() {
let mut sparse_set: SparseSet<String> = SparseSet::new();
let key = sparse_set.push("42".to_string());
for value in sparse_set.values_mut() {
*value = "43".to_string();
}
assert_eq!(sparse_set.len(), 1);
assert_eq!(sparse_set.get(key), Some(&"43".to_string()));
}
#[test]
fn sparse_set_of_strings_with_two_items_swap_the_items_the_items_are_swapped_in_order_but_not_by_keys(
) {
let mut sparse_set: SparseSet<String> = SparseSet::new();
let key1 = sparse_set.push("42".to_string());
let key2 = sparse_set.push("43".to_string());
sparse_set.swap(key1, key2);
assert_eq!(sparse_set.len(), 2);
for (i, value) in sparse_set.values().enumerate() {
if i == 0 {
assert_eq!(value, &"43".to_string());
} else {
assert_eq!(value, &"42".to_string());
}
}
assert_eq!(sparse_set.get_key(0), Some(key2));
assert_eq!(sparse_set.get_key(1), Some(key1));
assert_eq!(sparse_set.get(key1), Some(&"42".to_string()));
assert_eq!(sparse_set.get(key2), Some(&"43".to_string()));
}
#[test]
fn sparse_set_of_strings_with_one_item_try_swapping_with_itself_does_nothing() {
let mut sparse_set: SparseSet<String> = SparseSet::new();
let key = sparse_set.push("42".to_string());
sparse_set.swap(key, key);
assert_eq!(sparse_set.len(), 1);
assert_eq!(sparse_set.get_key(0), Some(key));
assert_eq!(sparse_set.get(key), Some(&"42".to_string()));
}
#[test]
fn sparse_set_of_strings_with_two_items_swap_the_items_by_indices_the_items_are_swapped_in_order_but_not_by_keys(
) {
let mut sparse_set: SparseSet<String> = SparseSet::new();
let key1 = sparse_set.push("42".to_string());
let key2 = sparse_set.push("43".to_string());
sparse_set.swap_by_index(0, 1);
assert_eq!(sparse_set.len(), 2);
for (i, value) in sparse_set.values().enumerate() {
if i == 0 {
assert_eq!(value, &"43".to_string());
} else {
assert_eq!(value, &"42".to_string());
}
}
assert_eq!(sparse_set.get_key(0), Some(key2));
assert_eq!(sparse_set.get_key(1), Some(key1));
assert_eq!(sparse_set.get(key1), Some(&"42".to_string()));
assert_eq!(sparse_set.get(key2), Some(&"43".to_string()));
}
#[test]
fn sparse_set_of_strings_with_one_item_try_swapping_with_itself_by_index_does_nothing() {
let mut sparse_set: SparseSet<String> = SparseSet::new();
let key = sparse_set.push("42".to_string());
sparse_set.swap_by_index(0, 0);
assert_eq!(sparse_set.len(), 1);
assert_eq!(sparse_set.get_key(0), Some(key));
assert_eq!(sparse_set.get(key), Some(&"42".to_string()));
}
#[test]
#[should_panic]
fn sparse_set_of_strings_with_one_item_try_swapping_with_non_existing_element_by_index_panics()
{
let mut sparse_set: SparseSet<String> = SparseSet::new();
sparse_set.push("42".to_string());
sparse_set.swap_by_index(0, 1);
}
#[test]
fn sparse_set_of_strings_with_five_items_clone_the_set_cloned_set_has_the_same_items() {
let mut sparse_set: SparseSet<String> = SparseSet::new();
let key1 = sparse_set.push("42".to_string());
let key2 = sparse_set.push("43".to_string());
let key3 = sparse_set.push("44".to_string());
let key4 = sparse_set.push("45".to_string());
let key5 = sparse_set.push("46".to_string());
let cloned_sparse_set = sparse_set.clone();
assert_eq!(cloned_sparse_set.len(), 5);
assert_eq!(cloned_sparse_set.get_key(0), Some(key1));
assert_eq!(cloned_sparse_set.get_key(1), Some(key2));
assert_eq!(cloned_sparse_set.get_key(2), Some(key3));
assert_eq!(cloned_sparse_set.get_key(3), Some(key4));
assert_eq!(cloned_sparse_set.get_key(4), Some(key5));
assert_eq!(cloned_sparse_set.get(key1), Some(&"42".to_string()));
assert_eq!(cloned_sparse_set.get(key2), Some(&"43".to_string()));
assert_eq!(cloned_sparse_set.get(key3), Some(&"44".to_string()));
assert_eq!(cloned_sparse_set.get(key4), Some(&"45".to_string()));
assert_eq!(cloned_sparse_set.get(key5), Some(&"46".to_string()));
}
#[test]
fn sparse_set_of_strings_with_one_item_check_if_contains_returns_true() {
let mut sparse_set: SparseSet<String> = SparseSet::new();
let key = sparse_set.push("42".to_string());
assert!(sparse_set.contains(key));
}
#[test]
fn sparse_set_of_strings_with_one_item_remove_the_item_and_check_if_contains_returns_false() {
let mut sparse_set: SparseSet<String> = SparseSet::new();
let key = sparse_set.push("42".to_string());
sparse_set.swap_remove(key);
assert!(!sparse_set.contains(key));
}
#[test]
#[should_panic]
fn sparse_set_with_two_strings_remove_item_and_try_to_swap_it_panics() {
let mut sparse_set: SparseSet<String> = SparseSet::new();
let key1 = sparse_set.push("42".to_string());
let key2 = sparse_set.push("43".to_string());
sparse_set.remove(key1);
sparse_set.swap(key1, key2);
}
#[test]
#[should_panic]
fn two_sparse_sets_of_strings_with_different_sizes_try_to_access_non_existent_key_panics() {
let mut sparse_set1: SparseSet<String> = SparseSet::with_capacity(1);
let key1 = sparse_set1.push("42".to_string());
let sparse_set2: SparseSet<String> = SparseSet::new();
sparse_set2.get(key1);
}
#[test]
#[should_panic]
fn two_sparse_sets_of_strings_with_different_sizes_try_to_remove_non_existent_key_panics() {
let mut sparse_set1: SparseSet<String> = SparseSet::with_capacity(1);
let key1 = sparse_set1.push("42".to_string());
let mut sparse_set2: SparseSet<String> = SparseSet::new();
sparse_set2.remove(key1);
}
#[test]
#[should_panic]
fn two_sparse_sets_of_strings_with_different_sizes_try_to_swap_remove_non_existent_key_panics()
{
let mut sparse_set1: SparseSet<String> = SparseSet::with_capacity(1);
let key1 = sparse_set1.push("42".to_string());
let mut sparse_set2: SparseSet<String> = SparseSet::new();
sparse_set2.swap_remove(key1);
}
#[test]
#[should_panic]
fn two_sparse_sets_of_strings_with_different_sizes_try_to_swap_non_existent_keys_panics() {
let mut sparse_set1: SparseSet<String> = SparseSet::with_capacity(1);
sparse_set1.push("42".to_string());
let key2 = sparse_set1.push("43".to_string());
let mut sparse_set2: SparseSet<String> = SparseSet::new();
let key3 = sparse_set2.push("44".to_string());
sparse_set2.swap(key2, key3);
}
#[test]
fn sparse_set_of_strings_with_one_item_rotate_left_has_that_same_item() {
let mut sparse_set: SparseSet<String> = SparseSet::new();
let key = sparse_set.push("42".to_string());
sparse_set.rotate_left(0, 1, 1);
assert_eq!(sparse_set.len(), 1);
assert_eq!(sparse_set.get_key(0), Some(key));
assert_eq!(sparse_set.get(key), Some(&"42".to_string()));
}
#[test]
fn sparse_set_of_strings_with_two_items_rotate_left_once_items_change_position_with_stable_keys(
) {
let mut sparse_set: SparseSet<String> = SparseSet::new();
let key1 = sparse_set.push("42".to_string());
let key2 = sparse_set.push("43".to_string());
sparse_set.rotate_left(0, 2, 1);
assert_eq!(sparse_set.len(), 2);
assert_eq!(sparse_set.get_key(0), Some(key2));
assert_eq!(sparse_set.get_key(1), Some(key1));
assert_eq!(sparse_set.get(key1), Some(&"42".to_string()));
assert_eq!(sparse_set.get(key2), Some(&"43".to_string()));
}
#[test]
fn sparse_set_of_strings_with_two_items_rotate_left_twice_items_return_to_the_same_positions() {
let mut sparse_set: SparseSet<String> = SparseSet::new();
let key1 = sparse_set.push("42".to_string());
let key2 = sparse_set.push("43".to_string());
sparse_set.rotate_left(0, 2, 2);
assert_eq!(sparse_set.len(), 2);
assert_eq!(sparse_set.get_key(0), Some(key1));
assert_eq!(sparse_set.get_key(1), Some(key2));
assert_eq!(sparse_set.get(key1), Some(&"42".to_string()));
assert_eq!(sparse_set.get(key2), Some(&"43".to_string()));
}
#[test]
fn sparse_set_of_strings_with_three_items_rotate_left_once_items_change_position_with_stable_keys(
) {
let mut sparse_set: SparseSet<String> = SparseSet::new();
let key1 = sparse_set.push("42".to_string());
let key2 = sparse_set.push("43".to_string());
let key3 = sparse_set.push("44".to_string());
sparse_set.rotate_left(0, 3, 1);
assert_eq!(sparse_set.len(), 3);
assert_eq!(sparse_set.get_key(0), Some(key2));
assert_eq!(sparse_set.get_key(1), Some(key3));
assert_eq!(sparse_set.get_key(2), Some(key1));
assert_eq!(sparse_set.get(key1), Some(&"42".to_string()));
assert_eq!(sparse_set.get(key2), Some(&"43".to_string()));
assert_eq!(sparse_set.get(key3), Some(&"44".to_string()));
}
#[test]
fn sparse_set_of_strings_with_three_items_rotate_left_twice_items_change_position_with_stable_keys(
) {
let mut sparse_set: SparseSet<String> = SparseSet::new();
let key1 = sparse_set.push("42".to_string());
let key2 = sparse_set.push("43".to_string());
let key3 = sparse_set.push("44".to_string());
sparse_set.rotate_left(0, 3, 2);
assert_eq!(sparse_set.len(), 3);
assert_eq!(sparse_set.get_key(0), Some(key3));
assert_eq!(sparse_set.get_key(1), Some(key1));
assert_eq!(sparse_set.get_key(2), Some(key2));
assert_eq!(sparse_set.get(key1), Some(&"42".to_string()));
assert_eq!(sparse_set.get(key2), Some(&"43".to_string()));
assert_eq!(sparse_set.get(key3), Some(&"44".to_string()));
}
#[test]
fn sparse_set_of_strings_with_four_items_rotate_middle_two_left_once_items_change_position_with_stable_keys(
) {
let mut sparse_set: SparseSet<String> = SparseSet::new();
let key1 = sparse_set.push("42".to_string());
let key2 = sparse_set.push("43".to_string());
let key3 = sparse_set.push("44".to_string());
let key4 = sparse_set.push("45".to_string());
sparse_set.rotate_left(1, 3, 1);
assert_eq!(sparse_set.len(), 4);
assert_eq!(sparse_set.get_key(0), Some(key1));
assert_eq!(sparse_set.get_key(1), Some(key3));
assert_eq!(sparse_set.get_key(2), Some(key2));
assert_eq!(sparse_set.get_key(3), Some(key4));
assert_eq!(sparse_set.get(key1), Some(&"42".to_string()));
assert_eq!(sparse_set.get(key2), Some(&"43".to_string()));
assert_eq!(sparse_set.get(key3), Some(&"44".to_string()));
assert_eq!(sparse_set.get(key4), Some(&"45".to_string()));
}
#[test]
fn sparse_set_of_strings_with_one_item_rotate_right_has_that_same_item() {
let mut sparse_set: SparseSet<String> = SparseSet::new();
let key = sparse_set.push("42".to_string());
sparse_set.rotate_right(0, 1, 1);
assert_eq!(sparse_set.len(), 1);
assert_eq!(sparse_set.get_key(0), Some(key));
assert_eq!(sparse_set.get(key), Some(&"42".to_string()));
}
#[test]
fn sparse_set_of_strings_with_two_items_rotate_right_once_items_change_position_with_stable_keys(
) {
let mut sparse_set: SparseSet<String> = SparseSet::new();
let key1 = sparse_set.push("42".to_string());
let key2 = sparse_set.push("43".to_string());
sparse_set.rotate_right(0, 2, 1);
assert_eq!(sparse_set.len(), 2);
assert_eq!(sparse_set.get_key(0), Some(key2));
assert_eq!(sparse_set.get_key(1), Some(key1));
assert_eq!(sparse_set.get(key1), Some(&"42".to_string()));
assert_eq!(sparse_set.get(key2), Some(&"43".to_string()));
}
#[test]
fn sparse_set_of_strings_with_two_items_rotate_right_twice_items_return_to_the_same_positions()
{
let mut sparse_set: SparseSet<String> = SparseSet::new();
let key1 = sparse_set.push("42".to_string());
let key2 = sparse_set.push("43".to_string());
sparse_set.rotate_right(0, 2, 2);
assert_eq!(sparse_set.len(), 2);
assert_eq!(sparse_set.get_key(0), Some(key1));
assert_eq!(sparse_set.get_key(1), Some(key2));
assert_eq!(sparse_set.get(key1), Some(&"42".to_string()));
assert_eq!(sparse_set.get(key2), Some(&"43".to_string()));
}
#[test]
fn sparse_set_of_strings_with_three_items_rotate_right_once_items_change_position_with_stable_keys(
) {
let mut sparse_set: SparseSet<String> = SparseSet::new();
let key1 = sparse_set.push("42".to_string());
let key2 = sparse_set.push("43".to_string());
let key3 = sparse_set.push("44".to_string());
sparse_set.rotate_right(0, 3, 1);
assert_eq!(sparse_set.len(), 3);
assert_eq!(sparse_set.get_key(0), Some(key3));
assert_eq!(sparse_set.get_key(1), Some(key1));
assert_eq!(sparse_set.get_key(2), Some(key2));
assert_eq!(sparse_set.get(key1), Some(&"42".to_string()));
assert_eq!(sparse_set.get(key2), Some(&"43".to_string()));
assert_eq!(sparse_set.get(key3), Some(&"44".to_string()));
}
#[test]
fn sparse_set_of_strings_with_three_items_rotate_right_twice_items_change_position_with_stable_keys(
) {
let mut sparse_set: SparseSet<String> = SparseSet::new();
let key1 = sparse_set.push("42".to_string());
let key2 = sparse_set.push("43".to_string());
let key3 = sparse_set.push("44".to_string());
sparse_set.rotate_right(0, 3, 2);
assert_eq!(sparse_set.len(), 3);
assert_eq!(sparse_set.get_key(0), Some(key2));
assert_eq!(sparse_set.get_key(1), Some(key3));
assert_eq!(sparse_set.get_key(2), Some(key1));
assert_eq!(sparse_set.get(key1), Some(&"42".to_string()));
assert_eq!(sparse_set.get(key2), Some(&"43".to_string()));
assert_eq!(sparse_set.get(key3), Some(&"44".to_string()));
}
#[test]
fn sparse_set_of_strings_with_four_items_rotate_middle_two_right_once_items_change_position_with_stable_keys(
) {
let mut sparse_set: SparseSet<String> = SparseSet::new();
let key1 = sparse_set.push("42".to_string());
let key2 = sparse_set.push("43".to_string());
let key3 = sparse_set.push("44".to_string());
let key4 = sparse_set.push("45".to_string());
sparse_set.rotate_right(1, 3, 1);
assert_eq!(sparse_set.len(), 4);
assert_eq!(sparse_set.get_key(0), Some(key1));
assert_eq!(sparse_set.get_key(1), Some(key3));
assert_eq!(sparse_set.get_key(2), Some(key2));
assert_eq!(sparse_set.get_key(3), Some(key4));
assert_eq!(sparse_set.get(key1), Some(&"42".to_string()));
assert_eq!(sparse_set.get(key2), Some(&"43".to_string()));
assert_eq!(sparse_set.get(key3), Some(&"44".to_string()));
assert_eq!(sparse_set.get(key4), Some(&"45".to_string()));
}
#[test]
fn sparse_set_of_strings_with_no_items_add_item_and_check_capacity_returns_four() {
let mut sparse_set: SparseSet<String> = SparseSet::new();
sparse_set.push("42".to_string());
assert_eq!(sparse_set.capacity(), 4);
}
#[test]
fn sparse_set_of_strings_with_no_items_add_five_items_and_check_capacity_returns_eight() {
let mut sparse_set: SparseSet<String> = SparseSet::new();
sparse_set.push("42".to_string());
sparse_set.push("43".to_string());
sparse_set.push("44".to_string());
sparse_set.push("45".to_string());
assert_eq!(sparse_set.capacity(), 4);
sparse_set.push("46".to_string());
assert_eq!(sparse_set.capacity(), 8);
}
#[test]
fn sparse_set_of_strings_with_capacity_of_seven_items_add_item_and_check_capacity() {
let mut sparse_set: SparseSet<String> = SparseSet::with_capacity(6);
sparse_set.push("42".to_string());
sparse_set.push("43".to_string());
sparse_set.push("44".to_string());
sparse_set.push("45".to_string());
sparse_set.push("46".to_string());
sparse_set.push("47".to_string());
assert_eq!(sparse_set.capacity(), 6);
sparse_set.push("48".to_string());
assert_eq!(sparse_set.capacity(), 12);
}
#[test]
fn empty_sparse_set_of_strings_reserve_zero_and_check_capacity_returns_zero() {
let mut sparse_set: SparseSet<String> = SparseSet::new();
sparse_set.reserve(0);
assert_eq!(sparse_set.capacity(), 0);
}
#[test]
fn empty_sparse_set_of_strings_reserve_eight_and_check_capacity_returns_eight() {
let mut sparse_set: SparseSet<String> = SparseSet::new();
sparse_set.reserve(8);
assert_eq!(sparse_set.capacity(), 8);
}
#[test]
fn sparse_set_of_strings_with_capacity_of_six_reserve_zero_and_check_capacity_returns_six() {
let mut sparse_set: SparseSet<String> = SparseSet::with_capacity(6);
sparse_set.reserve(0);
assert_eq!(sparse_set.capacity(), 6);
}
#[test]
fn sparse_set_of_strings_with_capacity_of_six_reserve_eight_and_check_capacity_returns_eight() {
let mut sparse_set: SparseSet<String> = SparseSet::with_capacity(6);
sparse_set.reserve(8);
assert_eq!(sparse_set.capacity(), 8);
}
#[test]
fn sparse_set_of_strings_with_capacity_of_six_and_one_element_reserve_zero_and_check_capacity_returns_six(
) {
let mut sparse_set: SparseSet<String> = SparseSet::with_capacity(6);
sparse_set.push("42".to_string());
sparse_set.reserve(0);
assert_eq!(sparse_set.capacity(), 6);
}
#[test]
fn sparse_set_of_strings_with_capacity_of_six_and_one_element_reserve_eight_and_check_capacity_returns_nine(
) {
let mut sparse_set: SparseSet<String> = SparseSet::with_capacity(6);
sparse_set.push("42".to_string());
sparse_set.reserve(8);
assert_eq!(sparse_set.capacity(), 9);
}
#[test]
fn sparse_set_of_strings_with_capacity_of_six_reserve_four_and_check_capacity_returns_six() {
let mut sparse_set: SparseSet<String> = SparseSet::with_capacity(6);
sparse_set.reserve(4);
assert_eq!(sparse_set.capacity(), 6);
}
#[test]
fn sparse_set_of_strings_with_capacity_of_six_reserve_six_and_check_capacity_returns_six() {
let mut sparse_set: SparseSet<String> = SparseSet::with_capacity(6);
sparse_set.reserve(6);
assert_eq!(sparse_set.capacity(), 6);
}
#[test]
fn sparse_set_of_strings_with_capacity_of_two_reserve_four_and_add_five_elements_capacity_is_as_expected_at_all_steps(
) {
let mut sparse_set: SparseSet<String> = SparseSet::with_capacity(2);
assert_eq!(sparse_set.capacity(), 2);
sparse_set.reserve(4);
assert_eq!(sparse_set.capacity(), 4);
sparse_set.push("42".to_string());
assert_eq!(sparse_set.capacity(), 4);
sparse_set.push("43".to_string());
assert_eq!(sparse_set.capacity(), 4);
sparse_set.push("44".to_string());
assert_eq!(sparse_set.capacity(), 4);
sparse_set.push("45".to_string());
assert_eq!(sparse_set.capacity(), 4);
sparse_set.push("46".to_string());
assert_eq!(sparse_set.capacity(), 8);
}
#[test]
fn sparse_set_of_strings_with_two_elements_reserve_four_and_add_five_elements_all_elements_are_added(
) {
let mut sparse_set: SparseSet<String> = SparseSet::with_capacity(2);
let key1 = sparse_set.push("42".to_string());
let key2 = sparse_set.push("43".to_string());
sparse_set.reserve(4);
assert_eq!(sparse_set.capacity(), 6);
let key3 = sparse_set.push("44".to_string());
let key4 = sparse_set.push("45".to_string());
let key5 = sparse_set.push("46".to_string());
let key6 = sparse_set.push("47".to_string());
assert_eq!(sparse_set.capacity(), 6);
let key7 = sparse_set.push("48".to_string());
assert_eq!(sparse_set.capacity(), 12);
assert_eq!(sparse_set.len(), 7);
assert_eq!(sparse_set.get_key(0), Some(key1));
assert_eq!(sparse_set.get_key(1), Some(key2));
assert_eq!(sparse_set.get_key(2), Some(key3));
assert_eq!(sparse_set.get_key(3), Some(key4));
assert_eq!(sparse_set.get_key(4), Some(key5));
assert_eq!(sparse_set.get_key(5), Some(key6));
assert_eq!(sparse_set.get_key(6), Some(key7));
assert_eq!(sparse_set.get(key1), Some(&"42".to_string()));
assert_eq!(sparse_set.get(key2), Some(&"43".to_string()));
assert_eq!(sparse_set.get(key3), Some(&"44".to_string()));
assert_eq!(sparse_set.get(key4), Some(&"45".to_string()));
assert_eq!(sparse_set.get(key5), Some(&"46".to_string()));
assert_eq!(sparse_set.get(key6), Some(&"47".to_string()));
assert_eq!(sparse_set.get(key7), Some(&"48".to_string()));
}
#[test]
fn empty_sparse_set_of_strings_extend_with_vec_has_all_vec_elements() {
let mut sparse_set: SparseSet<String> = SparseSet::new();
sparse_set.extend_with_vec(vec!["42".to_string(), "43".to_string(), "44".to_string()]);
assert_eq!(sparse_set.len(), 3);
assert_eq!(
sparse_set.get(sparse_set.get_key(0).unwrap()),
Some(&"42".to_string())
);
assert_eq!(
sparse_set.get(sparse_set.get_key(1).unwrap()),
Some(&"43".to_string())
);
assert_eq!(
sparse_set.get(sparse_set.get_key(2).unwrap()),
Some(&"44".to_string())
);
}
#[test]
fn sparse_set_of_strings_with_two_elements_extend_with_vec_has_all_elements() {
let mut sparse_set: SparseSet<String> = SparseSet::new();
let key1 = sparse_set.push("42".to_string());
let key2 = sparse_set.push("43".to_string());
sparse_set.extend_with_vec(vec!["44".to_string(), "45".to_string(), "46".to_string()]);
assert_eq!(sparse_set.len(), 5);
assert_eq!(sparse_set.get(key1), Some(&"42".to_string()));
assert_eq!(sparse_set.get(key2), Some(&"43".to_string()));
assert_eq!(
sparse_set.get(sparse_set.get_key(2).unwrap()),
Some(&"44".to_string())
);
assert_eq!(
sparse_set.get(sparse_set.get_key(3).unwrap()),
Some(&"45".to_string())
);
assert_eq!(
sparse_set.get(sparse_set.get_key(4).unwrap()),
Some(&"46".to_string())
);
}
#[test]
fn sparse_set_of_strings_with_two_elements_extend_with_empty_vec_sparse_set_has_two_elements() {
let mut sparse_set: SparseSet<String> = SparseSet::new();
let key1 = sparse_set.push("42".to_string());
let key2 = sparse_set.push("43".to_string());
sparse_set.extend_with_vec(Vec::new());
assert_eq!(sparse_set.len(), 2);
assert_eq!(sparse_set.get(key1), Some(&"42".to_string()));
assert_eq!(sparse_set.get(key2), Some(&"43".to_string()));
}
#[test]
fn empty_sparse_set_of_strings_consume_into_vec_has_0_elements() {
let sparse_set: SparseSet<String> = SparseSet::new();
let vec: Vec<String> = sparse_set.into_vec();
assert_eq!(vec, Vec::<String>::new());
}
#[test]
fn sparse_set_of_strings_with_capacity_three_and_three_elements_consume_into_vec_vec_has_two_elements(
) {
let mut sparse_set: SparseSet<String> = SparseSet::with_capacity(3);
sparse_set.push("1".to_string());
sparse_set.push("2".to_string());
sparse_set.push("3".to_string());
let vec: Vec<String> = sparse_set.into_vec();
assert_eq!(vec, vec!["1".to_string(), "2".to_string(), "3".to_string()]);
}
#[test]
fn sparse_set_of_strings_with_capacity_three_and_two_elements_consume_into_vec_vec_has_two_elements(
) {
let mut sparse_set: SparseSet<String> = SparseSet::with_capacity(3);
sparse_set.push("1".to_string());
sparse_set.push("2".to_string());
let vec: Vec<String> = sparse_set.into_vec();
assert_eq!(vec, vec!["1".to_string(), "2".to_string()]);
}
#[test]
fn sparse_set_of_strings_with_three_elements_remove_and_add_one_beyond_max_epoch_sparse_set_is_still_valid(
) {
let mut sparse_set: SparseSet<String> = SparseSet::with_capacity(3);
let key1 = sparse_set.push("42".to_string());
let key2_original = sparse_set.push("43".to_string());
let key3 = sparse_set.push("44".to_string());
let key2 = sparse_set.test_only_set_sparse_epoch_by_index(1, MAX_EPOCH);
assert_eq!(sparse_set.contains(key2), true); sparse_set.remove(key2);
let key4 = sparse_set.push("45".to_string());
assert_eq!(sparse_set.len(), 3);
assert_eq!(sparse_set.get(key1), Some(&"42".to_string()));
assert_eq!(sparse_set.get(key2_original), None);
assert_eq!(sparse_set.get(key2), None);
assert_eq!(sparse_set.get(key3), Some(&"44".to_string()));
assert_eq!(sparse_set.get(key4), Some(&"45".to_string()));
assert_eq!(sparse_set.get_by_index(0), Some(&"42".to_string()));
assert_eq!(sparse_set.get_by_index(1), Some(&"44".to_string()));
assert_eq!(sparse_set.get_by_index(2), Some(&"45".to_string()));
assert_eq!(sparse_set.capacity(), 6);
let key5 = sparse_set.push("46".to_string());
let key6 = sparse_set.push("47".to_string());
let key7 = sparse_set.push("48".to_string());
let key8 = sparse_set.push("49".to_string());
assert_eq!(sparse_set.len(), 7);
assert_eq!(sparse_set.get(key1), Some(&"42".to_string()));
assert_eq!(sparse_set.get(key2_original), None);
assert_eq!(sparse_set.get(key2), None);
assert_eq!(sparse_set.get(key3), Some(&"44".to_string()));
assert_eq!(sparse_set.get(key4), Some(&"45".to_string()));
assert_eq!(sparse_set.get(key5), Some(&"46".to_string()));
assert_eq!(sparse_set.get(key6), Some(&"47".to_string()));
assert_eq!(sparse_set.get(key7), Some(&"48".to_string()));
assert_eq!(sparse_set.get(key8), Some(&"49".to_string()));
assert_eq!(sparse_set.get_by_index(0), Some(&"42".to_string()));
assert_eq!(sparse_set.get_by_index(1), Some(&"44".to_string()));
assert_eq!(sparse_set.get_by_index(2), Some(&"45".to_string()));
assert_eq!(sparse_set.get_by_index(3), Some(&"46".to_string()));
assert_eq!(sparse_set.get_by_index(4), Some(&"47".to_string()));
assert_eq!(sparse_set.get_by_index(5), Some(&"48".to_string()));
assert_eq!(sparse_set.get_by_index(6), Some(&"49".to_string()));
assert_eq!(sparse_set.capacity(), 12);
}
#[test]
#[should_panic]
fn sparse_set_with_zst_try_to_create_panics() {
let _sparse_set: SparseSet<()> = SparseSet::new();
}
#[test]
#[should_panic]
fn sparse_set_with_zst_try_to_create_with_capacity_panics() {
let _sparse_set: SparseSet<()> = SparseSet::with_capacity(10);
}
#[test]
fn sparse_set_of_static_string_try_to_pass_as_a_value_with_more_generic_lifetime_compiles() {
#[allow(clippy::needless_lifetimes)]
fn accepting_sparse_set_of_string_with_lifetime<'a>(_sparse_set: &SparseSet<&'a str>) {}
let sparse_set: SparseSet<&'static str> = SparseSet::new();
accepting_sparse_set_of_string_with_lifetime(&sparse_set);
}
#[test]
#[should_panic]
fn sparse_set_try_to_resize_to_a_value_greater_than_isize_max_panics() {
let mut sparse_set: SparseSet<i32> = SparseSet::new();
sparse_set.resize(isize::MAX as usize + 1, 42);
}
#[test]
fn sparse_set_is_send() {
fn is_send<T: Send>() {}
is_send::<SparseSet<i32>>();
}
#[test]
fn sparse_set_is_sync() {
fn is_sync<T: Sync>() {}
is_sync::<SparseSet<i32>>();
}
}