File: test_charmap.py

package info (click to toggle)
fpdf2 2.8.4-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 53,860 kB
  • sloc: python: 39,487; sh: 133; makefile: 12
file content (61 lines) | stat: -rw-r--r-- 1,963 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
"""Charmap Test Case

This module contains the test case for the Charmap Test. It prints the first
999 characters of the unicode character set with a unicode ttf font, and
verifies the result against a known good result.

This test will complain that some of the values in this font file are out of
the range of the C 'short' data type (2 bytes, 0 - 65535):
  fpdf/ttfonts.py:671: UserWarning: cmap value too big/small:
and this seems to be okay.
"""

import logging
from pathlib import Path

from fontTools.ttLib import TTFont
import pytest

from fpdf import FPDF
from test.conftest import assert_pdf_equal, ensure_exec_time_below

HERE = Path(__file__).resolve().parent


@pytest.mark.skip(reason="Font related tests are failing with the fonts available in Debian")
@pytest.mark.parametrize(
    "font_filename",
    [
        font_file.name
        for font_file in HERE.glob("*.*tf")
        if not any(
            exclude in font_file.stem
            for exclude in ("Bold", "Italic", "NotoColorEmoji")
        )
    ],
)
@ensure_exec_time_below(seconds=10)  # TwitterEmoji.ttf is the longest to process
def test_charmap_first_999_chars(caplog, font_filename, tmp_path):
    """
    Character Map Test
    from PyFPDF version 1.7.2: github.com/reingart/pyfpdf/commit/2eab310cfd866ce24947c3a9d850ebda7c6d515d
    """
    caplog.set_level(logging.ERROR)  # hides fonttool warnings

    font_path = HERE / font_filename
    font_name = font_path.stem

    pdf = FPDF()
    pdf.add_page()
    pdf.add_font(fname=font_path)
    pdf.set_font(font_name, size=10)

    font = TTFont(font_path, lazy=True)
    cmap = font.getBestCmap()

    # Create a PDF with the first 999 characters defined in the font:
    for counter, character in enumerate(list(cmap.keys())[:1000]):
        pdf.write(8, f"{counter:03}) {character:03x} - {character:c}", print_sh=True)
        pdf.ln()

    assert_pdf_equal(pdf, HERE / f"charmap_first_999_chars-{font_name}.pdf", tmp_path)