From cdd10373f0c0007d2e89044675337082e3ec509d Mon Sep 17 00:00:00 2001 From: Cosimo Lupo Date: Tue, 19 May 2020 13:19:01 +0100 Subject: [PATCH] sfnt_test: add test for deepcopy and pickle --- Tests/ttLib/sfnt_test.py | 56 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 54 insertions(+), 2 deletions(-) diff --git a/Tests/ttLib/sfnt_test.py b/Tests/ttLib/sfnt_test.py index 917348332..9f8174446 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