Skip to content

Commit

Permalink
Merge pull request #79 from xfbs/proptest
Browse files Browse the repository at this point in the history
Idea: use proptest additionally for unit testing
  • Loading branch information
jeffparsons authored Jan 31, 2024
2 parents c478b79 + 9564df0 commit c50ed21
Show file tree
Hide file tree
Showing 5 changed files with 102 additions and 2 deletions.
2 changes: 2 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ rand = "0.8"
chrono = "0.4" # For examples
rustc_version = "0.4"
serde_json = "1"
proptest = "1.4.0"
test-strategy = "0.3.1"

[features]
serde1 = ["serde"]
Expand Down
29 changes: 28 additions & 1 deletion src/inclusive_map.rs
Original file line number Diff line number Diff line change
Expand Up @@ -840,7 +840,34 @@ where
#[cfg(test)]
mod tests {
use super::*;
use alloc::{format, vec, vec::Vec};
use alloc::{format, vec, vec::Vec, string::String};
use test_strategy::proptest;
use alloc as std;

#[proptest]
fn test_arbitrary_map_u8(ranges: Vec<(RangeInclusive<u8>, String)>) {
let ranges: Vec<_> = ranges
.into_iter()
.filter(|(range, _value)| range.start() != range.end())
.collect();
let set = ranges
.iter()
.fold(RangeInclusiveMap::new(), |mut set, (range, value)| {
set.insert(range.clone(), value.clone());
set
});

for value in 0..u8::MAX {
assert_eq!(
set.get(&value),
ranges
.iter()
.rev()
.find(|(range, _value)| range.contains(&value))
.map(|(_range, value)| value)
);
}
}

trait RangeInclusiveMapExt<K, V> {
fn to_vec(&self) -> Vec<(RangeInclusive<K>, V)>;
Expand Down
23 changes: 23 additions & 0 deletions src/inclusive_set.rs
Original file line number Diff line number Diff line change
Expand Up @@ -409,7 +409,30 @@ where
#[cfg(test)]
mod tests {
use super::*;
use alloc as std;
use alloc::{format, vec, vec::Vec};
use test_strategy::proptest;

#[proptest]
fn test_arbitrary_set_u8(ranges: Vec<RangeInclusive<u8>>) {
let ranges: Vec<_> = ranges
.into_iter()
.filter(|range| range.start() != range.end())
.collect();
let set = ranges
.iter()
.fold(RangeInclusiveSet::new(), |mut set, range| {
set.insert(range.clone());
set
});

for value in 0..u8::MAX {
assert_eq!(
set.contains(&value),
ranges.iter().any(|range| range.contains(&value))
);
}
}

trait RangeInclusiveSetExt<T> {
fn to_vec(&self) -> Vec<RangeInclusive<T>>;
Expand Down
29 changes: 28 additions & 1 deletion src/map.rs
Original file line number Diff line number Diff line change
Expand Up @@ -732,7 +732,34 @@ where
#[cfg(test)]
mod tests {
use super::*;
use alloc::{format, vec, vec::Vec};
use alloc as std;
use alloc::{format, string::String, vec, vec::Vec};
use test_strategy::proptest;

#[proptest]
fn test_arbitrary_map_u8(ranges: Vec<(Range<u8>, String)>) {
let ranges: Vec<_> = ranges
.into_iter()
.filter(|(range, _value)| range.start != range.end)
.collect();
let set = ranges
.iter()
.fold(RangeMap::new(), |mut set, (range, value)| {
set.insert(range.clone(), value.clone());
set
});

for value in 0..u8::MAX {
assert_eq!(
set.get(&value),
ranges
.iter()
.rev()
.find(|(range, _value)| range.contains(&value))
.map(|(_range, value)| value)
);
}
}

trait RangeMapExt<K, V> {
fn to_vec(&self) -> Vec<(Range<K>, V)>;
Expand Down
21 changes: 21 additions & 0 deletions src/set.rs
Original file line number Diff line number Diff line change
Expand Up @@ -345,7 +345,28 @@ where
#[cfg(test)]
mod tests {
use super::*;
use alloc as std;
use alloc::{format, vec, vec::Vec};
use test_strategy::proptest;

#[proptest]
fn test_arbitrary_set_u8(ranges: Vec<Range<u8>>) {
let ranges: Vec<_> = ranges
.into_iter()
.filter(|range| range.start != range.end)
.collect();
let set = ranges.iter().fold(RangeSet::new(), |mut set, range| {
set.insert(range.clone());
set
});

for value in 0..u8::MAX {
assert_eq!(
set.contains(&value),
ranges.iter().any(|range| range.contains(&value))
);
}
}

trait RangeSetExt<T> {
fn to_vec(&self) -> Vec<Range<T>>;
Expand Down

0 comments on commit c50ed21

Please sign in to comment.