summaryrefslogtreecommitdiff
path: root/support/gladtex/tests/test_cachedconverter.py
blob: b1c3bb786c3f58000ee7a943ed43ee0fdd9e4ddf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#pylint: disable=too-many-public-methods,import-error,too-few-public-methods,missing-docstring,unused-variable
import os
import shutil
import tempfile
import unittest
from unittest.mock import patch
from gleetex import cachedconverter, image
from gleetex.caching import JsonParserException
from gleetex.image import  remove_all

def get_number_of_files(path):
    return len(os.listdir(path))

def mk_eqn(eqn, count=0, pos=(1,1)):
    """Create formula. Each formula must look like this:
    (eqn, pos, path, dsp, count) for self._convert_concurrently, this is a
    shorthand with mocking a few values."""
    return (pos, False, eqn)

def write(path, content='dummy'):
    with open(path, 'w', encoding='utf-8') as f:
        f.write(str(content))

class Tex2imgMock():
    """Could use a proper mock, but this one allows a bit more tricking."""
    def __init__(self, fmt):
        self.__format = fmt
        self.set_dpi = self.set_transparency = self.set_foreground_color \
                = self.set_background_color = lambda x: None # do nothing

    def create_dvi(self, dvi_fn):
        with open(dvi_fn, 'w') as f:
            f.write('dummy')

    def create_image(self, dvi_fn):
        if os.path.exists(dvi_fn):
            os.remove(dvi_fn)
        write(os.path.splitext(dvi_fn)[0] + '.' + self.__format.value)

    def convert(self, tx, basename):
        write(basename + '.tex', tx)
        dvi = basename + '.dvi'
        self.create_dvi(dvi)
        self.create_image(dvi)
        remove_all(dvi, basename + '.tex', basename + '.log', basename + '.aux')
        return {'depth': 9, 'height': 8, 'width': 7}

    def parse_log(self, _logdata):
        return {}


class TestCachedConverter(unittest.TestCase):
    #pylint: disable=protected-access
    def setUp(self):
        self.original_directory = os.getcwd()
        self.tmpdir = tempfile.mkdtemp()
        os.chdir(self.tmpdir)


    #pylint: disable=protected-access
    def tearDown(self):
        # restore static reference to converter
        cachedconverter.CachedConverter._converter = image.Tex2img
        os.chdir(self.original_directory)
        shutil.rmtree(self.tmpdir, ignore_errors=True)



    @patch('gleetex.image.Tex2img', Tex2imgMock)
    def test_that_subdirectory_is_created(self):
        c = cachedconverter.CachedConverter('subdirectory')
        formula = ({}, True, '\\textbf{FOO!}')
        c.convert_all([formula])
        # one directory exists
        self.assertEqual(get_number_of_files('.'), 1,
                "Found the following files, expected only 'subdirectory': " + \
                ', '.join(os.listdir('.')))
        # subdirectory contains 1 image and a cache
        self.assertEqual(get_number_of_files('subdirectory'), 2, "expected two"+\
            " files, found instead " + repr(os.listdir('subdirectory')))

    def test_that_unknown_options_trigger_exception(self):
        c = cachedconverter.CachedConverter('subdirectory')
        self.assertRaises(ValueError, c.set_option, 'cxzbiucxzbiuxzb', 'muh')

    def test_that_invalid_caches_trigger_error_by_default(self):
        with open('gladtex.cache', 'w') as f:
            f.write('invalid cache')
        with self.assertRaises(JsonParserException):
            c = cachedconverter.CachedConverter('')

    @patch('gleetex.image.Tex2img', Tex2imgMock)
    def test_that_invalid_caches_get_removed_if_specified(self):
        formulas = [mk_eqn('tau')]
        with open('gladtex.cache', 'w') as f:
            f.write('invalid cache')
        c = cachedconverter.CachedConverter('.', keep_old_cache=False)
        c.convert_all(formulas)
        # cache got overridden
        with open('gladtex.cache') as f:
            self.assertFalse('invalid' in f.read())

    @patch('gleetex.image.Tex2img', Tex2imgMock)
    def test_that_converted_formulas_are_cached(self):
        formulas = [mk_eqn('\\tau')]
        c = cachedconverter.CachedConverter('.')
        c.convert_all(formulas)
        self.assertTrue(c.get_data_for('\\tau', False))


    @patch('gleetex.image.Tex2img', Tex2imgMock)
    def test_that_file_names_are_correctly_picked(self):
        formulas = [mk_eqn('\\tau')]
        write('eqn000.svg')
        write('eqn001.svg')
        c = cachedconverter.CachedConverter('')
        to_convert = c._get_formulas_to_convert(formulas)
        self.assertTrue(len(to_convert), 1)
        self.assertEqual(to_convert[0][2], 'eqn002.svg')

    @patch('gleetex.image.Tex2img', Tex2imgMock)
    def test_that_all_converted_formulas_are_in_cache_and_meta_info_correct(self):
        formulas = [mk_eqn('a_{%d}' % i, pos=(i,i), count=i) for i in range(4)]
        c = cachedconverter.CachedConverter('.')
        c.convert_all(formulas)
        # expect all formulas and a gladtex cache to exist
        self.assertEqual(get_number_of_files('.'), len(formulas)+1,
                "present files:\n" + ', '.join(os.listdir('.')))
        for pos, dsp, formula in formulas:
            data = c.get_data_for(formula, False)
            self.assertEqual(data['pos'], {'depth': 9, 'height': 8, 'width': 7},
                    "expected the pos as defined in the dummy class")

    @patch('gleetex.image.Tex2img', Tex2imgMock)
    def test_that_inline_math_and_display_math_results_in_different_formulas(self):
        # two formulas, second is displaymath
        formula = r'\sum_{i=0}^n x_i'
        formulas = [((1,1), False, formula), ((3,1), True, formula)]
        c = cachedconverter.CachedConverter('.')
        c.convert_all(formulas)
        # expect all formulas and a gladtex cache to exist
        self.assertEqual(get_number_of_files('.'), len(formulas)+1,
                "present files:\n%s" % ', '.join(os.listdir('.')))