You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

97 lines
3.7 KiB

from io import BytesIO
import sys
import os
import tempfile
import unittest
from fontTools.misc.textTools import deHexStr
from fontTools.misc.macRes import ResourceReader
# test resource data in DeRez notation
"""
data 'TEST' (128, "name1") { $"4865 6C6C 6F" }; /* Hello */
data 'TEST' (129, "name2") { $"576F 726C 64" }; /* World */
data 'test' (130, "name3") { $"486F 7720 6172 6520 796F 753F" }; /* How are you? */
"""
# the same data, compiled using Rez
# $ /usr/bin/Rez testdata.rez -o compiled
# $ hexdump -v compiled/..namedfork/rsrc
TEST_RSRC_FORK = deHexStr(
"00 00 01 00 00 00 01 22 00 00 00 22 00 00 00 64 " # 0x00000000
"00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 " # 0x00000010
"00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 " # 0x00000020
"00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 " # 0x00000030
"00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 " # 0x00000040
"00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 " # 0x00000050
"00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 " # 0x00000060
"00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 " # 0x00000070
"00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 " # 0x00000080
"00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 " # 0x00000090
"00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 " # 0x000000A0
"00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 " # 0x000000B0
"00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 " # 0x000000C0
"00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 " # 0x000000D0
"00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 " # 0x000000E0
"00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 " # 0x000000F0
"00 00 00 05 48 65 6c 6c 6f 00 00 00 05 57 6f 72 " # 0x00000100
"6c 64 00 00 00 0c 48 6f 77 20 61 72 65 20 79 6f " # 0x00000110
"75 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 " # 0x00000120
"00 00 00 00 00 00 00 00 00 00 00 1c 00 52 00 01 " # 0x00000130
"54 45 53 54 00 01 00 12 74 65 73 74 00 00 00 2a " # 0x00000140
"00 80 00 00 00 00 00 00 00 00 00 00 00 81 00 06 " # 0x00000150
"00 00 00 09 00 00 00 00 00 82 00 0c 00 00 00 12 " # 0x00000160
"00 00 00 00 05 6e 61 6d 65 31 05 6e 61 6d 65 32 " # 0x00000170
"05 6e 61 6d 65 33 " # 0x00000180
)
class ResourceReaderTest(unittest.TestCase):
def test_read_file(self):
infile = BytesIO(TEST_RSRC_FORK)
reader = ResourceReader(infile)
resources = [res for typ in reader.keys() for res in reader[typ]]
self.assertExpected(resources)
def test_read_datafork(self):
with tempfile.NamedTemporaryFile(delete=False) as tmp:
tmp.write(TEST_RSRC_FORK)
try:
reader = ResourceReader(tmp.name)
resources = [res for typ in reader.keys() for res in reader[typ]]
reader.close()
self.assertExpected(resources)
finally:
os.remove(tmp.name)
def test_read_namedfork_rsrc(self):
if sys.platform != 'darwin':
self.skipTest('Not supported on "%s"' % sys.platform)
tmp = tempfile.NamedTemporaryFile(delete=False)
tmp.close()
try:
with open(tmp.name + '/..namedfork/rsrc', 'wb') as fork:
fork.write(TEST_RSRC_FORK)
reader = ResourceReader(tmp.name)
resources = [res for typ in reader.keys() for res in reader[typ]]
reader.close()
self.assertExpected(resources)
finally:
os.remove(tmp.name)
def assertExpected(self, resources):
self.assertRezEqual(resources[0], 'TEST', b'Hello', 128, 'name1')
self.assertRezEqual(resources[1], 'TEST', b'World', 129, 'name2')
self.assertRezEqual(
resources[2], 'test', b'How are you?', 130, 'name3')
def assertRezEqual(self, res, type_, data, id, name):
self.assertEqual(res.type, type_)
self.assertEqual(res.data, data)
self.assertEqual(res.id, id)
self.assertEqual(res.name, name)
if __name__ == '__main__':
sys.exit(unittest.main())