anki/pylib/tests/test_latex.py

100 lines
3.5 KiB
Python
Raw Normal View History

2021-04-13 10:45:05 +02:00
# Copyright: Ankitects Pty Ltd and contributors
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
# coding: utf-8
import os
import shutil
2020-11-17 10:23:06 +01:00
from anki.lang import without_unicode_isolation
from tests.shared import getEmptyCol
2019-12-25 05:18:34 +01:00
def test_latex():
col = getEmptyCol()
# change latex cmd to simulate broken build
import anki.latex
2019-12-25 05:18:34 +01:00
2017-08-01 06:25:49 +02:00
anki.latex.pngCommands[0][0] = "nolatex"
# add a note with latex
note = col.newNote()
note["Front"] = "[latex]hello[/latex]"
col.addNote(note)
# but since latex couldn't run, there's nothing there
assert len(os.listdir(col.media.dir())) == 0
# check the error message
2021-06-27 04:12:23 +02:00
msg = note.cards()[0].question()
2020-11-17 10:23:06 +01:00
assert "executing nolatex" in without_unicode_isolation(msg)
assert "installed" in msg
# check if we have latex installed, and abort test if we don't
if not shutil.which("latex") or not shutil.which("dvipng"):
2016-07-04 09:07:48 +02:00
print("aborting test; latex or dvipng is not installed")
return
# fix path
2017-08-01 06:25:49 +02:00
anki.latex.pngCommands[0][0] = "latex"
# check media db should cause latex to be generated
col.media.render_all_latex()
assert len(os.listdir(col.media.dir())) == 1
2021-06-27 04:12:23 +02:00
assert ".png" in note.cards()[0].question()
# adding new notes should cause generation on question display
note = col.newNote()
note["Front"] = "[latex]world[/latex]"
col.addNote(note)
2021-06-27 04:12:23 +02:00
note.cards()[0].question()
assert len(os.listdir(col.media.dir())) == 2
# another note with the same media should reuse
note = col.newNote()
note["Front"] = " [latex]world[/latex]"
col.addNote(note)
assert len(os.listdir(col.media.dir())) == 2
oldcard = note.cards()[0]
2021-06-27 04:12:23 +02:00
assert ".png" in oldcard.question()
# if we turn off building, then previous cards should work, but cards with
# missing media will show a broken image
anki.latex.build = False
note = col.newNote()
note["Front"] = "[latex]foo[/latex]"
col.addNote(note)
assert len(os.listdir(col.media.dir())) == 2
2021-06-27 04:12:23 +02:00
assert ".png" in oldcard.question()
2015-07-30 12:43:41 +02:00
# turn it on again so other test don't suffer
anki.latex.build = True
2017-10-05 06:14:56 +02:00
# bad commands
2015-07-30 12:43:41 +02:00
(result, msg) = _test_includes_bad_command("\\write18")
assert result, msg
(result, msg) = _test_includes_bad_command("\\readline")
assert result, msg
(result, msg) = _test_includes_bad_command("\\input")
assert result, msg
(result, msg) = _test_includes_bad_command("\\include")
assert result, msg
(result, msg) = _test_includes_bad_command("\\catcode")
assert result, msg
(result, msg) = _test_includes_bad_command("\\openout")
assert result, msg
(result, msg) = _test_includes_bad_command("\\write")
assert result, msg
(result, msg) = _test_includes_bad_command("\\loop")
assert result, msg
(result, msg) = _test_includes_bad_command("\\def")
assert result, msg
(result, msg) = _test_includes_bad_command("\\shipout")
assert result, msg
# inserting commands beginning with a bad name should not raise an error
(result, msg) = _test_includes_bad_command("\\defeq")
assert not result, msg
# normal commands should not either
(result, msg) = _test_includes_bad_command("\\emph")
assert not result, msg
2019-12-25 05:18:34 +01:00
2015-07-30 12:43:41 +02:00
def _test_includes_bad_command(bad):
col = getEmptyCol()
note = col.newNote()
2021-10-02 15:51:42 +02:00
note["Front"] = f"[latex]{bad}[/latex]"
col.addNote(note)
2021-06-27 04:12:23 +02:00
q = without_unicode_isolation(note.cards()[0].question())
2021-10-02 15:51:42 +02:00
return (f"'{bad}' is not allowed on cards" in q, f"Card content: {q}")