2012-12-21 08:51:59 +01:00
|
|
|
# coding: utf-8
|
|
|
|
|
|
|
|
import os
|
2016-05-12 06:45:35 +02:00
|
|
|
|
|
|
|
import shutil
|
|
|
|
|
2014-06-03 10:38:47 +02:00
|
|
|
from tests.shared import getEmptyCol
|
2012-12-22 01:17:10 +01:00
|
|
|
from anki.utils import stripHTML
|
2012-12-21 08:51:59 +01:00
|
|
|
|
|
|
|
def test_latex():
|
2014-06-03 10:38:47 +02:00
|
|
|
d = getEmptyCol()
|
2012-12-21 08:51:59 +01:00
|
|
|
# change latex cmd to simulate broken build
|
|
|
|
import anki.latex
|
2017-08-01 06:25:49 +02:00
|
|
|
anki.latex.pngCommands[0][0] = "nolatex"
|
2012-12-21 08:51:59 +01:00
|
|
|
# add a note with latex
|
|
|
|
f = d.newNote()
|
2016-05-12 06:45:35 +02:00
|
|
|
f['Front'] = "[latex]hello[/latex]"
|
2012-12-21 08:51:59 +01:00
|
|
|
d.addNote(f)
|
|
|
|
# but since latex couldn't run, there's nothing there
|
|
|
|
assert len(os.listdir(d.media.dir())) == 0
|
|
|
|
# check the error message
|
|
|
|
msg = f.cards()[0].q()
|
2014-06-03 10:25:43 +02:00
|
|
|
assert "executing nolatex" in msg
|
2012-12-21 08:51:59 +01:00
|
|
|
assert "installed" in msg
|
|
|
|
# check if we have latex installed, and abort test if we don't
|
2016-05-12 06:45:35 +02:00
|
|
|
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")
|
2016-05-12 06:45:35 +02:00
|
|
|
return
|
2012-12-21 08:51:59 +01:00
|
|
|
# fix path
|
2017-08-01 06:25:49 +02:00
|
|
|
anki.latex.pngCommands[0][0] = "latex"
|
2012-12-21 08:51:59 +01:00
|
|
|
# check media db should cause latex to be generated
|
|
|
|
d.media.check()
|
|
|
|
assert len(os.listdir(d.media.dir())) == 1
|
|
|
|
assert ".png" in f.cards()[0].q()
|
|
|
|
# adding new notes should cause generation on question display
|
|
|
|
f = d.newNote()
|
2016-05-12 06:45:35 +02:00
|
|
|
f['Front'] = "[latex]world[/latex]"
|
2012-12-21 08:51:59 +01:00
|
|
|
d.addNote(f)
|
|
|
|
f.cards()[0].q()
|
|
|
|
assert len(os.listdir(d.media.dir())) == 2
|
|
|
|
# another note with the same media should reuse
|
|
|
|
f = d.newNote()
|
2016-05-12 06:45:35 +02:00
|
|
|
f['Front'] = " [latex]world[/latex]"
|
2012-12-21 08:51:59 +01:00
|
|
|
d.addNote(f)
|
|
|
|
assert len(os.listdir(d.media.dir())) == 2
|
|
|
|
oldcard = f.cards()[0]
|
|
|
|
assert ".png" in oldcard.q()
|
|
|
|
# if we turn off building, then previous cards should work, but cards with
|
|
|
|
# missing media will show the latex
|
|
|
|
anki.latex.build = False
|
|
|
|
f = d.newNote()
|
2016-05-12 06:45:35 +02:00
|
|
|
f['Front'] = "[latex]foo[/latex]"
|
2012-12-21 08:51:59 +01:00
|
|
|
d.addNote(f)
|
|
|
|
assert len(os.listdir(d.media.dir())) == 2
|
|
|
|
assert stripHTML(f.cards()[0].q()) == "[latex]foo[/latex]"
|
|
|
|
assert ".png" in oldcard.q()
|
2015-07-30 12:43:41 +02:00
|
|
|
# turn it on again so other test don't suffer
|
|
|
|
anki.latex.build = True
|
|
|
|
|
|
|
|
def test_bad_latex_command_write18():
|
|
|
|
(result, msg) = _test_includes_bad_command("\\write18")
|
|
|
|
assert result, msg
|
|
|
|
|
|
|
|
def test_bad_latex_command_readline():
|
|
|
|
(result, msg) = _test_includes_bad_command("\\readline")
|
|
|
|
assert result, msg
|
|
|
|
|
|
|
|
def test_bad_latex_command_input():
|
|
|
|
(result, msg) = _test_includes_bad_command("\\input")
|
|
|
|
assert result, msg
|
|
|
|
|
|
|
|
def test_bad_latex_command_include():
|
|
|
|
(result, msg) = _test_includes_bad_command("\\include")
|
|
|
|
assert result, msg
|
|
|
|
|
|
|
|
def test_bad_latex_command_catcode():
|
|
|
|
(result, msg) = _test_includes_bad_command("\\catcode")
|
|
|
|
assert result, msg
|
|
|
|
|
|
|
|
def test_bad_latex_command_openout():
|
|
|
|
(result, msg) = _test_includes_bad_command("\\openout")
|
|
|
|
assert result, msg
|
|
|
|
|
|
|
|
def test_bad_latex_command_write():
|
|
|
|
(result, msg) = _test_includes_bad_command("\\write")
|
|
|
|
assert result, msg
|
|
|
|
|
|
|
|
def test_bad_latex_command_loop():
|
|
|
|
(result, msg) = _test_includes_bad_command("\\loop")
|
|
|
|
assert result, msg
|
|
|
|
|
|
|
|
def test_bad_latex_command_def():
|
|
|
|
(result, msg) = _test_includes_bad_command("\\def")
|
|
|
|
assert result, msg
|
|
|
|
|
|
|
|
def test_bad_latex_command_shipout():
|
|
|
|
(result, msg) = _test_includes_bad_command("\\shipout")
|
|
|
|
assert result, msg
|
|
|
|
|
|
|
|
def test_good_latex_command_works():
|
|
|
|
# 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
|
|
|
|
|
|
|
|
def _test_includes_bad_command(bad):
|
|
|
|
d = getEmptyCol()
|
|
|
|
f = d.newNote()
|
2016-05-12 06:45:35 +02:00
|
|
|
f['Front'] = '[latex]%s[/latex]' % bad;
|
2015-07-30 12:43:41 +02:00
|
|
|
d.addNote(f)
|
|
|
|
q = f.cards()[0].q()
|
2016-07-04 09:07:48 +02:00
|
|
|
return ("'%s' is not allowed on cards" % bad in q, "Card content: %s" % q)
|