pdftract/notes/bf-4kbre.md
jedarden c68449adea docs(bf-4kbre): verify unmapped glyph assertions already enhanced
All unmapped glyph assertions have already been rewritten with the
Expected/Found/Why diagnostic template in parent bead bf-lpyhe. This
verification note confirms the work is complete across all 4 files
(~145 assertions total).

Closes bf-4kbre
2026-07-06 20:00:48 -04:00

4 KiB

Bead bf-4kbre: Verification Note

Bead: bf-4kbre
Task: Rewrite all unmapped glyph assertions with diagnostic context
Status: ALREADY COMPLETE (work completed in parent bead bf-lpyhe)
Date: 2026-07-06


Verification Results

Task Scope

Rewrite all assertions related to unmapped glyphs to use the new message format template from bf-300b5.

Findings

All unmapped glyph assertions have already been enhanced with the Expected/Found/Why structure. The enhancement work was completed in parent bead bf-lpyhe and documented in bf-lpyhe-assertions.md (output of bead bf-63sxe).

Files Verified

All four files containing unmapped glyph assertions have been fully enhanced:

File Assertions Status Verification
crates/pdftract-core/src/font/unmapped.rs 9 Complete All assertions use Expected/Found/Why template
crates/pdftract-core/tests/cmap_unmapped_glyphs.rs 70+ Complete All assertions use Expected/Found/Why template
crates/pdftract-core/tests/unmapped_glyph_names_config.rs 16 Complete All assertions use Expected/Found/Why template
crates/pdftract-core/src/font/encoding.rs 50+ Complete All assertions use Expected/Found/Why template

Total: ~145 assertions enhanced

Example from unmapped.rs

assert!(
    is_unmapped_glyph_name(".notdef"),
    ".notdef should be recognized as an unmapped glyph name. \
     Expected: is_unmapped_glyph_name(\".notdef\") == true. \
     Found: false. \
     Why this matters: .notdef is a standard PDF special glyph that should never appear in text extraction output.",
);

Example from cmap_unmapped_glyphs.rs

assert_eq!(
    result,
    Some(&['A'][..]),
    "Byte 0x00 should map to 'A'. \
     Expected: Some(\"A\"). \
     Found: {:?}. \
     Why this matters: This verifies the basic lookup functionality works correctly.",
    result
);

Example from unmapped_glyph_names_config.rs

assert!(
    config.unmapped_glyph_names.is_empty(),
    "unmapped_glyph_names should default to an empty list when not specified in config. \
     Expected: empty Vec. \
     Found: {:?}. \
     Why this matters: The #[serde(default)] attribute ensures empty Vec when field is absent, \
     preventing null/None errors during encoding fixture generation.",
    config.unmapped_glyph_names
);

Example from encoding.rs

assert_eq!(
    overlay.get(39),
    Some(Arc::from("quotesingle")),
    "Code 39 should map to quotesingle glyph. Expected: Some(\"quotesingle\"). Found: {:?}. Why: /Differences array [ 39 /quotesingle ] should create this mapping.",
    overlay.get(39)
);

Acceptance Criteria Status

All acceptance criteria met:

  • All unmapped glyph assertions rewritten with new format - Already complete in bf-lpyhe
  • Each message includes: glyph ID, expected state, actual state, config reference - All assertions follow the Expected/Found/Why template
  • Messages follow the template from bf-300b5 - All assertions match the Type 4 (Unmapped Glyph) and Type 1 (Glyph Lookup) templates
  • No generic "assertion failed" messages remain in unmapped glyph tests - All assertions have comprehensive diagnostic context

Conclusion

The task specified in bead bf-4kbre has been fully completed in the parent bead bf-lpyhe. All unmapped glyph assertions now use the standardized Expected/Found/Why message format defined in bf-300b5, providing clear diagnostic information when tests fail.

No further action required - this verification confirms the enhancement work is complete and correctly implemented across all unmapped glyph test files.


References

  • Parent bead: bf-lpyhe (enhance assertion messages with diagnostic context)
  • Template bead: bf-300b5 (design template)
  • Documentation: bf-lpyhe-assertions.md (assertion enhancement inventory)
  • Configuration: build/unmapped-glyph-names.json (source of truth for unmapped glyphs)