blob: 4d9372deb3d31b26254b6e67f5c4ed77bcf6158d [file] [log] [blame]
from __future__ import print_function, division, absolute_import
from fontTools.misc.py23 import *
from fontTools import ttx
import getopt
import os
import shutil
import sys
import tempfile
import unittest
class TTXTest(unittest.TestCase):
def __init__(self, methodName):
unittest.TestCase.__init__(self, methodName)
# Python 3 renamed assertRaisesRegexp to assertRaisesRegex,
# and fires deprecation warnings if a program uses the old name.
if not hasattr(self, "assertRaisesRegex"):
self.assertRaisesRegex = self.assertRaisesRegexp
def setUp(self):
self.tempdir = None
self.num_tempfiles = 0
def tearDown(self):
if self.tempdir:
shutil.rmtree(self.tempdir)
@staticmethod
def getpath(testfile):
path, _ = os.path.split(__file__)
return os.path.join(path, "data", testfile)
def temp_dir(self):
if not self.tempdir:
self.tempdir = tempfile.mkdtemp()
def temp_font(self, font_path, file_name):
self.temp_dir()
temppath = os.path.join(self.tempdir, file_name)
shutil.copy2(font_path, temppath)
return temppath
# -----
# Tests
# -----
def test_parseOptions_no_args(self):
with self.assertRaises(getopt.GetoptError) as cm:
ttx.parseOptions([])
self.assertTrue('Must specify at least one input file' in str(cm.exception))
def test_parseOptions_invalid_path(self):
file_path = 'invalid_font_path'
with self.assertRaises(getopt.GetoptError) as cm:
ttx.parseOptions([file_path])
self.assertTrue('File not found: "%s"' % file_path in str(cm.exception))
def test_parseOptions_font2ttx_1st_time(self):
file_name = 'TestOTF.otf'
font_path = self.getpath(file_name)
temp_path = self.temp_font(font_path, file_name)
jobs, _ = ttx.parseOptions([temp_path])
self.assertEqual(jobs[0][0].__name__, 'ttDump')
self.assertEqual(jobs[0][1:],
(os.path.join(self.tempdir, file_name),
os.path.join(self.tempdir, file_name.split('.')[0] + '.ttx')))
def test_parseOptions_font2ttx_2nd_time(self):
file_name = 'TestTTF.ttf'
font_path = self.getpath(file_name)
temp_path = self.temp_font(font_path, file_name)
_, _ = ttx.parseOptions([temp_path]) # this is NOT a mistake
jobs, _ = ttx.parseOptions([temp_path])
self.assertEqual(jobs[0][0].__name__, 'ttDump')
self.assertEqual(jobs[0][1:],
(os.path.join(self.tempdir, file_name),
os.path.join(self.tempdir, file_name.split('.')[0] + '#1.ttx')))
def test_parseOptions_ttx2font_1st_time(self):
file_name = 'TestTTF.ttx'
font_path = self.getpath(file_name)
temp_path = self.temp_font(font_path, file_name)
jobs, _ = ttx.parseOptions([temp_path])
self.assertEqual(jobs[0][0].__name__, 'ttCompile')
self.assertEqual(jobs[0][1:],
(os.path.join(self.tempdir, file_name),
os.path.join(self.tempdir, file_name.split('.')[0] + '.ttf')))
def test_parseOptions_ttx2font_2nd_time(self):
file_name = 'TestOTF.ttx'
font_path = self.getpath(file_name)
temp_path = self.temp_font(font_path, file_name)
_, _ = ttx.parseOptions([temp_path]) # this is NOT a mistake
jobs, _ = ttx.parseOptions([temp_path])
self.assertEqual(jobs[0][0].__name__, 'ttCompile')
self.assertEqual(jobs[0][1:],
(os.path.join(self.tempdir, file_name),
os.path.join(self.tempdir, file_name.split('.')[0] + '#1.otf')))
def test_parseOptions_multiple_fonts(self):
file_names = ['TestOTF.otf', 'TestTTF.ttf']
font_paths = [self.getpath(file_name) for file_name in file_names]
temp_paths = [self.temp_font(font_path, file_name) \
for font_path, file_name in zip(font_paths, file_names)]
jobs, _ = ttx.parseOptions(temp_paths)
for i in range(len(jobs)):
self.assertEqual(jobs[i][0].__name__, 'ttDump')
self.assertEqual(jobs[i][1:],
(os.path.join(self.tempdir, file_names[i]),
os.path.join(self.tempdir, file_names[i].split('.')[0] + '.ttx')))
def test_parseOptions_mixed_files(self):
operations = ['ttDump', 'ttCompile']
extensions = ['.ttx', '.ttf']
file_names = ['TestOTF.otf', 'TestTTF.ttx']
font_paths = [self.getpath(file_name) for file_name in file_names]
temp_paths = [self.temp_font(font_path, file_name) \
for font_path, file_name in zip(font_paths, file_names)]
jobs, _ = ttx.parseOptions(temp_paths)
for i in range(len(jobs)):
self.assertEqual(jobs[i][0].__name__, operations[i])
self.assertEqual(jobs[i][1:],
(os.path.join(self.tempdir, file_names[i]),
os.path.join(self.tempdir, file_names[i].split('.')[0] + extensions[i])))
def test_guessFileType_ttf(self):
file_name = 'TestTTF.ttf'
font_path = self.getpath(file_name)
self.assertEqual(ttx.guessFileType(font_path), 'TTF')
def test_guessFileType_otf(self):
file_name = 'TestOTF.otf'
font_path = self.getpath(file_name)
self.assertEqual(ttx.guessFileType(font_path), 'OTF')
def test_guessFileType_woff(self):
file_name = 'TestWOFF.woff'
font_path = self.getpath(file_name)
self.assertEqual(ttx.guessFileType(font_path), 'WOFF')
def test_guessFileType_woff2(self):
file_name = 'TestWOFF2.woff2'
font_path = self.getpath(file_name)
self.assertEqual(ttx.guessFileType(font_path), 'WOFF2')
def test_guessFileType_ttc(self):
file_name = 'TestTTC.ttc'
font_path = self.getpath(file_name)
self.assertEqual(ttx.guessFileType(font_path), 'TTC')
def test_guessFileType_dfont(self):
file_name = 'TestDFONT.dfont'
font_path = self.getpath(file_name)
self.assertEqual(ttx.guessFileType(font_path), 'TTF')
def test_guessFileType_ttx_ttf(self):
file_name = 'TestTTF.ttx'
font_path = self.getpath(file_name)
self.assertEqual(ttx.guessFileType(font_path), 'TTX')
def test_guessFileType_ttx_otf(self):
file_name = 'TestOTF.ttx'
font_path = self.getpath(file_name)
self.assertEqual(ttx.guessFileType(font_path), 'OTX')
def test_guessFileType_ttx_bom(self):
file_name = 'TestBOM.ttx'
font_path = self.getpath(file_name)
self.assertEqual(ttx.guessFileType(font_path), 'TTX')
def test_guessFileType_ttx_no_sfntVersion(self):
file_name = 'TestNoSFNT.ttx'
font_path = self.getpath(file_name)
self.assertEqual(ttx.guessFileType(font_path), 'TTX')
def test_guessFileType_ttx_no_xml(self):
file_name = 'TestNoXML.ttx'
font_path = self.getpath(file_name)
self.assertIsNone(ttx.guessFileType(font_path))
def test_guessFileType_invalid_path(self):
font_path = 'invalid_font_path'
self.assertIsNone(ttx.guessFileType(font_path))
if __name__ == "__main__":
sys.exit(unittest.main())