diff options
Diffstat (limited to 'app/tests/test_cover.py')
| -rw-r--r-- | app/tests/test_cover.py | 30 |
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 |
