diff options
Diffstat (limited to 'Tests')
-rw-r--r-- | Tests/ttLib/sfnt_test.py | 56 | ||||
-rw-r--r-- | Tests/ttLib/tables/_n_a_m_e_test.py | 14 | ||||
-rw-r--r-- | Tests/varLib/data/test_results/BuildTestCFF2.ttx | 10 | ||||
-rw-r--r-- | Tests/varLib/varLib_test.py | 3 |
4 files changed, 76 insertions, 7 deletions
diff --git a/Tests/ttLib/sfnt_test.py b/Tests/ttLib/sfnt_test.py index 91734833..9f817444 100644 --- a/Tests/ttLib/sfnt_test.py +++ b/Tests/ttLib/sfnt_test.py @@ -1,7 +1,59 @@ -from fontTools.misc.py23 import * -from fontTools.ttLib.sfnt import calcChecksum +import io +import copy +import pickle +from fontTools.ttLib.sfnt import calcChecksum, SFNTReader +import pytest def test_calcChecksum(): assert calcChecksum(b"abcd") == 1633837924 assert calcChecksum(b"abcdxyz") == 3655064932 + + +EMPTY_SFNT = b"\x00\x01\x00\x00" + b"\x00" * 8 + + +def pickle_unpickle(obj): + return pickle.loads(pickle.dumps(obj)) + + +class SFNTReaderTest: + @pytest.mark.parametrize("deepcopy", [copy.deepcopy, pickle_unpickle]) + def test_pickle_protocol_FileIO(self, deepcopy, tmp_path): + fontfile = tmp_path / "test.ttf" + fontfile.write_bytes(EMPTY_SFNT) + reader = SFNTReader(fontfile.open("rb")) + + reader2 = deepcopy(reader) + + assert reader2 is not reader + assert reader2.file is not reader.file + + assert isinstance(reader2.file, io.BufferedReader) + assert isinstance(reader2.file.raw, io.FileIO) + assert reader2.file.name == reader.file.name + assert reader2.file.tell() == reader.file.tell() + + for k, v in reader.__dict__.items(): + if k == "file": + continue + assert getattr(reader2, k) == v + + @pytest.mark.parametrize("deepcopy", [copy.deepcopy, pickle_unpickle]) + def test_pickle_protocol_BytesIO(self, deepcopy, tmp_path): + buf = io.BytesIO(EMPTY_SFNT) + reader = SFNTReader(buf) + + reader2 = deepcopy(reader) + + assert reader2 is not reader + assert reader2.file is not reader.file + + assert isinstance(reader2.file, io.BytesIO) + assert reader2.file.tell() == reader.file.tell() + assert reader2.file.getvalue() == reader.file.getvalue() + + for k, v in reader.__dict__.items(): + if k == "file": + continue + assert getattr(reader2, k) == v diff --git a/Tests/ttLib/tables/_n_a_m_e_test.py b/Tests/ttLib/tables/_n_a_m_e_test.py index 5f5c965c..c0275e7b 100644 --- a/Tests/ttLib/tables/_n_a_m_e_test.py +++ b/Tests/ttLib/tables/_n_a_m_e_test.py @@ -166,6 +166,20 @@ class NameTableTest(unittest.TestCase): self.assertEqual(nameID, table.findMultilingualName(namesSubSet)) self.assertEqual(None, table.findMultilingualName(namesSuperSet)) + def test_findMultilingualName_compiled(self): + table = table__n_a_m_e() + names, namesSubSet, namesSuperSet = self._get_test_names() + nameID = table.addMultilingualName(names) + assert nameID is not None + # After compile/decompile, name.string is a bytes sequence, which + # findMultilingualName() should also handle + data = table.compile(None) + table = table__n_a_m_e() + table.decompile(data, None) + self.assertEqual(nameID, table.findMultilingualName(names)) + self.assertEqual(nameID, table.findMultilingualName(namesSubSet)) + self.assertEqual(None, table.findMultilingualName(namesSuperSet)) + def test_addMultilingualNameReuse(self): table = table__n_a_m_e() names, namesSubSet, namesSuperSet = self._get_test_names() diff --git a/Tests/varLib/data/test_results/BuildTestCFF2.ttx b/Tests/varLib/data/test_results/BuildTestCFF2.ttx index 29044525..9f7d6388 100644 --- a/Tests/varLib/data/test_results/BuildTestCFF2.ttx +++ b/Tests/varLib/data/test_results/BuildTestCFF2.ttx @@ -27,31 +27,31 @@ <!-- Regular --> <!-- PostScript: TestCFF2Roman-Regular --> - <NamedInstance flags="0x0" postscriptNameID="262" subfamilyNameID="261"> + <NamedInstance flags="0x0" postscriptNameID="261" subfamilyNameID="2"> <coord axis="wght" value="400.0"/> </NamedInstance> <!-- Medium --> <!-- PostScript: TestCFF2Roman-Medium --> - <NamedInstance flags="0x0" postscriptNameID="264" subfamilyNameID="263"> + <NamedInstance flags="0x0" postscriptNameID="263" subfamilyNameID="262"> <coord axis="wght" value="500.0"/> </NamedInstance> <!-- Semibold --> <!-- PostScript: TestCFF2Roman-Semibold --> - <NamedInstance flags="0x0" postscriptNameID="266" subfamilyNameID="265"> + <NamedInstance flags="0x0" postscriptNameID="265" subfamilyNameID="264"> <coord axis="wght" value="600.0"/> </NamedInstance> <!-- Bold --> <!-- PostScript: TestCFF2Roman-Bold --> - <NamedInstance flags="0x0" postscriptNameID="268" subfamilyNameID="267"> + <NamedInstance flags="0x0" postscriptNameID="267" subfamilyNameID="266"> <coord axis="wght" value="700.0"/> </NamedInstance> <!-- Black --> <!-- PostScript: TestCFF2Roman-Black --> - <NamedInstance flags="0x0" postscriptNameID="270" subfamilyNameID="269"> + <NamedInstance flags="0x0" postscriptNameID="269" subfamilyNameID="268"> <coord axis="wght" value="900.0"/> </NamedInstance> </fvar> diff --git a/Tests/varLib/varLib_test.py b/Tests/varLib/varLib_test.py index 5d36d687..42e04bd9 100644 --- a/Tests/varLib/varLib_test.py +++ b/Tests/varLib/varLib_test.py @@ -22,6 +22,9 @@ def reload_font(font): """(De)serialize to get final binary layout.""" buf = BytesIO() font.save(buf) + # Close the font to release filesystem resources so that on Windows the tearDown + # method can successfully remove the temporary directory created during setUp. + font.close() buf.seek(0) return TTFont(buf) |