From 048a709a5e25ea6ea201063e9106406c6d3542f9 Mon Sep 17 00:00:00 2001 From: Chuck <33324927+ChuckBuilds@users.noreply.github.com> Date: Wed, 23 Sep 2026 17:29:30 -0400 Subject: [PATCH] fix(testing): harness calendar_font is sized like the panel's VisualTestDisplayManager built its 5x7 calendar_font / bdf_5x7_font as a bare freetype.Face. With no size set its ascender reads 0, so BDF text drawn with it landed 6px above where DisplayManager draws it -- entirely off the canvas at y=0 -- and get_font_height() returned 0. Golden images and check_plugin / dev_server previews showed text the panel does not. Load it through load_bdf_face at the panel's 7px, so it is the very face DisplayManager uses. Across the differential run this changes only the cases drawn with the harness's own calendar_font (968 of 220,032), which now match the panel's output. Co-Authored-By: Claude Opus 5.5 --- CHANGELOG.md | 6 +++++- .../testing/visual_display_manager.py | 16 +++++++++------- test/test_bdf_font.py | 12 ++++++++++++ 3 files changed, 26 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b9e64bc2..67b4d1aa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -38,7 +38,11 @@ accepts both, but the store flags the old spelling as deprecated the file's native strike) and `draw_bdf_text(draw, text, x, y, face, color)`. `DisplayManager`, `FontManager`, `element_style` and the plugin test harness now all load and draw BDF text through it; the panel's pixels are unchanged - and BDF text draws 10-250x faster. + and BDF text draws 10-250x faster. The plugin test harness's + `calendar_font` / `bdf_5x7_font` now has the panel's 7px size set: it used + to be an unsized face, so in golden images and `check_plugin` / + `dev_server` previews its text sat 6px above where the panel draws it (off + the canvas entirely near the top) and `get_font_height()` returned 0. - The web UI's Fonts tab has a **Used by** column: the loaded plugins that registered each font with `FontManager.register_manager_font()`, published diff --git a/src/plugin_system/testing/visual_display_manager.py b/src/plugin_system/testing/visual_display_manager.py index e7f31fae..d3e7ba13 100644 --- a/src/plugin_system/testing/visual_display_manager.py +++ b/src/plugin_system/testing/visual_display_manager.py @@ -22,8 +22,8 @@ process_deferred_updates, update_display, render_size. A behavior change to any of those in DisplayManager must be mirrored here, or plugin visual tests will pass against stale behavior. -BDF glyphs are not mirrored: both classes draw them through -src/common/bdf_font.py, so those pixels cannot drift. +BDF text is not mirrored: both classes load BDF faces and draw BDF glyphs +through src/common/bdf_font.py, so those pixels cannot drift. """ import math @@ -34,7 +34,7 @@ from pathlib import Path from typing import Any, List, Optional, Tuple from PIL import Image, ImageDraw, ImageFont -from src.common.bdf_font import draw_bdf_text +from src.common.bdf_font import draw_bdf_text, load_bdf_face from src.common.font_layout import crisp_size, load_truetype from src.logging_config import get_logger @@ -151,16 +151,18 @@ class VisualTestDisplayManager: self.small_font = load_truetype(ttf_path, crisp_size(press_start, 8)) self.font = self.regular_font # alias used by some code paths - # 5x7 BDF font via freetype + # 5x7 BDF font, loaded exactly as DisplayManager._load_fonts does + # (same loader, same 7px request as its _CALENDAR_FONT_PX). A bare + # freetype.Face has no active size, so its ascender reads 0 and + # every line drew a baseline too high. try: - import freetype bdf_path = str(fonts_dir / '5x7.bdf') if not os.path.exists(bdf_path): raise FileNotFoundError(f"BDF font not found: {bdf_path}") - face = freetype.Face(bdf_path) + face, _ = load_bdf_face(bdf_path, 7) self.calendar_font = face self.bdf_5x7_font = face - except (ImportError, FileNotFoundError, OSError) as e: + except Exception as e: # freetype missing or the file unloadable logger.debug("BDF font not available, using small_font as fallback: %s", e) self.calendar_font = self.small_font self.bdf_5x7_font = self.small_font diff --git a/test/test_bdf_font.py b/test/test_bdf_font.py index 0932ce7a..1142a658 100644 --- a/test/test_bdf_font.py +++ b/test/test_bdf_font.py @@ -188,6 +188,18 @@ def test_display_manager_and_test_harness_draw_the_reference_pixels(name): _assert_same(ref, vt.image, ("VisualTestDisplayManager", name, text)) +def test_harness_calendar_font_is_the_panels(): + # The harness built a bare freetype.Face with no size: ascender 0, so + # every calendar_font line drew a baseline too high, and its + # get_font_height() returned 0. + from src.plugin_system.testing.visual_display_manager import VisualTestDisplayManager + + vt = VisualTestDisplayManager(64, 32) + panel_face, _ = load_bdf_face(str(FONTS_DIR / "5x7.bdf"), 7) + assert vt.calendar_font is panel_face + assert vt.get_font_height(vt.calendar_font) == panel_face.size.height >> 6 > 0 + + # -------------------------------------------------------------------- loader def test_off_strike_size_loads_the_native_strike():