1import io 2import copy 3import pickle 4from fontTools.ttLib.sfnt import calcChecksum, SFNTReader 5import pytest 6 7 8def test_calcChecksum(): 9 assert calcChecksum(b"abcd") == 1633837924 10 assert calcChecksum(b"abcdxyz") == 3655064932 11 12 13EMPTY_SFNT = b"\x00\x01\x00\x00" + b"\x00" * 8 14 15 16def pickle_unpickle(obj): 17 return pickle.loads(pickle.dumps(obj)) 18 19 20class SFNTReaderTest: 21 @pytest.mark.parametrize("deepcopy", [copy.deepcopy, pickle_unpickle]) 22 def test_pickle_protocol_FileIO(self, deepcopy, tmp_path): 23 fontfile = tmp_path / "test.ttf" 24 fontfile.write_bytes(EMPTY_SFNT) 25 reader = SFNTReader(fontfile.open("rb")) 26 27 reader2 = deepcopy(reader) 28 29 assert reader2 is not reader 30 assert reader2.file is not reader.file 31 32 assert isinstance(reader2.file, io.BufferedReader) 33 assert isinstance(reader2.file.raw, io.FileIO) 34 assert reader2.file.name == reader.file.name 35 assert reader2.file.tell() == reader.file.tell() 36 37 for k, v in reader.__dict__.items(): 38 if k == "file": 39 continue 40 assert getattr(reader2, k) == v 41 42 @pytest.mark.parametrize("deepcopy", [copy.deepcopy, pickle_unpickle]) 43 def test_pickle_protocol_BytesIO(self, deepcopy, tmp_path): 44 buf = io.BytesIO(EMPTY_SFNT) 45 reader = SFNTReader(buf) 46 47 reader2 = deepcopy(reader) 48 49 assert reader2 is not reader 50 assert reader2.file is not reader.file 51 52 assert isinstance(reader2.file, io.BytesIO) 53 assert reader2.file.tell() == reader.file.tell() 54 assert reader2.file.getvalue() == reader.file.getvalue() 55 56 for k, v in reader.__dict__.items(): 57 if k == "file": 58 continue 59 assert getattr(reader2, k) == v 60