© 2012 * @author Simon Schrape © 2015 */ class EPubTest extends TestCase { public const TEST_EPUB = __DIR__ . '/data/test.epub'; public const TEST_EPUB_COPY = __DIR__ . '/data/test.copy.epub'; public const TEST_EPUB_COVER = __DIR__ . '/data/test.cover.epub'; public const TEST_IMAGE = __DIR__ . '/data/test.jpg'; public const EMPTY_ZIP = __DIR__ . '/data/empty.zip'; public const BROKEN_ZIP = __DIR__ . '/data/broken.zip'; public const MARKUP_XML_1 = __DIR__ . '/data/markup.1.xml'; public const MARKUP_XML_2 = __DIR__ . '/data/markup.2.xml'; public const MARKUP_XML_3 = __DIR__ . '/data/markup.3.xml'; public const MARKUP_XML_4 = __DIR__ . '/data/markup.4.xml'; public const MARKUP_XML_5 = __DIR__ . '/data/markup.5.xml'; protected EPub $epub; protected function setUp(): void { // sometime I might have accidentally broken the test file if (filesize(static::TEST_EPUB) != 768780) { die('test.epub has wrong size, make sure it\'s unmodified'); } // we work on a copy to test saving if (!copy(static::TEST_EPUB, static::TEST_EPUB_COPY)) { die('failed to create copy of the test book'); } // @see https://github.com/sebastianbergmann/phpunit/issues/5062#issuecomment-1416362657 set_error_handler( static function (int $errno, string $errstr) { throw new \Exception($errstr, $errno); }, E_ALL ); $this->epub = new Epub(static::TEST_EPUB_COPY); } protected function tearDown(): void { restore_error_handler(); unlink(static::TEST_EPUB_COPY); } public function testGetZipEntries(): void { $entries = $this->epub->getZipEntries(); $this->assertCount(49, $entries); $this->assertArrayHasKey(EPub::METADATA_FILE, $entries); $this->assertEquals(250, $entries[EPub::METADATA_FILE]['size']); $count = $this->epub->getImageCount(); $this->assertEquals(3, $count); $coverpath = $this->epub->getCoverPath(); $this->assertEquals('images/cover.png', $coverpath); $size = $this->epub->getComponentSize($coverpath); $this->assertEquals(657911, $size); } public function testLoadNonZip(): void { //$this->expectException(Exception::class); //$this->expectExceptionMessage('Failed to read EPUB file. Not a zip archive.'); //$this->expectExceptionMessage('Failed to read epub file'); $this->expectException(ValueError::class); $this->expectExceptionMessage('Invalid or uninitialized Zip object'); new Epub(static::TEST_IMAGE); } public function testLoadBrokenZip(): void { //$this->expectException(Exception::class); //$this->expectExceptionMessage('Failed to read EPUB file. Zip archive inconsistent.'); //$this->expectExceptionMessage('Unable to find metadata.xml'); $this->expectException(ValueError::class); $this->expectExceptionMessage('Invalid or uninitialized Zip object'); new Epub(static::BROKEN_ZIP); } public function testLoadMissingFile(): void { $this->expectException(Exception::class); //$this->expectExceptionMessage('Failed to read EPUB file. No such file.'); $this->expectExceptionMessage('Epub file does not exist!'); new Epub('/a/file/that/is/not_there.epub'); } /** * We cannot expect a more specific exception message. ZipArchive::open returns 28 * which is not known as an error code. */ public function testLoadDirectory(): void { $this->expectException(Exception::class); //$this->expectExceptionMessage('Failed to read EPUB file.'); $this->expectExceptionMessage('Epub file does not exist!'); new Epub(__DIR__); } public function testLoadEmptyZip(): void { $this->expectException(Exception::class); //$this->expectExceptionMessage('Failed to read from EPUB container: META-INF/container.xml'); //$this->expectExceptionMessage('Failed to read epub file'); $this->expectExceptionMessage('Unable to find ' . EPub::METADATA_FILE); new Epub(static::EMPTY_ZIP); } public function testFilename(): void { $this->assertEquals(static::TEST_EPUB_COPY, $this->epub->file()); } public function testAuthors(): void { // read curent value $this->assertEquals(['Shakespeare, William' => 'William Shakespeare'], $this->epub->getAuthors()); // remove value with string $this->epub->setAuthors(''); $this->assertEquals([], $this->epub->getAuthors()); // set single value by String $this->epub->setAuthors('John Doe'); $this->assertEquals(['John Doe' => 'John Doe'], $this->epub->getAuthors()); // set single value by indexed array $this->epub->setAuthors(['John Doe']); $this->assertEquals(['John Doe' => 'John Doe'], $this->epub->getAuthors()); // remove value with array $this->epub->setAuthors([]); $this->assertEquals([], $this->epub->getAuthors()); // set single value by associative array $this->epub->setAuthors(['Doe, John' => 'John Doe']); $this->assertEquals(['Doe, John' => 'John Doe'], $this->epub->getAuthors()); // set multi value by string $this->epub->setAuthors('John Doe, Jane Smith'); $this->assertEquals(['John Doe' => 'John Doe', 'Jane Smith' => 'Jane Smith'], $this->epub->getAuthors()); // set multi value by indexed array $this->epub->setAuthors(['John Doe', 'Jane Smith']); $this->assertEquals(['John Doe' => 'John Doe', 'Jane Smith' => 'Jane Smith'], $this->epub->getAuthors()); // set multi value by associative array $this->epub->setAuthors(['Doe, John' => 'John Doe', 'Smith, Jane' => 'Jane Smith']); $this->assertEquals(['Doe, John' => 'John Doe', 'Smith, Jane' => 'Jane Smith'], $this->epub->getAuthors()); // check escaping $this->epub->setAuthors(['Doe, John ' => 'John Doe ']); $this->assertEquals(['Doe, John ' => 'John Doe '], $this->epub->getAuthors()); } public function testTitle(): void { // get current value $this->assertEquals('Romeo and Juliet', $this->epub->getTitle()); // set new value $this->epub->setTitle('Foo Bar'); $this->assertEquals('Foo Bar', $this->epub->getTitle()); // delete current value $this->epub->setTitle(''); $this->assertEquals('', $this->epub->getTitle()); // check escaping $this->epub->setTitle('Foo Bar'); $this->assertEquals('Foo Bar', $this->epub->getTitle()); } public function testLanguage(): void { // get current value $this->assertEquals('en', $this->epub->getLanguage()); // set new value $this->epub->setLanguage('Foo Bar'); $this->assertEquals('Foo Bar', $this->epub->getLanguage()); // delete current value $this->epub->setLanguage(''); $this->assertEquals('', $this->epub->getLanguage()); // check escaping $this->epub->setLanguage('Foo Bar'); $this->assertEquals('Foo Bar', $this->epub->getLanguage()); } public function testPublisher(): void { // get current value $this->assertEquals('Feedbooks', $this->epub->getPublisher()); // set new value $this->epub->setPublisher('Foo Bar'); $this->assertEquals('Foo Bar', $this->epub->getPublisher()); // delete current value $this->epub->setPublisher(''); $this->assertEquals('', $this->epub->getPublisher()); // check escaping $this->epub->setPublisher('Foo Bar'); $this->assertEquals('Foo Bar', $this->epub->getPublisher()); } public function testCopyright(): void { // get current value $this->assertEquals('', $this->epub->getCopyright()); // set new value $this->epub->setCopyright('Foo Bar'); $this->assertEquals('Foo Bar', $this->epub->getCopyright()); // delete current value $this->epub->setCopyright(''); $this->assertEquals('', $this->epub->getCopyright()); // check escaping $this->epub->setCopyright('Foo Bar'); $this->assertEquals('Foo Bar', $this->epub->getCopyright()); } public function testDescription(): void { // get current value $this->assertStringStartsWith('Romeo and Juliet is a tragic play written', $this->epub->getDescription()); // set new value $this->epub->setDescription('Foo Bar'); $this->assertEquals('Foo Bar', $this->epub->getDescription()); // delete current value $this->epub->setDescription(''); $this->assertEquals('', $this->epub->getDescription()); // check escaping $this->epub->setDescription('Foo Bar'); $this->assertEquals('Foo Bar', $this->epub->getDescription()); } public function testUniqueIdentifier(): void { // get current value $this->assertEquals('urn:uuid:7d38d098-4234-11e1-97b6-001cc0a62c0b', $this->epub->getUniqueIdentifier()); // set new value $this->epub->setUniqueIdentifier('134htb34tp089h1b'); $this->assertEquals('134htb34tp089h1b', $this->epub->getUniqueIdentifier()); // this should have affected the same node that is found when looking for UUID/URN scheme $this->assertEquals('134htb34tp089h1b', $this->epub->getUuid()); } public function testUuid(): void { // get current value $this->assertEquals('urn:uuid:7d38d098-4234-11e1-97b6-001cc0a62c0b', $this->epub->getUuid()); // set new value $this->epub->setUuid('Foo Bar'); $this->assertEquals('Foo Bar', $this->epub->getUuid()); // delete current value $this->epub->setUuid(''); $this->assertEquals('', $this->epub->getUuid()); // check escaping $this->epub->setUuid('Foo Bar'); $this->assertEquals('Foo Bar', $this->epub->getUuid()); } public function testUri(): void { // get current value $this->assertEquals('http://www.feedbooks.com/book/2936', $this->epub->getUri()); // set new value $this->epub->setUri('Foo Bar'); $this->assertEquals('Foo Bar', $this->epub->getUri()); // delete current value $this->epub->setUri(''); $this->assertEquals('', $this->epub->getUri()); // check escaping $this->epub->setUri('Foo Bar'); $this->assertEquals('Foo Bar', $this->epub->getUri()); } public function testIsbn(): void { // get current value $this->assertEquals('', $this->epub->getIsbn()); // set new value $this->epub->setIsbn('Foo Bar'); $this->assertEquals('Foo Bar', $this->epub->getIsbn()); // delete current value $this->epub->setIsbn(''); $this->assertEquals('', $this->epub->getIsbn()); // check escaping $this->epub->setIsbn('Foo Bar'); $this->assertEquals('Foo Bar', $this->epub->getIsbn()); } public function testSubject(): void { // get current values $this->assertEquals(['Fiction', 'Drama', 'Romance'], $this->epub->getSubjects()); // delete current values with String $this->epub->setSubjects(''); $this->assertEquals([], $this->epub->getSubjects()); // set new values with String $this->epub->setSubjects('Fiction, Drama, Romance'); $this->assertEquals(['Fiction', 'Drama', 'Romance'], $this->epub->getSubjects()); // delete current values with Array $this->epub->setSubjects([]); $this->assertEquals([], $this->epub->getSubjects()); // set new values with array $this->epub->setSubjects(['Fiction', 'Drama', 'Romance']); $this->assertEquals(['Fiction', 'Drama', 'Romance'], $this->epub->getSubjects()); // check escaping $this->epub->setSubjects(['Fiction', 'Drama ', 'Romance']); $this->assertEquals(['Fiction', 'Drama ', 'Romance'], $this->epub->getSubjects()); } public function testCover(): void { // we work on a copy to test saving $this->assertTrue(copy(static::TEST_EPUB, static::TEST_EPUB_COVER)); // use the ZipEdit class here //$epub = new EPub(static::TEST_EPUB_COVER, ZipEdit::class); $epub = new EPub(static::TEST_EPUB_COVER); // read current cover $cover = $epub->getCover(); $this->assertEquals(657911, strlen($cover)); // change cover and save $epub->setCover(static::TEST_IMAGE, 'image/jpeg'); //$epub->save(); // open epub again //$epub = new EPub(static::TEST_EPUB_COVER); // read recently changed cover $cover = $epub->getCover(); $this->assertEquals(filesize(static::TEST_IMAGE), strlen($cover)); // delete cover $epub->clearCover(); $cover = $epub->getCover(); $this->assertNull($cover); $epub->close(); unlink(static::TEST_EPUB_COVER); } /** * @throws Exception * @return void */ public function testTitlePage() { // we work on a copy to test saving $this->assertTrue(copy(static::TEST_EPUB, static::TEST_EPUB_COVER)); // use the ZipEdit class here //$epub = new EPub(static::TEST_EPUB_COVER, ZipEdit::class); $epub = new EPub(static::TEST_EPUB_COVER); // add title page and save $epub->addCoverImageTitlePage(); //$epub->save(); // open epub again //$epub = new EPub(static::TEST_EPUB_COVER); // read recently added title page $spine = $epub->getSpine(); $titlePage = $spine->first(); $this->assertEquals(EPub::TITLE_PAGE_ID . '.xhtml', $titlePage->getHref()); $this->assertEquals(EPub::TITLE_PAGE_ID, $titlePage->getId()); $this->assertEquals('application/xhtml+xml', (string) $titlePage->getMediaType()); // We expect an empty string since there is only an image but no text on that page. $this->assertEmpty(trim($titlePage->getContents())); unlink(static::TEST_EPUB_COVER); } /** * @throws Exception * @return void */ public function testCalibreAnnotations() { $epub = new Epub(static::TEST_EPUB); // use metadata from .opf file for tests here - see Alice from mikespub/seblucas-cops $data = file_get_contents(__DIR__ . '/data/metadata.opf'); $annotations = $epub->getCalibreAnnotations($data); $this->assertCount(5, $annotations); $expected = [ 'format' => 'EPUB', 'user_type' => 'local', 'user' => 'viewer', 'annotation' => [ 'title' => 'About #1', 'pos_type' => 'epubcfi', 'pos' => 'epubcfi(/6/2/4/2/6/2:38)', 'timestamp' => '2024-03-11T11:54:35.128396+00:00', 'type' => 'bookmark', ], ]; $this->assertEquals($expected, $annotations[0]); } /** * @throws Exception * @return void */ public function testCalibreBookmarks() { $epub = new Epub(static::TEST_EPUB); // use calibre_bookmarks.txt for tests here - see Alice from mikespub/seblucas-cops $data = file_get_contents(__DIR__ . '/data/calibre_bookmarks.txt'); $bookmarks = $epub->getCalibreBookmarks($data); $this->assertCount(5, $bookmarks); $expected = [ 'title' => 'About #1', 'pos_type' => 'epubcfi', 'pos' => 'epubcfi(/6/2/4/2/6/2:38)', 'timestamp' => '2024-03-11T11:54:35.128396+00:00', 'type' => 'bookmark', ]; $this->assertEquals($expected, $bookmarks[0]); } /** * @throws Exception * @return void */ public function testManifest() { $manifest = $this->epub->getManifest(); $this->assertCount(41, $manifest); $this->assertEquals('cover', $manifest->first()->getId()); $this->assertEquals(DataItem::XHTML, $manifest->current()->getMediaType()); $manifest->next(); $this->assertEquals('title.xml', $manifest->current()->getHref()); $this->assertEquals('ncx', $manifest->last()->getId()); $this->assertSame($manifest['cover'], $manifest->first()); $this->assertSame($manifest['ncx'], $manifest->last()); } /** * @throws Exception * @return void */ public function testSpine() { $spine = $this->epub->getSpine(); $this->assertCount(31, $spine); $this->assertEquals('cover', $spine->first()->getId()); $this->assertEquals(DataItem::XHTML, $spine->current()->getMediaType()); $spine->next(); $this->assertEquals('title.xml', $spine->current()->getHref()); $this->assertEquals('feedbooks', $spine->last()->getId()); $this->assertEquals('fb.ncx', $spine->getTocItem()->getHref()); $this->assertSame($spine[0], $spine->first()); $this->assertSame($spine[30], $spine->last()); } /** * @throws Exception * @return void */ public function testToc() { $this->assertEquals(2, $this->epub->getEpubVersion()); $toc = $this->epub->getToc(); $this->assertEquals('Romeo and Juliet', $toc->getDocTitle()); $this->assertEquals('Shakespeare, William', $toc->getDocAuthor()); $navMap = $toc->getNavMap(); $this->assertEquals(8, $navMap->count()); $navPoint = $navMap->first(); /** @var TocNavPoint $navPoint */ $this->assertEquals('level1-titlepage', $navPoint->getId()); $this->assertEquals('titlepage', $navPoint->getClass()); $this->assertEquals('1', $navPoint->getPlayOrder()); $this->assertEquals('Title', $navPoint->getNavLabel()); $this->assertEquals('title.xml', $navPoint->getContentSource()); $this->assertCount(0, $navPoint->getChildren()); $navMap->next(); $navMap->next(); $navPoint = $navMap->current(); /** @var TocNavPoint $navPoint */ $this->assertEquals('sec77303', $navPoint->getId()); $this->assertEquals('section', $navPoint->getClass()); $this->assertEquals('3', $navPoint->getPlayOrder()); $this->assertEquals('Act I', $navPoint->getNavLabel()); $this->assertEquals('main0.xml', $navPoint->getContentSource()); $this->assertCount(6, $navPoint->getChildren()); $this->assertEquals('Prologue', $navPoint->getChildren()->first()->getNavLabel()); $this->assertEquals('SCENE V. A hall in Capulet\'s house.', $navPoint->getChildren()->last()->getNavLabel()); } /** * @throws Exception * @return void */ public function testNav() { $test_epub3 = __DIR__ . '/data/nav-non-text_img_title.epub'; $test_epub3_copy = __DIR__ . '/data/nav-non-text_img_title.copy.epub'; // sometime I might have accidentally broken the test file $this->assertEquals(239564, filesize($test_epub3)); // we work on a copy to test saving $this->assertTrue(copy($test_epub3, $test_epub3_copy)); $epub = new EPub($test_epub3_copy); $this->assertEquals(3, $epub->getEpubVersion()); $toc = $epub->getNav(); $this->assertEquals('nav-non-text_img_title', $toc->getDocTitle()); $this->assertEquals('Ivan Herman', $toc->getDocAuthor()); $navMap = $toc->getNavMap(); $this->assertEquals(2, $navMap->count()); $navPoint = $navMap->first(); /** @var TocNavPoint $navPoint */ $this->assertEquals('', $navPoint->getId()); $this->assertEquals('h1', $navPoint->getClass()); $this->assertEquals('1', $navPoint->getPlayOrder()); $this->assertEquals('Start page', $navPoint->getNavLabel()); $this->assertEquals('content_001.xhtml', $navPoint->getContentSource()); $this->assertCount(0, $navPoint->getChildren()); $navMap->next(); $navPoint = $navMap->current(); /** @var TocNavPoint $navPoint */ $this->assertEquals('', $navPoint->getId()); $this->assertEquals('h1', $navPoint->getClass()); $this->assertEquals('2', $navPoint->getPlayOrder()); $this->assertEquals('Description of the Abbey of Sénanque', $navPoint->getNavLabel()); $this->assertEquals('senanque.xhtml', $navPoint->getContentSource()); $this->assertCount(0, $navPoint->getChildren()); //$this->assertEquals('Prologue', $navPoint->getChildren()->first()->getNavLabel()); //$this->assertEquals('SCENE V. A hall in Capulet\'s house.', $navPoint->getChildren()->last()->getNavLabel()); unlink($test_epub3_copy); } /** * @throws Exception * @return void */ public function testNavTree() { $test_epub3 = __DIR__ . '/data/eng3.epub'; $test_epub3_copy = __DIR__ . '/data/eng3.copy.epub'; // sometime I might have accidentally broken the test file $this->assertEquals(53216, filesize($test_epub3)); // we work on a copy to test saving $this->assertTrue(copy($test_epub3, $test_epub3_copy)); $epub = new EPub($test_epub3_copy); $toc = $epub->getNav(); $this->assertEquals('Calibre Quick Start Guide', $toc->getDocTitle()); $this->assertEquals('John Schember', $toc->getDocAuthor()); $navMap = $toc->getNavMap(); $this->assertEquals(7, $navMap->count()); $this->assertCount(1, $navMap->findNavPointsForFile('text/introduction.xhtml')); $this->assertCount(0, $navMap->findNavPointsForFile('oops/are_we_lost?.xhtml')); $navPoint = $navMap->first(); /** @var TocNavPoint $navPoint */ $this->assertEquals('', $navPoint->getId()); $this->assertEquals('h1', $navPoint->getClass()); $this->assertEquals('1', $navPoint->getPlayOrder()); $this->assertEquals('Calibre Quick Start Guide', $navPoint->getNavLabel()); $this->assertEquals('text/internal_titlepage.xhtml', $navPoint->getContentSource()); $this->assertCount(0, $navPoint->getChildren()); $navMap->seek(5); $navPoint = $navMap->current(); /** @var TocNavPoint $navPoint */ $this->assertEquals('', $navPoint->getId()); $this->assertEquals('h1', $navPoint->getClass()); $this->assertEquals(6, $navPoint->getPlayOrder()); $this->assertEquals('Common Tasks', $navPoint->getNavLabel()); $this->assertEquals('text/common_tasks.xhtml', $navPoint->getContentSource()); $this->assertCount(6, $navPoint->getChildren()); $this->assertEquals('Task 1: Organizing', $navPoint->getChildren()->first()->getNavLabel()); $navPoint->getChildren()->next(); $childPoint = $navPoint->getChildren()->current(); $this->assertEquals('Task 2: Conversion', $childPoint->getNavLabel()); $this->assertCount(7, $childPoint->getChildren()); $this->assertEquals('Task 6: The e-book viewer', $navPoint->getChildren()->last()->getNavLabel()); unlink($test_epub3_copy); } /** * @dataProvider provideContentsTestParameters * @param string $referenceStart The expected start of the extracted contents. * @param string $referenceEnd The expected end of the extracted contents. * @param int $referenceSize The expected size of the extracted contents. * @param bool $keepMarkup Whether to extract contents with or without HTML markup. * @param float $fraction * @throws Exception * @return void */ public function testContents( $referenceStart, $referenceEnd, $referenceSize, $keepMarkup, $fraction ) { $contents = trim($this->epub->getContents($keepMarkup, $fraction)); $this->assertStringStartsWith($referenceStart, substr($contents, 0, 100)); $this->assertStringEndsWith($referenceEnd, substr($contents, -100)); $this->assertEquals($referenceSize, strlen($contents)); } /** * Summary of provideContentsTestParameters * @return array */ public static function provideContentsTestParameters() { return [ ["Romeo and Juliet\n\nWilliam Shakespeare", "www.feedbooks.com\n\n Food for the mind", 152879, false, 1], ["Romeo and Juliet\n\nWilliam Shakespeare", "seek happy nights to happy days.\n\nExeunt", 24936, false, .2], ["Romeo and Juliet\n\nWilliam Shakespeare", "miss, our toil shall strive to mend.", 3810, false, .1], ]; } /** * @dataProvider provideItemContentsTestParameters * @param string $referenceStart The expected start of the extracted contents. * @param string $referenceEnd The expected end of the extracted contents. * @param string $spineIndex The spine index of the item to extract contents from. * @param string $fragmentBegin The anchor name (ID) where to start extraction. * @param string $fragmentEnd The anchor name (ID) where to end extraction. * @throws Exception * @return void */ public function testItemContents( $referenceStart, $referenceEnd, $spineIndex, $fragmentBegin = null, $fragmentEnd = null ) { $spine = $this->epub->getSpine(); $contents = trim($spine[$spineIndex]->getContents($fragmentBegin, $fragmentEnd)); $this->assertStringStartsWith($referenceStart, $contents); $this->assertStringEndsWith($referenceEnd, $contents); } /** * Summary of provideItemContentsTestParameters * @return array */ public static function provideItemContentsTestParameters() { return [ ['Act I', 'our toil shall strive to mend.', 3], ['SCENE I. Verona. A public place.', "I'll pay that doctrine, or else die in debt.\n\nExeunt", 4], ['Act III', 'Act III', 16, 'section_77331', 'section_77332'], ['Act III', 'Act III', 16, null, 'section_77332'], ['SCENE I. A public place.', "pardoning those that kill.\n\nExeunt", 16, 'section_77332'], ]; } public function testItemContentsStartFragmentException(): void { $this->expectException(Exception::class); $this->expectExceptionMessage('Begin of fragment not found:'); $spine = $this->epub->getSpine(); $spine[3]->getContents('NonExistingElement'); } public function testItemContentsEndFragmentException(): void { $this->expectException(Exception::class); $this->expectExceptionMessage('End of fragment not found:'); $spine = $this->epub->getSpine(); $spine[3]->getContents(null, 'NonExistingElement'); } /** * @dataProvider provideItemContentsMarkupTestParameters * @param string $referenceFile * @param string $spineIndex * @param string $fragmentBegin * @param string $fragmentEnd * @throws Exception * @return void */ public function testItemContentsMarkup($referenceFile, $spineIndex, $fragmentBegin = null, $fragmentEnd = null) { $spine = $this->epub->getSpine(); $contents = $spine[$spineIndex]->getContents($fragmentBegin, $fragmentEnd, true); $contents = preg_replace('/\s+/m', ' ', $contents); $extracted = new DOMDocument(); $extracted->loadXML($contents); $extstring = $extracted->saveXML($extracted->documentElement); $extstring = preg_replace('/\s*([<>])\s*/m', '$1', $extstring); $reference = new DOMDocument(); $contents = file_get_contents($referenceFile); $contents = preg_replace('/\s+/m', ' ', $contents); $reference->loadXML($contents); $refstring = $reference->saveXML($reference->documentElement); $refstring = preg_replace('/\s*([<>])\s*/m', '$1', $refstring); $this->assertEquals($refstring, $extstring); //$this->assertEqualXMLStructure($reference->documentElement, $extracted->documentElement); } /** * Summary of provideItemContentsMarkupTestParameters * @return array */ public static function provideItemContentsMarkupTestParameters() { return [ [static::MARKUP_XML_1, 3], [static::MARKUP_XML_2, 4], [static::MARKUP_XML_3, 16, 'section_77331', 'section_77332'], [static::MARKUP_XML_4, 16, null, 'section_77332'], [static::MARKUP_XML_5, 16, 'section_77332'], ]; } /** * @throws Exception * @return void */ public function testItemDataSize() { $item = $this->epub->getSpine()[0]; $size = $item->getSize(); $data = $item->getData(); $this->assertEquals(strlen($data), $size); } /** * Summary of testZipEdit * @return void */ public function testZipEdit() { ZipEdit::copyTest(static::TEST_EPUB_COPY, static::TEST_EPUB_COVER); $epub = new EPub(static::TEST_EPUB_COVER); $oldManifest = $this->epub->getManifest(); $newManifest = $epub->getManifest(); $this->assertEquals($oldManifest, $newManifest); } }