Add functions for making sentences from lists

This seems like something I keep having to write
This commit is contained in:
Griffin Smith 2019-07-28 22:31:07 -04:00
parent ba7bec9a3e
commit 34b20b7786
3 changed files with 101 additions and 0 deletions

View 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
View 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()
);
}
}

View file

@ -34,6 +34,7 @@ mod util;
mod types;
#[macro_use]
mod entities;
mod description;
mod display;
mod game;
mod level_gen;