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