improved library screen, fixed issues with image rendering and navigation
This commit is contained in:
@@ -0,0 +1,132 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Test that images render correctly in EPUB files.
|
||||
|
||||
This test verifies that:
|
||||
1. All images in the EPUB are loaded with correct dimensions
|
||||
2. Images can be navigated to without errors
|
||||
3. Pages with images render successfully
|
||||
4. The rendered pages contain actual image content (not blank)
|
||||
"""
|
||||
|
||||
import pytest
|
||||
from dreader.application import EbookReader
|
||||
from pyWebLayout.abstract.block import Image as AbstractImage
|
||||
from PIL import Image
|
||||
import numpy as np
|
||||
|
||||
|
||||
def test_epub_images():
|
||||
"""Test that EPUB images render correctly."""
|
||||
|
||||
# Create reader
|
||||
reader = EbookReader(page_size=(800, 1200))
|
||||
|
||||
# Load EPUB
|
||||
epub_path = "tests/data/library-epub/pg11-images-3.epub"
|
||||
success = reader.load_epub(epub_path)
|
||||
|
||||
assert success, "Failed to load EPUB"
|
||||
assert reader.book_title == "Alice's Adventures in Wonderland"
|
||||
|
||||
# Check that images were parsed
|
||||
images = [b for b in reader.blocks if isinstance(b, AbstractImage)]
|
||||
assert len(images) >= 1, f"Expected at least 1 image, found {len(images)}"
|
||||
|
||||
# Check that all images have dimensions set
|
||||
for img in images:
|
||||
assert img.width is not None, f"Image {img.source} has no width"
|
||||
assert img.height is not None, f"Image {img.source} has no height"
|
||||
assert img.width > 0, f"Image {img.source} has invalid width: {img.width}"
|
||||
assert img.height > 0, f"Image {img.source} has invalid height: {img.height}"
|
||||
|
||||
# Check that image is loaded into memory
|
||||
assert hasattr(img, '_loaded_image'), f"Image {img.source} not loaded"
|
||||
assert img._loaded_image is not None, f"Image {img.source} _loaded_image is None"
|
||||
|
||||
# Test navigation through first 15 pages (which should include all images)
|
||||
for page_num in range(15):
|
||||
page_img = reader.get_current_page()
|
||||
|
||||
assert page_img is not None, f"Page {page_num + 1} failed to render"
|
||||
assert isinstance(page_img, Image.Image), f"Page {page_num + 1} is not a PIL Image"
|
||||
assert page_img.size == (800, 1200), f"Page {page_num + 1} has wrong size: {page_img.size}"
|
||||
|
||||
# Check that page has some non-white content
|
||||
arr = np.array(page_img.convert('RGB'))
|
||||
non_white_pixels = np.sum(arr < 255)
|
||||
|
||||
assert non_white_pixels > 100, f"Page {page_num + 1} appears to be blank (only {non_white_pixels} non-white pixels)"
|
||||
|
||||
# Navigate to next page
|
||||
if page_num < 14:
|
||||
next_result = reader.next_page()
|
||||
if next_result is None:
|
||||
# It's OK to reach end of book early
|
||||
break
|
||||
|
||||
|
||||
def test_cover_image():
|
||||
"""Specifically test that the cover image renders."""
|
||||
|
||||
reader = EbookReader(page_size=(800, 1200))
|
||||
reader.load_epub("tests/data/library-epub/pg11-images-3.epub")
|
||||
|
||||
# The first page should have the cover image
|
||||
page_img = reader.get_current_page()
|
||||
assert page_img is not None, "Cover page failed to render"
|
||||
|
||||
# Save for visual inspection
|
||||
output_path = "/tmp/epub_cover_test.png"
|
||||
page_img.save(output_path)
|
||||
|
||||
# Check that it has significant content (the cover image)
|
||||
arr = np.array(page_img.convert('RGB'))
|
||||
non_white_pixels = np.sum(arr < 255)
|
||||
|
||||
# The cover page should have substantial content
|
||||
assert non_white_pixels > 10000, f"Cover page has too few non-white pixels: {non_white_pixels}"
|
||||
|
||||
|
||||
def test_multiple_epub_images():
|
||||
"""Test images across multiple EPUB files."""
|
||||
|
||||
epub_files = [
|
||||
("tests/data/library-epub/pg11-images-3.epub", "Alice's Adventures in Wonderland"),
|
||||
("tests/data/library-epub/pg16328-images-3.epub", "Beowulf: An Anglo-Saxon Epic Poem"),
|
||||
("tests/data/library-epub/pg5200-images-3.epub", "Metamorphosis"),
|
||||
]
|
||||
|
||||
for epub_path, expected_title in epub_files:
|
||||
reader = EbookReader(page_size=(800, 1200))
|
||||
success = reader.load_epub(epub_path)
|
||||
|
||||
assert success, f"Failed to load {epub_path}"
|
||||
assert reader.book_title == expected_title
|
||||
|
||||
# Check that at least one image exists
|
||||
images = [b for b in reader.blocks if isinstance(b, AbstractImage)]
|
||||
assert len(images) >= 1, f"{epub_path} should have at least 1 image"
|
||||
|
||||
# Check first image is valid
|
||||
img = images[0]
|
||||
assert img.width > 0 and img.height > 0, f"Invalid dimensions in {epub_path}"
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
# Run tests directly
|
||||
print("Testing EPUB images...")
|
||||
|
||||
print("\n1. Testing all images load and render...")
|
||||
test_epub_images()
|
||||
print("✓ PASSED")
|
||||
|
||||
print("\n2. Testing cover image...")
|
||||
test_cover_image()
|
||||
print("✓ PASSED")
|
||||
|
||||
print("\n3. Testing multiple EPUB images...")
|
||||
test_multiple_epub_images()
|
||||
print("✓ PASSED")
|
||||
|
||||
print("\n✓ All tests passed!")
|
||||
Reference in New Issue
Block a user