use rbook::Ebook;
use verso::reader::book::{chapter_titles_from_book, load_spine_data, spine_hrefs};
fn open_time_machine() -> rbook::Epub {
rbook::Epub::new(std::path::Path::new("tests/fixtures/time-machine.epub")).unwrap()
}
#[test]
fn spine_hrefs_has_multiple_entries() {
let book = open_time_machine();
let hrefs = spine_hrefs(&book).unwrap();
assert!(
hrefs.len() >= 3,
"expected >= 3 spine items, got {}",
hrefs.len()
);
}
#[test]
fn chapter_titles_cover_all_spine_items() {
let book = open_time_machine();
let titles = chapter_titles_from_book(&book);
let hrefs = spine_hrefs(&book).unwrap();
assert_eq!(titles.len(), hrefs.len());
assert!(titles.len() >= 3);
for t in &titles {
assert!(!t.is_empty(), "empty chapter title: {:?}", titles);
}
}
#[test]
fn chapter_title_falls_back_when_no_toc_entry() {
let book = open_time_machine();
let titles = chapter_titles_from_book(&book);
for (i, t) in titles.iter().enumerate() {
if t == &format!("Chapter {}", i + 1) {
} else {
assert!(!t.is_empty());
}
}
}
#[test]
fn load_spine_data_returns_non_empty_text() {
let book = open_time_machine();
let data = load_spine_data(&book, 2, 68, 40).unwrap();
assert!(!data.pages.is_empty());
assert!(
data.plain_text_chars > 0,
"spine 2 plain_text_chars was 0 — expected real content"
);
}
#[test]
fn load_spine_data_out_of_bounds_errors() {
let book = open_time_machine();
let res = load_spine_data(&book, 9999, 68, 40);
assert!(res.is_err());
}