Something went wrong. Try again.
A fork of https://github.com/crosspoint-reader/crosspoint-reader
Something went wrong. Try again.
5.1 kB · 137 lines
C++
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138#include <gtest/gtest.h>
#include <string>
#include "ContentOpfParser.h"#include "Epub/BookMetadataCache.h"
namespace {
void parse(ContentOpfParser& parser, const std::string& xml) { ASSERT_TRUE(parser.setup()); EXPECT_EQ(parser.write(reinterpret_cast<const uint8_t*>(xml.data()), xml.size()), xml.size());}
} // namespace
TEST(ContentOpfParserMetadata, EntityCallbackDoesNotSplitOneAuthor) { const std::string xml = R"(<package xmlns:dc="urn:dc"><metadata><dc:creator>Émile Zola</dc:creator></metadata></package>)"; ContentOpfParser parser("", "", xml.size(), nullptr);
parse(parser, xml);
EXPECT_EQ(parser.author, "Émile Zola");}
TEST(ContentOpfParserMetadata, ClampsOversizedMetadataTextInsteadOfGrowingUnbounded) { const std::string hugeTitle(64 * 1024, 'A'); const std::string xml = "<package xmlns:dc=\"urn:dc\"><metadata><dc:title>" + hugeTitle + " tail</dc:title></metadata></package>"; ContentOpfParser parser("", "", xml.size(), nullptr);
parse(parser, xml);
EXPECT_EQ(parser.title.size(), 512u); EXPECT_EQ(parser.title[0], 'A');}
TEST(ContentOpfParserMetadata, SeparatesCreatorElementsAndCollapsesXmlWhitespace) { const std::string xml = R"(<package xmlns:dc="urn:dc"><metadata> <dc:title> The Left Hand of Darkness </dc:title> <dc:creator> Ursula K. Le Guin </dc:creator> <dc:creator>Octavia E. Butler</dc:creator> </metadata></package>)"; ContentOpfParser parser("", "", xml.size(), nullptr);
parse(parser, xml);
EXPECT_EQ(parser.title, "The Left Hand of Darkness"); EXPECT_EQ(parser.author, "Ursula K. Le Guin, Octavia E. Butler");}
TEST(ContentOpfParserMetadata, StopsBeforeManifestWithoutOpeningTemporaryStorage) { const std::string xml = R"(<package xmlns:dc="urn:dc"><metadata> <dc:title>A Wizard of Earthsea</dc:title> <dc:creator>Ursula K. Le Guin</dc:creator> <dc:language>en</dc:language> </metadata><manifest><item id="chapter" href="chapter.xhtml" media-type="application/xhtml+xml"/></manifest> </package>)"; Storage = {}; ContentOpfParser parser("/missing-cache", "OPS/", xml.size(), nullptr, true);
ASSERT_TRUE(parser.setup()); EXPECT_LT(parser.write(reinterpret_cast<const uint8_t*>(xml.data()), xml.size()), xml.size()); EXPECT_EQ(parser.title, "A Wizard of Earthsea"); EXPECT_EQ(parser.author, "Ursula K. Le Guin"); EXPECT_EQ(parser.language, "en"); EXPECT_EQ(Storage.writeOpens, 0); EXPECT_EQ(Storage.readOpens, 0);}
TEST(ContentOpfParserMetadata, NeverEntersManifestWhenMetadataElementIsMissing) { const std::string xml = R"(<package><manifest><item id="chapter" href="chapter.xhtml"/></manifest><spine/></package>)"; Storage = {}; ContentOpfParser parser("/missing-cache", "OPS/", xml.size(), nullptr, true);
ASSERT_TRUE(parser.setup()); EXPECT_LT(parser.write(reinterpret_cast<const uint8_t*>(xml.data()), xml.size()), xml.size()); EXPECT_EQ(Storage.writeOpens, 0); EXPECT_EQ(Storage.readOpens, 0);}
TEST(ContentOpfParserCover, ResolvesEpub2CoverWithoutReadingCacheStorage) { const std::string xml = R"(<package><metadata><meta name="cover" content="cover-id"/></metadata> <manifest><item id="cover-id" href="cover.jpg" media-type="image/jpeg"/> <item id="chapter" href="chapter.xhtml" media-type="application/xhtml+xml"/></manifest> <spine><itemref idref="chapter"/></spine> <guide><reference type="cover" href="cover.xhtml"/></guide></package>)"; const std::string cachePath = "/missing-cache"; const std::string basePath = "OPS/"; Storage = {}; { ContentOpfParser parser(cachePath, basePath, xml.size(), nullptr); parse(parser, xml); EXPECT_EQ(parser.coverItemHref, "OPS/cover.jpg"); EXPECT_EQ(parser.guideCoverPageHref, "OPS/cover.xhtml"); } EXPECT_EQ(Storage.writeOpens, 0); EXPECT_EQ(Storage.readOpens, 0);}
TEST(ContentOpfParserCover, ResolvesEpub3CoverWithoutReadingCacheStorage) { const std::string xml = R"(<package><metadata/> <manifest><item id="cover" href="cover.png" media-type="image/png" properties="cover-image"/></manifest> <spine/></package>)"; const std::string cachePath = "/missing-cache"; const std::string basePath = "OPS/"; Storage = {}; { ContentOpfParser parser(cachePath, basePath, xml.size(), nullptr); parse(parser, xml); EXPECT_EQ(parser.coverItemHref, "OPS/cover.png"); } EXPECT_EQ(Storage.writeOpens, 0); EXPECT_EQ(Storage.readOpens, 0);}
TEST(ContentOpfParserCover, ReadingParserStillOpensManifestCache) { const std::string xml = R"(<package><metadata/> <manifest><item id="cover" href="cover.png" media-type="image/png" properties="cover-image"/></manifest> <spine/></package>)"; const std::string cachePath = "/reading-cache"; const std::string basePath = "OPS/"; BookMetadataCache cache; Storage = {}; { ContentOpfParser parser(cachePath, basePath, xml.size(), &cache); parse(parser, xml); EXPECT_EQ(parser.coverItemHref, "OPS/cover.png"); } EXPECT_EQ(Storage.writeOpens, 1); EXPECT_EQ(Storage.readOpens, 1);}