use crate::loaders::epub::{RawTextProcessor, StripXmlProcessor, TextProcessor};
use crate::loaders::test_fixtures::{fixture_glob, fixture_path};
use super::EpubFileLoader;
#[test]
fn test_epub_loader_with_ignoring_errors() {
let glob = fixture_glob("*.epub");
let loader = EpubFileLoader::<_, RawTextProcessor>::with_glob(&glob).unwrap();
let actual = loader
.load_with_path()
.ignore_errors()
.by_chapter()
.ignore_errors()
.into_iter()
.collect::<Vec<_>>();
assert_eq!(actual.len(), 1);
let (_, chapters) = &actual[0];
assert_eq!(chapters.len(), 3);
}
#[test]
fn test_single_file() {
let glob = fixture_glob("*.epub");
let loader = EpubFileLoader::<_, RawTextProcessor>::with_glob(&glob).unwrap();
let actual = loader
.read()
.ignore_errors()
.into_iter()
.collect::<Vec<_>>();
assert_eq!(actual.len(), 1);
}
#[test]
fn test_single_file_with_path() {
let glob = fixture_glob("*.epub");
let loader = EpubFileLoader::<_, RawTextProcessor>::with_glob(&glob).unwrap();
let actual = loader
.read_with_path()
.ignore_errors()
.into_iter()
.collect::<Vec<_>>();
assert_eq!(actual.len(), 1);
let (path, _) = &actual[0];
assert_eq!(path, &fixture_path("dummy.epub"));
}
fn assert_stripped_xml(xml: &str, expected: &str) {
let actual = StripXmlProcessor::process(xml);
assert!(
matches!(&actual, Ok(text) if text == expected),
"input {xml:?}: expected {expected:?}, got {actual:?}"
);
}
#[test]
fn stripped_xml_preserves_entity_text() {
assert_stripped_xml("<p>A&B!</p>", "A&B!");
}
#[test]
fn stripped_xml_resolves_predefined_and_adjacent_references_once() {
for (xml, expected) in [
("<p><>&'"</p>", "<>&'\""),
("<p>&&&</p>", "&&&"),
("<p>&lt;&#33;</p>", "<!"),
("&!", "&!"),
] {
assert_stripped_xml(xml, expected);
}
}
#[test]
fn stripped_xml_resolves_decimal_and_hex_unicode_references() {
for (xml, expected) in [
("<p>!é😀</p>", "!é😀"),
("<p>!é😀</p>", "!é😀"),
("<p>é😀終</p>", "é😀終"),
] {
assert_stripped_xml(xml, expected);
}
}
#[test]
fn stripped_xml_preserves_whitespace_around_references() {
for (xml, expected) in [
("<p> & </p>", " & "),
("<p>& \t\n <</p>", "& \t\n <"),
("<p>A & B! </p>", "A & B! "),
("<p> A </p>", " A "),
("<p>A	
B</p>", "A\t\nB"),
("<p> \t\n </p>", ""),
("<p>  	 </p>", ""),
] {
assert_stripped_xml(xml, expected);
}
}
#[test]
fn stripped_xml_preserves_cdata_literals_and_boundaries() {
for (xml, expected) in [
(
"<p><![CDATA[&!&unknown;]]></p>",
"&!&unknown;",
),
("<p>A<![CDATA[B]]>C</p>", "A B C"),
("<p>A&<![CDATA[B]]><C</p>", "A& B <C"),
("<p><![CDATA[A]]><![CDATA[B]]></p>", "A B"),
("<p>A<![CDATA[ ]]>&B</p>", "A &B"),
("<p><![CDATA[A]]> & </p>", "A & "),
] {
assert_stripped_xml(xml, expected);
}
}
#[test]
fn stripped_xml_preserves_markup_boundaries() {
for (xml, expected) in [
("<p>A<b>B</b>C</p><p>D</p>", "ABCD"),
("<p>A&<b>B!</b>C</p>", "A&B!C"),
("<p>A<br/>&B</p>", "A&B"),
("<p>A<!-- comment -->&B</p>", "A&B"),
("<p>A<?note value?>&B</p>", "A&B"),
("<p>A<b> </b>&B</p>", "A&B"),
] {
assert_stripped_xml(xml, expected);
}
}