#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')