150 lines
5.3 KiB
Python
150 lines
5.3 KiB
Python
import json
|
|
from pathlib import Path
|
|
import shutil
|
|
import sys
|
|
|
|
from matplotlib import cbook, dviread as dr
|
|
from matplotlib.testing import subprocess_run_for_testing, _has_tex_package
|
|
import pytest
|
|
|
|
|
|
def test_PsfontsMap(monkeypatch):
|
|
monkeypatch.setattr(dr, 'find_tex_file', lambda x: x.decode())
|
|
|
|
filename = str(Path(__file__).parent / 'baseline_images/dviread/test.map')
|
|
fontmap = dr.PsfontsMap(filename)
|
|
# Check all properties of a few fonts
|
|
for n in [1, 2, 3, 4, 5]:
|
|
key = b'TeXfont%d' % n
|
|
entry = fontmap[key]
|
|
assert entry.texname == key
|
|
assert entry.psname == b'PSfont%d' % n
|
|
if n not in [3, 5]:
|
|
assert entry.encoding == 'font%d.enc' % n
|
|
elif n == 3:
|
|
assert entry.encoding == 'enc3.foo'
|
|
# We don't care about the encoding of TeXfont5, which specifies
|
|
# multiple encodings.
|
|
if n not in [1, 5]:
|
|
assert entry.filename == 'font%d.pfa' % n
|
|
else:
|
|
assert entry.filename == 'font%d.pfb' % n
|
|
if n == 4:
|
|
assert entry.effects == {'slant': -0.1, 'extend': 1.2}
|
|
else:
|
|
assert entry.effects == {}
|
|
# Some special cases
|
|
entry = fontmap[b'TeXfont6']
|
|
assert entry.filename is None
|
|
assert entry.encoding is None
|
|
entry = fontmap[b'TeXfont7']
|
|
assert entry.filename is None
|
|
assert entry.encoding == 'font7.enc'
|
|
entry = fontmap[b'TeXfont8']
|
|
assert entry.filename == 'font8.pfb'
|
|
assert entry.encoding is None
|
|
entry = fontmap[b'TeXfont9']
|
|
assert entry.psname == b'TeXfont9'
|
|
assert entry.filename == '/absolute/font9.pfb'
|
|
# First of duplicates only.
|
|
entry = fontmap[b'TeXfontA']
|
|
assert entry.psname == b'PSfontA1'
|
|
# Slant/Extend only works for T1 fonts.
|
|
entry = fontmap[b'TeXfontB']
|
|
assert entry.psname == b'PSfontB6'
|
|
# Subsetted TrueType must have encoding.
|
|
entry = fontmap[b'TeXfontC']
|
|
assert entry.psname == b'PSfontC3'
|
|
# Missing font
|
|
with pytest.raises(LookupError, match='no-such-font'):
|
|
fontmap[b'no-such-font']
|
|
with pytest.raises(LookupError, match='%'):
|
|
fontmap[b'%']
|
|
|
|
|
|
@pytest.mark.skipif(sys.platform == "emscripten" or shutil.which("kpsewhich") is None,
|
|
reason="kpsewhich is not available")
|
|
@pytest.mark.parametrize("engine", ["pdflatex", "xelatex", "lualatex"])
|
|
def test_dviread(tmp_path, engine, monkeypatch):
|
|
dirpath = Path(__file__).parent / "baseline_images/dviread"
|
|
shutil.copy(dirpath / "test.tex", tmp_path)
|
|
shutil.copy(cbook._get_data_path("fonts/ttf/DejaVuSans.ttf"), tmp_path)
|
|
cmd, fmt = {
|
|
"pdflatex": (["latex", "-no-shell-escape"], "dvi"),
|
|
"xelatex": (["xelatex", "-no-pdf", "-no-shell-escape"], "xdv"),
|
|
"lualatex": (["lualatex", "-output-format=dvi", "-no-shell-escape"], "dvi"),
|
|
}[engine]
|
|
if shutil.which(cmd[0]) is None:
|
|
pytest.skip(f"{cmd[0]} is not available")
|
|
subprocess_run_for_testing(
|
|
[*cmd, "test.tex"], cwd=tmp_path, check=True, capture_output=True)
|
|
# dviread must be run from the tmppath directory because {xe,lua}tex output
|
|
# records the path to DejaVuSans.ttf as it is written in the tex source,
|
|
# i.e. as a relative path.
|
|
monkeypatch.chdir(tmp_path)
|
|
with dr.Dvi(tmp_path / f"test.{fmt}", None) as dvi:
|
|
try:
|
|
pages = [*dvi]
|
|
except FileNotFoundError as exc:
|
|
for note in getattr(exc, "__notes__", []):
|
|
if "too-old version of luaotfload" in note:
|
|
pytest.skip(note)
|
|
raise
|
|
data = [
|
|
{
|
|
"text": [
|
|
[
|
|
t.x, t.y,
|
|
t._as_unicode_or_name(),
|
|
t.font.resolve_path().name,
|
|
round(t.font.size, 2),
|
|
t.font.effects,
|
|
] for t in page.text
|
|
],
|
|
"boxes": [[b.x, b.y, b.height, b.width] for b in page.boxes]
|
|
} for page in pages
|
|
]
|
|
correct = json.loads((dirpath / f"{engine}.json").read_text())
|
|
assert data == correct
|
|
|
|
|
|
@pytest.mark.skipif(shutil.which("latex") is None, reason="latex is not available")
|
|
@pytest.mark.skipif(not _has_tex_package("concmath"), reason="needs concmath.sty")
|
|
def test_dviread_pk(tmp_path):
|
|
(tmp_path / "test.tex").write_text(r"""
|
|
\documentclass{article}
|
|
\usepackage{concmath}
|
|
\pagestyle{empty}
|
|
\begin{document}
|
|
Hi!
|
|
\end{document}
|
|
""")
|
|
subprocess_run_for_testing(
|
|
["latex", "-no-shell-escape", "test.tex"],
|
|
cwd=tmp_path, check=True, capture_output=True)
|
|
with dr.Dvi(tmp_path / "test.dvi", None) as dvi:
|
|
pages = [*dvi]
|
|
data = [
|
|
{
|
|
"text": [
|
|
[
|
|
t.x, t.y,
|
|
t._as_unicode_or_name(),
|
|
t.font.resolve_path().name,
|
|
round(t.font.size, 2),
|
|
t.font.effects,
|
|
] for t in page.text
|
|
],
|
|
"boxes": [[b.x, b.y, b.height, b.width] for b in page.boxes]
|
|
} for page in pages
|
|
]
|
|
correct = [{
|
|
'boxes': [],
|
|
'text': [
|
|
[5046272, 4128768, 'H?', 'ccr10.600pk', 9.96, {}],
|
|
[5530510, 4128768, 'i?', 'ccr10.600pk', 9.96, {}],
|
|
[5716195, 4128768, '!?', 'ccr10.600pk', 9.96, {}],
|
|
],
|
|
}]
|
|
assert data == correct
|