summaryrefslogtreecommitdiff
path: root/support/gladtex/tests/test_caching.py
blob: dd3aebac776556f9a5282cb8c22e40c9c172c972 (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
144
145
146
147
148
149
#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 gleetex import caching

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

class test_caching(unittest.TestCase):
    def setUp(self):
        self.pos = {'height' : 8, 'depth' : 2, 'width' : 666}
        self.original_directory = os.getcwd()
        self.tmpdir = tempfile.mkdtemp()
        os.chdir(self.tmpdir)

    def tearDown(self):
        os.chdir(self.original_directory)
        shutil.rmtree(self.tmpdir, ignore_errors=True)

    def test_differently_spaced_formulas_are_the_same(self):
        form1 = r'\tau  \pi'
        form2 = '\tau\\pi'
        self.assertTrue(caching.normalize_formula(form1),
                caching.normalize_formula(form2))

    def test_trailing_and_leading_spaces_and_tabs_are_no_problem(self):
        u = caching.normalize_formula
        form1 = '  hi'
        form2 = 'hi  '
        form3 = '\thi'
        self.assertEqual(u(form1), u(form2))
        self.assertEqual(u(form1), u(form3))

    def test_that_empty_braces_are_ignored(self):
        u = caching.normalize_formula
        form1 = r'\sin{}x'
        form2 = r'\sin x'
        form3 = r'\sin{} x'
        self.assertEqual(u(form1), u(form2))
        self.assertEqual(u(form1), u(form3))
        self.assertEqual(u(form2), u(form3))

    def test_empty_cache_works_fine(self):
        write('foo.png', 'muha')
        c = caching.ImageCache('file.png')
        formula = r"f(x) = \ln(x)"
        c.add_formula(formula, self.pos, 'foo.png')
        self.assertTrue(c.contains(formula, False))

    def test_that_invalid_cach_entries_are_detected(self):
        # entry is invalid if file doesn't exist
        c = caching.ImageCache()
        formula = r"f(x) = \ln(x)"
        self.assertRaises(OSError, c.add_formula, formula, self.pos, 'file.png')

    def test_that_correct_pos_and_path_are_returned_after_writing_the_cache_back(self):
        c = caching.ImageCache()
        formula = r"g(x) = \ln(x)"
        write('file.png', 'dummy')
        c.add_formula(formula, self.pos, 'file.png', displaymath=False)
        c.write()
        c = caching.ImageCache()
        self.assertTrue(c.contains(formula, False))
        data = c.get_data_for(formula, False)
        self.assertEqual(data['pos'], self.pos)
        self.assertEqual(data['path'], 'file.png')


    def test_formulas_are_not_added_twice(self):
        form1 = r'\ln(x) \neq e^x'
        write('spass.png', 'binaryBinary_binary')
        c = caching.ImageCache()
        for i in range(1,10):
            c.add_formula(form1, self.pos, 'spass.png')
        self.assertEqual(len(c), 1)

    def test_that_remove_actually_removes(self):
        form1 = '\\int e^x dy'
        write('happyness.png', 'binaryBinary_binary')
        c = caching.ImageCache()
        c.add_formula(form1, self.pos, 'happyness.png')
        c.remove_formula(form1, False)
        self.assertEqual(len(c), 0)

    def test_removal_of_non_existing_formula_raises_exception(self):
        c = caching.ImageCache()
        self.assertRaises(KeyError, c.remove_formula, 'Haha!', False)

    def test_that_invalid_version_is_detected(self):
        c = caching.ImageCache('gladtex.cache')
        c._ImageCache__set_version('invalid.stuff')
        c.write()
        self.assertRaises(caching.JsonParserException, caching.ImageCache, 'gladtex.cache')

    def test_that_invalid_style_is_detected(self):
        write('foo.png', "dummy")
        c = caching.ImageCache('gladtex.cache')
        c.add_formula('\\tau', self.pos, 'foo.png', False)
        c.add_formula('\\theta', self.pos, 'foo.png', True)
        self.assertRaises(ValueError, c.add_formula, '\\gamma', self.pos, 'foo.png',
                'some stuff')

    def test_that_backslash_in_path_is_replaced_through_slash(self):
        c = caching.ImageCache('gladtex.cache')
        os.mkdir('bilder')
        write(os.path.join('bilder', 'foo.png'), str(0xdeadbeef))
        c.add_formula('\\tau', self.pos, 'bilder\\foo.png', False)
        self.assertTrue('/' in c.get_data_for('\\tau', False)['path'])

    def test_that_absolute_paths_trigger_OSError(self):
        c = caching.ImageCache('gladtex.cache')
        write('foo.png', "dummy")
        fn = os.path.abspath('foo.png')
        self.assertRaises(OSError, c.add_formula, '\\tau', self.pos,
                fn, False)

    def test_that_invalid_caches_are_removed_automatically_if_desired(self):
        file_was_removed = lambda x: self.assertFalse(os.path.exists(x),
                "expected that file %s was removed, but it still exists" % x)
        write('gladtex.cache', 'some non-json rubbish')
        c = caching.ImageCache('gladtex.cache', keep_old_cache=False)
        file_was_removed('gladtex.cache')
        # try the same in a subdirectory
        os.mkdir('foo')
        cache_path = os.path.join('foo', 'gladtex.cache')
        eqn1_path = os.path.join('foo', 'eqn000.png')
        eqn2_path = os.path.join('foo', 'eqn003.png')
        write(cache_path, 'some non-json rubbish')
        write(eqn1_path, 'binary')
        write(eqn2_path, 'more binary')
        c = caching.ImageCache(cache_path, keep_old_cache=False)
        file_was_removed(cache_path)
        file_was_removed(eqn1_path)
        file_was_removed(eqn2_path)

    def test_that_formulas_in_cache_with_no_file_raise_key_error(self):
        c = caching.ImageCache('gladtex.cache', keep_old_cache=False)
        write('foo.png', 'dummy')
        c.add_formula('\\tau', self.pos, 'foo.png')
        c.write()
        os.remove('foo.png')
        c = caching.ImageCache('gladtex.cache', keep_old_cache=False)
        with self.assertRaises(KeyError):
            c.get_data_for('foo.png', 'False')