"""Exercise the abbreviations table through the actual Pandoc/LaTeX boundary.""" from __future__ import annotations import shutil import subprocess from pathlib import Path import pytest ROOT = Path(__file__).resolve().parents[2] THESIS = ROOT / "docs/thesis" @pytest.mark.skipif( any(shutil.which(tool) is None for tool in ("pandoc", "xelatex", "pdftotext")), reason="Pandoc, XeLaTeX, and pdftotext are needed for the front-matter build", ) def test_abbreviations_compile_without_a_dummy_float(tmp_path: Path) -> None: """Catch the unnumbered longtable/caption 'none' float failure in isolation.""" manuscript = (THESIS / "system-design-implementation.md").read_text( encoding="utf-8" ) abbreviations = manuscript.split("# List of Abbreviations", 1)[1] abbreviations = "# List of Abbreviations" + abbreviations.split("# Abstract", 1)[0] output = tmp_path / "abbreviations.pdf" # Use the real preamble: the caption-package interaction is absent from a # plain table-only Pandoc build. XeLaTeX also matches the thesis generator. result = subprocess.run( [ "pandoc", "--from=markdown", "--standalone", "--pdf-engine=xelatex", "--metadata=documentclass:report", "--include-in-header", str(THESIS / "header-includes.tex"), "--output", str(output), ], input=abbreviations, text=True, encoding="utf-8", capture_output=True, check=False, timeout=90, ) assert result.returncode == 0, result.stderr assert output.read_bytes().startswith(b"%PDF-") rendered = subprocess.run( ["pdftotext", "-layout", str(output), "-"], capture_output=True, text=True, encoding="utf-8", check=True, timeout=15, ).stdout assert "API" in rendered assert "Application Programming Interface" in rendered assert "None 1" not in rendered @pytest.mark.skipif( any(shutil.which(tool) is None for tool in ("pandoc", "xelatex", "pdftotext")), reason="Pandoc, XeLaTeX, and pdftotext are needed for the inline-code build", ) def test_inline_identifier_moves_to_next_line_intact(tmp_path: Path) -> None: """A prose line ending must not split a callable's name into fragments.""" output = tmp_path / "inline.pdf" identifier = "local.report.render_markdown_report" result = subprocess.run( [ "pandoc", "--standalone", "--pdf-engine=xelatex", "--variable=geometry:textwidth=10cm", "--variable=monofont:Libertinus Mono", "--include-in-header", str(THESIS / "header-includes.tex"), "--output", str(output), ], # Shift the identifier along the line to expose both forced splitting # and font-dependent automatic hyphenation near the right margin. input="\n\n".join( f"{'word ' * count}`{identifier}`." for count in range(1, 16) ), text=True, encoding="utf-8", capture_output=True, check=False, timeout=90, ) assert result.returncode == 0, result.stderr rendered = subprocess.run( ["pdftotext", "-layout", str(output), "-"], capture_output=True, text=True, encoding="utf-8", check=True, timeout=15, ).stdout assert rendered.count(identifier) == 15