Add functions for making sentences from lists
This seems like something I keep having to write
This commit is contained in:
parent
ba7bec9a3e
commit
34b20b7786
3 changed files with 101 additions and 0 deletions
7
proptest-regressions/description.txt
Normal file
7
proptest-regressions/description.txt
Normal file
|
@ -0,0 +1,7 @@
|
|||
# Seeds for failure cases proptest has generated in the past. It is
|
||||
# automatically read and these particular cases re-run before any
|
||||
# novel cases are generated.
|
||||
#
|
||||
# It is recommended to check this file in to source control so that
|
||||
# everyone who runs the test benefits from these saved cases.
|
||||
cc 92b51b5444b913aaa6cb89d7e7175ab6a6af5b5231ba047d123bb55d43d7d272 # shrinks to descriptions = []
|
93
src/description.rs
Normal file
93
src/description.rs
Normal file
|
@ -0,0 +1,93 @@
|
|||
use crate::entities::Describe;
|
||||
|
||||
pub fn list_to_sentence(lst: &Vec<String>) -> String {
|
||||
let mut buf = String::with_capacity(
|
||||
lst.iter()
|
||||
.map(|e| e.len() + 2usize /* ", " */)
|
||||
.sum::<usize>()
|
||||
+ if lst.len() >= 3 {
|
||||
3usize /* "and" */
|
||||
} else {
|
||||
0usize
|
||||
},
|
||||
);
|
||||
|
||||
match lst.len() {
|
||||
0 => {}
|
||||
1 => buf.push_str(&lst[0]),
|
||||
2 => {
|
||||
buf.push_str(&lst[0]);
|
||||
buf.push_str(" and ");
|
||||
buf.push_str(&lst[1]);
|
||||
}
|
||||
_ => {
|
||||
for desc in &lst[..lst.len() - 1] {
|
||||
buf.push_str(desc);
|
||||
buf.push_str(", ");
|
||||
}
|
||||
buf.push_str("and ");
|
||||
buf.push_str(&lst[lst.len() - 1]);
|
||||
}
|
||||
}
|
||||
|
||||
buf
|
||||
}
|
||||
|
||||
pub fn describe_list<A: Describe>(lst: &Vec<A>) -> String {
|
||||
list_to_sentence(
|
||||
&lst.iter().map(|e| e.description()).collect::<Vec<String>>(),
|
||||
)
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
use proptest::prelude::*;
|
||||
use proptest_derive::Arbitrary;
|
||||
|
||||
#[derive(Debug, Arbitrary)]
|
||||
struct Description(String);
|
||||
|
||||
impl Describe for Description {
|
||||
fn description(&self) -> String {
|
||||
self.0.clone()
|
||||
}
|
||||
}
|
||||
|
||||
proptest! {
|
||||
#[test]
|
||||
fn test_describe_list_includes_all_descriptions(
|
||||
descriptions: Vec<Description>
|
||||
) {
|
||||
let res = describe_list(&descriptions);
|
||||
for Description(desc) in descriptions {
|
||||
assert!(res.contains(&desc));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_describe_list() {
|
||||
assert_eq!(
|
||||
describe_list(&vec![Description("one".to_string())]),
|
||||
"one".to_string()
|
||||
);
|
||||
|
||||
assert_eq!(
|
||||
describe_list(&vec![
|
||||
Description("one".to_string()),
|
||||
Description("two".to_string())
|
||||
]),
|
||||
"one and two".to_string()
|
||||
);
|
||||
|
||||
assert_eq!(
|
||||
describe_list(&vec![
|
||||
Description("one".to_string()),
|
||||
Description("two".to_string()),
|
||||
Description("three".to_string())
|
||||
]),
|
||||
"one, two, and three".to_string()
|
||||
);
|
||||
}
|
||||
}
|
|
@ -34,6 +34,7 @@ mod util;
|
|||
mod types;
|
||||
#[macro_use]
|
||||
mod entities;
|
||||
mod description;
|
||||
mod display;
|
||||
mod game;
|
||||
mod level_gen;
|
||||
|
|
Loading…
Reference in a new issue