Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

make code coverage up from 58.68% to 98.42% (for #166) #240

Merged
merged 1 commit into from
Mar 22, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/clone.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ impl<K: Clone + PartialEq, V: Clone, const N: usize> Clone for Map<K, V, N> {
}

#[cfg(test)]
mod test {
mod tests {

use super::*;

Expand Down
2 changes: 1 addition & 1 deletion src/ctors.rs
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ impl<K: PartialEq, V, const N: usize> Drop for Map<K, V, N> {
}

#[cfg(test)]
mod test {
mod tests {

use super::*;

Expand Down
2 changes: 1 addition & 1 deletion src/debug.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ impl<K: PartialEq + Debug, V: Debug, const N: usize> Debug for Map<K, V, N> {
}

#[cfg(test)]
mod test {
mod tests {

use super::*;

Expand Down
2 changes: 1 addition & 1 deletion src/display.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ impl<K: PartialEq + Display, V: Display, const N: usize> Display for Map<K, V, N
}

#[cfg(test)]
mod test {
mod tests {

use super::*;

Expand Down
35 changes: 35 additions & 0 deletions src/drain.rs
Original file line number Diff line number Diff line change
Expand Up @@ -34,3 +34,38 @@ impl<K: PartialEq, V> ExactSizeIterator for Drain<'_, K, V> {
}

impl<K: PartialEq, V> FusedIterator for Drain<'_, K, V> {}

#[cfg(test)]
mod tests {
use crate::Map;

#[test]
fn normal_drain() {
let mut map = Map::<char, u8, 10>::from_iter([('a', 97), ('b', 98), ('c', 99), ('d', 100)]);
let mut cloned_map = map.clone();

let mut drain = map.drain();

// For ExactSizeIterator
assert_eq!(drain.len(), drain.size_hint().0);

// Consume the first two items by iterator
assert_eq!(drain.next(), Some(('a', 97)));
assert_eq!(drain.next(), Some(('b', 98)));

// We can fuse the drain
let mut fuse_it = drain.fuse();
assert_eq!(fuse_it.next(), Some(('c', 99)));
assert_eq!(fuse_it.next(), Some(('d', 100)));

// Further calls to next() should return None
assert!(fuse_it.next().is_none());
// Then fuse works. (It doesn't make sense in our Drain really, but it can.)
assert!(fuse_it.next().is_none());

let mut drain = cloned_map.drain();
assert_eq!(drain.next(), Some(('a', 97)));
// Three elements left for Drop
drop(drain);
}
}
59 changes: 59 additions & 0 deletions src/entry.rs
Original file line number Diff line number Diff line change
Expand Up @@ -109,3 +109,62 @@ impl<'a, K: PartialEq, V, const N: usize> VacantEntry<'a, K, V, N> {
self.table.item_mut(index)
}
}

#[cfg(test)]
mod tests {

use super::Entry;
use crate::Map;

#[test]
fn various() {
let mut m: Map<char, u8, 10> =
Map::from_iter([('a', 97), ('d', 100), ('c', 99), ('b', 98)]);
let e: Entry<'_, char, u8, 10> = m.entry('c');
assert_eq!(e.key(), &'c');
m.entry('e').or_insert(b'e');
m.entry('e').or_insert(b'e');
assert_eq!(*m.entry('e').and_modify(|v| *v = 42).or_default(), 42);
assert_eq!(m.entry('g').key(), &'g');
assert_eq!(
*m.entry('g').and_modify(|v| *v = 42).or_default(),
u8::default()
);
let value = if let Entry::Occupied(mut entry) = m.entry('e') {
let value = *entry.get();
assert_eq!(value, 42);

*entry.get_mut() = b'E';
assert_eq!(*entry.get(), 69);
let e = entry.into_mut();
*e = b'e';
value
} else {
100
};
assert_eq!(*m.entry('f').or_insert_with(|| value + 1), 43); // _ -> 43
assert_eq!(*m.entry('f').or_insert_with(|| value + 2), 43); // no change
assert_eq!(m.remove_entry(&'f'), Some(('f', 43))); // 43 -> _
assert_eq!(
*m.entry('f')
.or_insert_with_key(|&key| key.try_into().unwrap()),
102
); // _ -> 102
assert_eq!(*m.entry('f').or_insert_with_key(|&_| 255), 102); // no change
if let Entry::Occupied(entry) = m.entry('e') {
assert_eq!(entry.remove(), 101);
}
if let Entry::Vacant(entry) = m.entry('e') {
assert_eq!(entry.key(), &'e');
assert_eq!(entry.into_key(), 'e');
}
if let Entry::Vacant(entry) = m.entry('e') {
assert_eq!(entry.key(), &'e');
entry.insert(b'e');
}
if let Entry::Occupied(mut entry) = m.entry('e') {
entry.insert(b'E');
assert_eq!(entry.remove_entry(), ('e', b'E'));
}
}
}
2 changes: 1 addition & 1 deletion src/eq.rs
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ impl<K: PartialEq, V: PartialEq, const N: usize> PartialEq for Map<K, V, N> {
impl<K: Eq, V: Eq, const N: usize> Eq for Map<K, V, N> {}

#[cfg(test)]
mod test {
mod tests {

use super::*;

Expand Down
2 changes: 1 addition & 1 deletion src/from.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ impl<K: PartialEq, V, const N: usize> From<[(K, V); N]> for Map<K, V, N> {
}

#[cfg(test)]
mod test {
mod tests {

use super::*;

Expand Down
2 changes: 1 addition & 1 deletion src/index.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ impl<K: PartialEq + Borrow<Q>, Q: PartialEq + ?Sized, V, const N: usize> IndexMu
}

#[cfg(test)]
mod test {
mod tests {

use super::*;

Expand Down
21 changes: 20 additions & 1 deletion src/iterators.rs
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ impl<K, V> FusedIterator for IterMut<'_, K, V> {}
impl<K: PartialEq, V, const N: usize> FusedIterator for IntoIter<K, V, N> {}

#[cfg(test)]
mod test {
mod tests {

use super::*;

Expand Down Expand Up @@ -253,4 +253,23 @@ mod test {
let _p = m.into_iter().nth(3);
assert_eq!(Rc::strong_count(&v), 2); // v & p
}

#[test]
fn iter_size_hint() {
let mut m: Map<char, u32, 4> = Map::new();
m.insert('a', 97);
m.insert('c', 99);
let it = m.iter();
assert_eq!(it.len(), 2);
let mut it_mut = m.iter_mut();
assert!(it_mut.next().is_some());
assert_eq!(it_mut.len(), 1);
assert_eq!(it_mut.len(), it_mut.size_hint().0);
let mut it_into = m.into_iter();
assert!(it_into.next().is_some());
assert!(it_into.next().is_some());
assert!(it_into.next().is_none());
assert!(it_into.next().is_none());
assert_eq!(it_into.len(), 0);
}
}
10 changes: 7 additions & 3 deletions src/keys.rs
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ impl<K, V> FusedIterator for Keys<'_, K, V> {}
impl<K: PartialEq, V, const N: usize> FusedIterator for IntoKeys<K, V, N> {}

#[cfg(test)]
mod test {
mod tests {

use super::*;

Expand All @@ -74,16 +74,20 @@ mod test {
let mut m: Map<String, i32, 10> = Map::new();
m.insert("foo".to_string(), 0);
m.insert("bar".to_string(), 0);
assert_eq!(m.keys().collect::<Vec<_>>(), [&"foo", &"bar"]);
let keys = m.keys();
assert_eq!(keys.len(), 2);
assert_eq!(keys.collect::<Vec<_>>(), [&"foo", &"bar"]);
}

#[test]
fn iterate_into_keys() {
let mut m: Map<String, i32, 10> = Map::new();
m.insert("foo".to_string(), 0);
m.insert("bar".to_string(), 0);
let keys = m.into_keys();
assert_eq!(keys.len(), 2);
assert_eq!(
m.into_keys().collect::<Vec<_>>(),
keys.collect::<Vec<_>>(),
["bar".to_string(), "foo".to_string()]
);
}
Expand Down
2 changes: 1 addition & 1 deletion src/map.rs
Original file line number Diff line number Diff line change
Expand Up @@ -275,7 +275,7 @@ impl<K: PartialEq, V, const N: usize> Map<K, V, N> {
}

#[cfg(test)]
mod test {
mod tests {

use super::*;

Expand Down
34 changes: 19 additions & 15 deletions src/serialization.rs
Original file line number Diff line number Diff line change
Expand Up @@ -56,21 +56,25 @@ impl<'de, K: PartialEq + Deserialize<'de>, V: Deserialize<'de>, const N: usize>
}

#[cfg(test)]
use bincode::{deserialize, serialize};
mod tests {

#[test]
fn serialize_and_deserialize() {
let mut before: Map<u8, u8, 8> = Map::new();
before.insert(1, 42);
let bytes: Vec<u8> = serialize(&before).unwrap();
let after: Map<u8, u8, 8> = deserialize(&bytes).unwrap();
assert_eq!(42, after.into_iter().next().unwrap().1);
}
use crate::Map;
use bincode::{deserialize, serialize};

#[test]
fn serialize_and_deserialize() {
let mut before: Map<u8, u8, 8> = Map::new();
before.insert(1, 42);
let bytes: Vec<u8> = serialize(&before).unwrap();
let after: Map<u8, u8, 8> = deserialize(&bytes).unwrap();
assert_eq!(42, after.into_iter().next().unwrap().1);
}

#[test]
fn empty_map_serde() {
let before: Map<u8, u8, 8> = Map::new();
let bytes: Vec<u8> = serialize(&before).unwrap();
let after: Map<u8, u8, 8> = deserialize(&bytes).unwrap();
assert!(after.is_empty());
#[test]
fn empty_map_serde() {
let before: Map<u8, u8, 8> = Map::new();
let bytes: Vec<u8> = serialize(&before).unwrap();
let after: Map<u8, u8, 8> = deserialize(&bytes).unwrap();
assert!(after.is_empty());
}
}
2 changes: 1 addition & 1 deletion src/set/debug.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ impl<T: PartialEq + Debug, const N: usize> Debug for Set<T, N> {
}

#[cfg(test)]
mod test {
mod tests {

use super::*;

Expand Down
4 changes: 3 additions & 1 deletion src/set/display.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,15 +22,17 @@ impl<T: PartialEq + Display, const N: usize> Display for Set<T, N> {
}

#[cfg(test)]
mod test {
mod tests {

use super::*;

#[test]
fn displays_set() {
let mut m: Set<String, 10> = Set::new();
assert_eq!(r#"{}"#, format!("{}", m));
m.insert("one".to_string());
m.insert("two".to_string());
assert_eq!(r#"{"one", "two"}"#, format!("{:?}", m));
assert_eq!(r#"{one, two}"#, format!("{}", m));
}
}
4 changes: 2 additions & 2 deletions src/set/functions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -35,10 +35,10 @@ impl<T: PartialEq, const N: usize> Set<T, N> {
}
}

/// Does the set contain this key?
/// Returns true if the set contains a value.
#[inline]
#[must_use]
pub fn contains_key<Q: PartialEq + ?Sized>(&self, k: &Q) -> bool
pub fn contains<Q: PartialEq + ?Sized>(&self, k: &Q) -> bool
where
T: Borrow<Q>,
{
Expand Down
73 changes: 73 additions & 0 deletions src/set/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -64,3 +64,76 @@ pub struct SetIntoIter<T: PartialEq, const N: usize> {
pub struct SetDrain<'a, T: PartialEq> {
iter: crate::Drain<'a, T, ()>,
}

#[cfg(test)]
mod tests {
use crate::Set;

#[test]
fn various() {
let mut set: Set<i32, 10> = Set::new();
let set_default: Set<i32, 10> = Set::default();
assert!(set == set_default);

assert_eq!(set.capacity(), 10);
assert_eq!(set.len(), 0);
assert!(set.is_empty());
set.insert(0);
assert_eq!(set.len(), 1);
set.insert(0);
assert_eq!(set.len(), 1);
set.insert(1);
assert_eq!(set.len(), 2);

let mut drain = set.drain();
assert_eq!(drain.len(), 2);
assert!(drain.next().is_some());
assert_eq!(drain.len(), 1);
assert_eq!(drain.len(), drain.size_hint().0);
assert_eq!(drain.len(), drain.size_hint().1.unwrap());
drop(drain);

set.clear();

for n in 0..10 {
set.insert(n);
}
assert_eq!(set.len(), 10);
assert!(set.contains(&0));
assert_eq!(set.take(&0), Some(0));
assert!(!set.contains(&10));

assert_eq!(set.remove(&0), false);
set.insert(0);
assert_eq!(set.remove(&0), true);
set.insert(10);

assert_eq!(set.get(&10), Some(&10));
assert_eq!(set.get(&11), None);

set.retain(|&k| k % 2 == 0);

let mut it = set.iter();
assert!(it.next().is_some());
assert_eq!(it.len(), 4);
assert_eq!(it.len(), it.size_hint().0);
assert_eq!(it.len(), it.size_hint().1.unwrap());

let mut it_into = set.into_iter();
assert!(it_into.next().is_some());
assert!(it_into.next().is_some());
assert!(it_into.next().is_some());
assert_eq!(it_into.len(), 2);
assert_eq!(it_into.len(), it_into.size_hint().0);
assert_eq!(it_into.len(), it_into.size_hint().1.unwrap());
}

#[test]
fn test_set_from() {
let set_a = Set::from(['a', 'b', 'c', 'd']);
let set_b = Set::from_iter(vec!['a', 'a', 'd', 'b', 'a', 'd', 'c', 'd', 'c']);
let set_c = Set::from_iter(set_a.clone());
assert_eq!(set_a, set_b);
assert_eq!(set_a, set_c);
}
}
Loading
Loading