use std::fmt;
use crate::verse::Verse;
#[derive(Debug, Clone)]
pub struct Chapter {
verses: Vec<Verse>,
chapter_number: usize,
}
impl Chapter {
pub fn new(verses: Vec<Verse>, chapter_number: usize) -> Self {
Chapter {
verses,
chapter_number,
}
}
pub fn number(&self) -> usize {
self.chapter_number
}
pub fn get_verses(&self) -> &[Verse] {
&self.verses
}
pub fn get_verse(&self, verse_number: usize) -> Option<&Verse> {
if verse_number == 0 {
return None;
}
self.verses.get(verse_number - 1)
}
}
impl fmt::Display for Chapter {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let verses_str = self
.verses
.iter()
.map(|v| format!("{}", v))
.collect::<Vec<String>>()
.join("\n");
write!(f, "Chapter {}:\n{}", self.chapter_number, verses_str)
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::bible_books_enum::BibleBook;
#[test]
fn test_new_and_accessors() {
let verses = vec![Verse::new(BibleBook::Genesis, 1, 1, "Test".into())];
let chapter = Chapter::new(verses, 1);
assert_eq!(chapter.number(), 1);
assert_eq!(chapter.get_verses().len(), 1);
assert_eq!(chapter.get_verse(1).unwrap().number(), 1);
assert!(chapter.get_verse(0).is_none());
}
#[test]
fn test_clone_independence() {
let verses = vec![Verse::new(BibleBook::Genesis, 1, 1, "Clone".into())];
let original = Chapter::new(verses, 1);
let cloned = original.clone();
assert_eq!(original.number(), cloned.number());
assert_eq!(original.get_verses().len(), cloned.get_verses().len());
assert_eq!(
original.get_verses()[0].text(),
cloned.get_verses()[0].text()
);
assert_ne!(original.get_verses().as_ptr(), cloned.get_verses().as_ptr());
assert_ne!(
original.get_verses()[0].text().as_ptr(),
cloned.get_verses()[0].text().as_ptr()
);
}
}