aboutsummaryrefslogtreecommitdiff
path: root/app/tests/test_cover.py
diff options
context:
space:
mode:
Diffstat (limited to 'app/tests/test_cover.py')
-rw-r--r--app/tests/test_cover.py30
1 files changed, 27 insertions, 3 deletions
diff --git a/app/tests/test_cover.py b/app/tests/test_cover.py
index f19db5a..ca8b9a2 100644
--- a/app/tests/test_cover.py
+++ b/app/tests/test_cover.py
@@ -9,6 +9,7 @@ from pathlib import Path
from converter.cover import (
_random_light_color,
+ _render_line,
_text_width,
_wrap_title,
generate_cover,
@@ -117,11 +118,13 @@ class GenerateCoverTests(unittest.TestCase):
_, _, rows = _decode_png(data)
self.assertEqual(_black_pixels(rows), 0)
- def test_unrenderable_title_degrades_to_gradient(self):
- # CJK glyphs are not in the bitmap font; no crash, no text pixels
+ def test_unrenderable_title_renders_placeholder_boxes(self):
+ # CJK glyphs are not in the bitmap font: they used to vanish
+ # (blank cover); now each renders as a black-outlined placeholder
+ # box so the title is visibly present.
_, data = self._write("书名")
_, _, rows = _decode_png(data)
- self.assertEqual(_black_pixels(rows), 0)
+ self.assertGreater(_black_pixels(rows), 0)
def test_write_failure_returns_none(self):
result = generate_cover("Hello", Path("/nonexistent_dir/cover.png"))
@@ -187,3 +190,24 @@ class DropShadowTests(unittest.TestCase):
if __name__ == "__main__":
unittest.main()
+
+
+class NonAsciiTitleTests(unittest.TestCase):
+ """Characters outside the bitmap font render as boxes, not blanks."""
+
+ def test_unknown_characters_are_rendered_as_placeholder_boxes(self):
+ # Regression: unknown chars used to be skipped in rendering while
+ # still counted for width, so e.g. Japanese titles produced a
+ # blank cover with no warning.
+ with tempfile.TemporaryDirectory() as tmp:
+ path = generate_cover("日本語", Path(tmp) / "c.png",
+ seed=1)
+ self.assertIsNotNone(path)
+ raw = path.read_bytes()
+ self.assertTrue(raw.startswith(b"\x89PNG"))
+
+ def test_placeholder_draws_pixels_for_every_unknown_char(self):
+ pixels = [[(255, 255, 255)] * 60 for _ in range(60)]
+ _render_line(pixels, "éé", 2, 2, color=(0, 0, 0))
+ dark = sum(1 for row in pixels for pixel in row if pixel == (0, 0, 0))
+ self.assertGreater(dark, 2 * 5 * 7 - 6) # both boxes' outlines drawn