"""Tests for IPython.utils.path.py""" # Copyright (c) IPython Development Team. # Distributed under the terms of the Modified BSD License. from contextlib import contextmanager from unittest.mock import patch import pytest from IPython.lib import latextools from IPython.testing.decorators import ( onlyif_cmds_exist, skipif_not_matplotlib, ) from IPython.utils.process import FindCmdError @pytest.mark.parametrize('command', ['latex', 'dvipng']) def test_check_latex_to_png_dvipng_fails_when_no_cmd(command): def mock_find_cmd(arg): if arg == command: raise FindCmdError with patch.object(latextools, "find_cmd", mock_find_cmd): assert latextools.latex_to_png_dvipng("whatever", True) is None @contextmanager def no_op(*args, **kwargs): yield @onlyif_cmds_exist("latex", "dvipng") @pytest.mark.parametrize("s, wrap", [("$$x^2$$", False), ("x^2", True)]) def test_latex_to_png_dvipng_runs(s, wrap): """ Test that latex_to_png_dvipng just runs without error. """ def mock_kpsewhich(filename): assert filename == "breqn.sty" return None latextools.latex_to_png_dvipng(s, wrap) with patch_latextool(mock_kpsewhich): latextools.latex_to_png_dvipng(s, wrap) def mock_kpsewhich(filename): assert filename == "breqn.sty" return None @contextmanager def patch_latextool(mock=mock_kpsewhich): with patch.object(latextools, "kpsewhich", mock): yield @pytest.mark.parametrize('context', [no_op, patch_latextool]) @pytest.mark.parametrize('s_wrap', [("$x^2$", False), ("x^2", True)]) def test_latex_to_png_mpl_runs(s_wrap, context): """ Test that latex_to_png_mpl just runs without error. """ try: import matplotlib except ImportError: pytest.skip("This needs matplotlib to be available") return s, wrap = s_wrap with context(): latextools.latex_to_png_mpl(s, wrap) @skipif_not_matplotlib def test_latex_to_html(): img = latextools.latex_to_html("$x^2$") assert "data:image/png;base64,iVBOR" in img def test_genelatex_no_wrap(): """ Test genelatex with wrap=False. """ def mock_kpsewhich(filename): assert False, ("kpsewhich should not be called " "(called with {0})".format(filename)) with patch_latextool(mock_kpsewhich): assert '\n'.join(latextools.genelatex("body text", False)) == r'''\documentclass{article} \usepackage{amsmath} \usepackage{amsthm} \usepackage{amssymb} \usepackage{bm} \pagestyle{empty} \begin{document} body text \end{document}''' def test_genelatex_wrap_with_breqn(): """ Test genelatex with wrap=True for the case breqn.sty is installed. """ def mock_kpsewhich(filename): assert filename == "breqn.sty" return "path/to/breqn.sty" with patch_latextool(mock_kpsewhich): assert '\n'.join(latextools.genelatex("x^2", True)) == r'''\documentclass{article} \usepackage{amsmath} \usepackage{amsthm} \usepackage{amssymb} \usepackage{bm} \usepackage{breqn} \pagestyle{empty} \begin{document} \begin{dmath*} x^2 \end{dmath*} \end{document}''' def test_genelatex_wrap_without_breqn(): """ Test genelatex with wrap=True for the case breqn.sty is not installed. """ def mock_kpsewhich(filename): assert filename == "breqn.sty" return None with patch_latextool(mock_kpsewhich): assert '\n'.join(latextools.genelatex("x^2", True)) == r'''\documentclass{article} \usepackage{amsmath} \usepackage{amsthm} \usepackage{amssymb} \usepackage{bm} \pagestyle{empty} \begin{document} $$x^2$$ \end{document}''' @skipif_not_matplotlib @onlyif_cmds_exist('latex', 'dvipng') def test_latex_to_png_color(): """ Test color settings for latex_to_png. """ latex_string = "$x^2$" default_value = latextools.latex_to_png(latex_string, wrap=False) default_hexblack = latextools.latex_to_png(latex_string, wrap=False, color='#000000') dvipng_default = latextools.latex_to_png_dvipng(latex_string, False) dvipng_black = latextools.latex_to_png_dvipng(latex_string, False, 'Black') assert dvipng_default == dvipng_black mpl_default = latextools.latex_to_png_mpl(latex_string, False) mpl_black = latextools.latex_to_png_mpl(latex_string, False, 'Black') assert mpl_default == mpl_black assert default_value in [dvipng_black, mpl_black] assert default_hexblack in [dvipng_black, mpl_black] # Test that dvips name colors can be used without error dvipng_maroon = latextools.latex_to_png_dvipng(latex_string, False, 'Maroon') # And that it doesn't return the black one assert dvipng_black != dvipng_maroon mpl_maroon = latextools.latex_to_png_mpl(latex_string, False, 'Maroon') assert mpl_black != mpl_maroon mpl_white = latextools.latex_to_png_mpl(latex_string, False, 'White') mpl_hexwhite = latextools.latex_to_png_mpl(latex_string, False, '#FFFFFF') assert mpl_white == mpl_hexwhite mpl_white_scale = latextools.latex_to_png_mpl(latex_string, False, 'White', 1.2) assert mpl_white != mpl_white_scale def test_latex_to_png_invalid_hex_colors(): """ Test that invalid hex colors provided to dvipng gives an exception. """ latex_string = "$x^2$" pytest.raises( ValueError, lambda: latextools.latex_to_png( latex_string, backend="dvipng", color="#f00bar" ), ) pytest.raises( ValueError, lambda: latextools.latex_to_png(latex_string, backend="dvipng", color="#f00"), )