xref: /aosp_15_r20/external/fonttools/Tests/misc/macRes_test.py (revision e1fe3e4ad2793916b15cccdc4a7da52a7e1dd0e9)
1*e1fe3e4aSElliott Hughesfrom io import BytesIO
2*e1fe3e4aSElliott Hughesimport sys
3*e1fe3e4aSElliott Hughesimport os
4*e1fe3e4aSElliott Hughesimport tempfile
5*e1fe3e4aSElliott Hughesimport unittest
6*e1fe3e4aSElliott Hughesfrom fontTools.misc.textTools import deHexStr
7*e1fe3e4aSElliott Hughesfrom fontTools.misc.macRes import ResourceReader
8*e1fe3e4aSElliott Hughes
9*e1fe3e4aSElliott Hughes
10*e1fe3e4aSElliott Hughes# test resource data in DeRez notation
11*e1fe3e4aSElliott Hughes"""
12*e1fe3e4aSElliott Hughesdata 'TEST' (128, "name1") { $"4865 6C6C 6F" };                   /* Hello */
13*e1fe3e4aSElliott Hughesdata 'TEST' (129, "name2") { $"576F 726C 64" };                   /* World */
14*e1fe3e4aSElliott Hughesdata 'test' (130, "name3") { $"486F 7720 6172 6520 796F 753F" };  /* How are you? */
15*e1fe3e4aSElliott Hughes"""
16*e1fe3e4aSElliott Hughes# the same data, compiled using Rez
17*e1fe3e4aSElliott Hughes# $ /usr/bin/Rez testdata.rez -o compiled
18*e1fe3e4aSElliott Hughes# $ hexdump -v compiled/..namedfork/rsrc
19*e1fe3e4aSElliott HughesTEST_RSRC_FORK = deHexStr(
20*e1fe3e4aSElliott Hughes    "00 00 01 00 00 00 01 22 00 00 00 22 00 00 00 64 "  # 0x00000000
21*e1fe3e4aSElliott Hughes    "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "  # 0x00000010
22*e1fe3e4aSElliott Hughes    "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "  # 0x00000020
23*e1fe3e4aSElliott Hughes    "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "  # 0x00000030
24*e1fe3e4aSElliott Hughes    "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "  # 0x00000040
25*e1fe3e4aSElliott Hughes    "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "  # 0x00000050
26*e1fe3e4aSElliott Hughes    "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "  # 0x00000060
27*e1fe3e4aSElliott Hughes    "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "  # 0x00000070
28*e1fe3e4aSElliott Hughes    "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "  # 0x00000080
29*e1fe3e4aSElliott Hughes    "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "  # 0x00000090
30*e1fe3e4aSElliott Hughes    "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "  # 0x000000A0
31*e1fe3e4aSElliott Hughes    "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "  # 0x000000B0
32*e1fe3e4aSElliott Hughes    "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "  # 0x000000C0
33*e1fe3e4aSElliott Hughes    "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "  # 0x000000D0
34*e1fe3e4aSElliott Hughes    "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "  # 0x000000E0
35*e1fe3e4aSElliott Hughes    "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "  # 0x000000F0
36*e1fe3e4aSElliott Hughes    "00 00 00 05 48 65 6c 6c 6f 00 00 00 05 57 6f 72 "  # 0x00000100
37*e1fe3e4aSElliott Hughes    "6c 64 00 00 00 0c 48 6f 77 20 61 72 65 20 79 6f "  # 0x00000110
38*e1fe3e4aSElliott Hughes    "75 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "  # 0x00000120
39*e1fe3e4aSElliott Hughes    "00 00 00 00 00 00 00 00 00 00 00 1c 00 52 00 01 "  # 0x00000130
40*e1fe3e4aSElliott Hughes    "54 45 53 54 00 01 00 12 74 65 73 74 00 00 00 2a "  # 0x00000140
41*e1fe3e4aSElliott Hughes    "00 80 00 00 00 00 00 00 00 00 00 00 00 81 00 06 "  # 0x00000150
42*e1fe3e4aSElliott Hughes    "00 00 00 09 00 00 00 00 00 82 00 0c 00 00 00 12 "  # 0x00000160
43*e1fe3e4aSElliott Hughes    "00 00 00 00 05 6e 61 6d 65 31 05 6e 61 6d 65 32 "  # 0x00000170
44*e1fe3e4aSElliott Hughes    "05 6e 61 6d 65 33                               "  # 0x00000180
45*e1fe3e4aSElliott Hughes)
46*e1fe3e4aSElliott Hughes
47*e1fe3e4aSElliott Hughes
48*e1fe3e4aSElliott Hughesclass ResourceReaderTest(unittest.TestCase):
49*e1fe3e4aSElliott Hughes    def test_read_file(self):
50*e1fe3e4aSElliott Hughes        infile = BytesIO(TEST_RSRC_FORK)
51*e1fe3e4aSElliott Hughes        reader = ResourceReader(infile)
52*e1fe3e4aSElliott Hughes        resources = [res for typ in reader.keys() for res in reader[typ]]
53*e1fe3e4aSElliott Hughes        self.assertExpected(resources)
54*e1fe3e4aSElliott Hughes
55*e1fe3e4aSElliott Hughes    def test_read_datafork(self):
56*e1fe3e4aSElliott Hughes        with tempfile.NamedTemporaryFile(delete=False) as tmp:
57*e1fe3e4aSElliott Hughes            tmp.write(TEST_RSRC_FORK)
58*e1fe3e4aSElliott Hughes        try:
59*e1fe3e4aSElliott Hughes            reader = ResourceReader(tmp.name)
60*e1fe3e4aSElliott Hughes            resources = [res for typ in reader.keys() for res in reader[typ]]
61*e1fe3e4aSElliott Hughes            reader.close()
62*e1fe3e4aSElliott Hughes            self.assertExpected(resources)
63*e1fe3e4aSElliott Hughes        finally:
64*e1fe3e4aSElliott Hughes            os.remove(tmp.name)
65*e1fe3e4aSElliott Hughes
66*e1fe3e4aSElliott Hughes    def test_read_namedfork_rsrc(self):
67*e1fe3e4aSElliott Hughes        if sys.platform != "darwin":
68*e1fe3e4aSElliott Hughes            self.skipTest('Not supported on "%s"' % sys.platform)
69*e1fe3e4aSElliott Hughes        tmp = tempfile.NamedTemporaryFile(delete=False)
70*e1fe3e4aSElliott Hughes        tmp.close()
71*e1fe3e4aSElliott Hughes        try:
72*e1fe3e4aSElliott Hughes            with open(tmp.name + "/..namedfork/rsrc", "wb") as fork:
73*e1fe3e4aSElliott Hughes                fork.write(TEST_RSRC_FORK)
74*e1fe3e4aSElliott Hughes            reader = ResourceReader(tmp.name)
75*e1fe3e4aSElliott Hughes            resources = [res for typ in reader.keys() for res in reader[typ]]
76*e1fe3e4aSElliott Hughes            reader.close()
77*e1fe3e4aSElliott Hughes            self.assertExpected(resources)
78*e1fe3e4aSElliott Hughes        finally:
79*e1fe3e4aSElliott Hughes            os.remove(tmp.name)
80*e1fe3e4aSElliott Hughes
81*e1fe3e4aSElliott Hughes    def assertExpected(self, resources):
82*e1fe3e4aSElliott Hughes        self.assertRezEqual(resources[0], "TEST", b"Hello", 128, "name1")
83*e1fe3e4aSElliott Hughes        self.assertRezEqual(resources[1], "TEST", b"World", 129, "name2")
84*e1fe3e4aSElliott Hughes        self.assertRezEqual(resources[2], "test", b"How are you?", 130, "name3")
85*e1fe3e4aSElliott Hughes
86*e1fe3e4aSElliott Hughes    def assertRezEqual(self, res, type_, data, id, name):
87*e1fe3e4aSElliott Hughes        self.assertEqual(res.type, type_)
88*e1fe3e4aSElliott Hughes        self.assertEqual(res.data, data)
89*e1fe3e4aSElliott Hughes        self.assertEqual(res.id, id)
90*e1fe3e4aSElliott Hughes        self.assertEqual(res.name, name)
91*e1fe3e4aSElliott Hughes
92*e1fe3e4aSElliott Hughes
93*e1fe3e4aSElliott Hughesif __name__ == "__main__":
94*e1fe3e4aSElliott Hughes    sys.exit(unittest.main())
95