xref: /aosp_15_r20/external/fonttools/Tests/ttLib/tables/ttProgram_test.py (revision e1fe3e4ad2793916b15cccdc4a7da52a7e1dd0e9)
1*e1fe3e4aSElliott Hughesfrom fontTools.misc.xmlWriter import XMLWriter
2*e1fe3e4aSElliott Hughesfrom fontTools.ttLib.tables.ttProgram import Program
3*e1fe3e4aSElliott Hughesfrom fontTools.misc.textTools import deHexStr
4*e1fe3e4aSElliott Hughesimport array
5*e1fe3e4aSElliott Hughesfrom io import StringIO
6*e1fe3e4aSElliott Hughesimport os
7*e1fe3e4aSElliott Hughesimport unittest
8*e1fe3e4aSElliott Hughes
9*e1fe3e4aSElliott HughesCURR_DIR = os.path.abspath(os.path.dirname(os.path.realpath(__file__)))
10*e1fe3e4aSElliott HughesDATA_DIR = os.path.join(CURR_DIR, "data")
11*e1fe3e4aSElliott Hughes
12*e1fe3e4aSElliott HughesTTPROGRAM_TTX = os.path.join(DATA_DIR, "ttProgram.ttx")
13*e1fe3e4aSElliott Hughes# TTPROGRAM_BIN = os.path.join(DATA_DIR, "ttProgram.bin")
14*e1fe3e4aSElliott Hughes
15*e1fe3e4aSElliott HughesASSEMBLY = [
16*e1fe3e4aSElliott Hughes    "PUSH[ ]",
17*e1fe3e4aSElliott Hughes    "0 4 3",
18*e1fe3e4aSElliott Hughes    "INSTCTRL[ ]",
19*e1fe3e4aSElliott Hughes    "POP[ ]",
20*e1fe3e4aSElliott Hughes]
21*e1fe3e4aSElliott Hughes
22*e1fe3e4aSElliott HughesBYTECODE = deHexStr(
23*e1fe3e4aSElliott Hughes    "403b3a393837363534333231302f2e2d2c2b2a292827262524232221201f1e1d1c1b1a"
24*e1fe3e4aSElliott Hughes    "191817161514131211100f0e0d0c0b0a090807060504030201002c01b0184358456ab0"
25*e1fe3e4aSElliott Hughes    "194360b0462344231020b0464ef04d2fb000121b21231133592d2c01b0184358b0052b"
26*e1fe3e4aSElliott Hughes    "b000134bb0145058b100403859b0062b1b21231133592d2c01b01843584eb0032510f2"
27*e1fe3e4aSElliott Hughes    "21b000124d1b2045b00425b00425234a6164b0285258212310d61bb0032510f221b000"
28*e1fe3e4aSElliott Hughes    "1259592d2cb01a435821211bb00225b0022549b00325b003254a612064b01050582121"
29*e1fe3e4aSElliott Hughes    "211bb00325b0032549b0005058b0005058b8ffe238211bb0103821591bb0005258b01e"
30*e1fe3e4aSElliott Hughes    "38211bb8fff03821595959592d2c01b0184358b0052bb000134bb0145058b90000ffc0"
31*e1fe3e4aSElliott Hughes    "3859b0062b1b21231133592d2c4e018a10b146194344b00014b10046e2b00015b90000"
32*e1fe3e4aSElliott Hughes    "fff03800b0003cb0282bb0022510b0003c2d2c0118b0002fb00114f2b00113b001154d"
33*e1fe3e4aSElliott Hughes    "b000122d2c01b0184358b0052bb00013b90000ffe038b0062b1b21231133592d2c01b0"
34*e1fe3e4aSElliott Hughes    "18435845646a23456469b01943646060b0462344231020b046f02fb000121b2121208a"
35*e1fe3e4aSElliott Hughes    "208a525811331b212159592d2c01b10b0a432343650a2d2c00b10a0b4323430b2d2c00"
36*e1fe3e4aSElliott Hughes    "b0462370b101463e01b0462370b10246453ab10200080d2d2cb0122bb0022545b00225"
37*e1fe3e4aSElliott Hughes    "456ab0408b60b0022523442121212d2cb0132bb0022545b00225456ab8ffc08c60b002"
38*e1fe3e4aSElliott Hughes    "2523442121212d2cb000b0122b2121212d2cb000b0132b2121212d2c01b00643b00743"
39*e1fe3e4aSElliott Hughes    "650a2d2c2069b04061b0008b20b12cc08a8cb8100062602b0c642364615c58b0036159"
40*e1fe3e4aSElliott Hughes    "2d2cb1000325456854b01c4b505a58b0032545b0032545606820b004252344b0042523"
41*e1fe3e4aSElliott Hughes    "441bb00325204568208a2344b00325456860b003252344592d2cb00325204568208a23"
42*e1fe3e4aSElliott Hughes    "44b003254564686560b00425b0016023442d2cb00943588721c01bb01243588745b011"
43*e1fe3e4aSElliott Hughes    "2bb0472344b0477ae41b038a45186920b04723448a8a8720b0a05158b0112bb0472344"
44*e1fe3e4aSElliott Hughes    "b0477ae41b21b0477ae4595959182d2c208a4523456860442d2c456a422d2c01182f2d"
45*e1fe3e4aSElliott Hughes    "2c01b0184358b00425b00425496423456469b0408b6120b080626ab00225b00225618c"
46*e1fe3e4aSElliott Hughes    "b0194360b0462344218a10b046f6211b21212121592d2c01b0184358b0022545b00225"
47*e1fe3e4aSElliott Hughes    "4564606ab00325456a6120b00425456a208a8b65b0042523448cb00325234421211b20"
48*e1fe3e4aSElliott Hughes    "456a4420456a44592d2c012045b00055b018435a584568234569b0408b6120b080626a"
49*e1fe3e4aSElliott Hughes    "208a236120b003258b65b0042523448cb00325234421211b2121b0192b592d2c018a8a"
50*e1fe3e4aSElliott Hughes    "45642345646164422d2cb00425b00425b0192bb0184358b00425b00425b00325b01b2b"
51*e1fe3e4aSElliott Hughes    "01b0022543b04054b0022543b000545a58b003252045b040614459b0022543b00054b0"
52*e1fe3e4aSElliott Hughes    "022543b040545a58b004252045b04060445959212121212d2c014b525843b002254523"
53*e1fe3e4aSElliott Hughes    "61441b2121592d2c014b525843b00225452360441b2121592d2c4b525845441b212159"
54*e1fe3e4aSElliott Hughes    "2d2c0120b003252349b04060b0206320b000525823b002253823b002256538008a6338"
55*e1fe3e4aSElliott Hughes    "1b212121212159012d2c4b505845441b2121592d2c01b005251023208af500b0016023"
56*e1fe3e4aSElliott Hughes    "edec2d2c01b005251023208af500b0016123edec2d2c01b0062510f500edec2d2c4623"
57*e1fe3e4aSElliott Hughes    "46608a8a462320468a608a61b8ff8062232010238ab14b4b8a70456020b0005058b001"
58*e1fe3e4aSElliott Hughes    "61b8ffba8b1bb0468c59b0106068013a2d2c2045b00325465258b0022546206861b003"
59*e1fe3e4aSElliott Hughes    "25b003253f2321381b2111592d2c2045b00325465058b0022546206861b00325b00325"
60*e1fe3e4aSElliott Hughes    "3f2321381b2111592d2c00b00743b006430b2d2c8a10ec2d2cb00c4358211b2046b000"
61*e1fe3e4aSElliott Hughes    "5258b8fff0381bb0103859592d2c20b0005558b8100063b003254564b00325456461b0"
62*e1fe3e4aSElliott Hughes    "005358b0021bb04061b00359254569535845441b2121591b21b0022545b00225456164"
63*e1fe3e4aSElliott Hughes    "b028515845441b212159592d2c21210c6423648bb84000622d2c21b08051580c642364"
64*e1fe3e4aSElliott Hughes    "8bb82000621bb200402f2b59b002602d2c21b0c051580c6423648bb81555621bb20080"
65*e1fe3e4aSElliott Hughes    "2f2b59b002602d2c0c6423648bb84000626023212d2c4b5358b00425b0042549642345"
66*e1fe3e4aSElliott Hughes    "6469b0408b6120b080626ab00225b00225618cb0462344218a10b046f6211b218a1123"
67*e1fe3e4aSElliott Hughes    "1220392f592d2cb00225b002254964b0c05458b8fff838b008381b2121592d2cb01343"
68*e1fe3e4aSElliott Hughes    "58031b02592d2cb0134358021b03592d2cb00a2b2310203cb0172b2d2cb00225b8fff0"
69*e1fe3e4aSElliott Hughes    "38b0282b8a102320d023b0102bb0054358c01b3c59201011b00012012d2c4b53234b51"
70*e1fe3e4aSElliott Hughes    "5a58381b2121592d2c01b0022510d023c901b00113b0001410b0013cb001162d2c01b0"
71*e1fe3e4aSElliott Hughes    "0013b001b0032549b0031738b001132d2c4b53234b515a5820458a60441b2121592d2c"
72*e1fe3e4aSElliott Hughes    "20392f2d"
73*e1fe3e4aSElliott Hughes)
74*e1fe3e4aSElliott Hughes
75*e1fe3e4aSElliott Hughes
76*e1fe3e4aSElliott Hughesclass TestFont(object):
77*e1fe3e4aSElliott Hughes    disassembleInstructions = True
78*e1fe3e4aSElliott Hughes
79*e1fe3e4aSElliott Hughes
80*e1fe3e4aSElliott Hughesclass ProgramTest(unittest.TestCase):
81*e1fe3e4aSElliott Hughes    def test__bool__(self):
82*e1fe3e4aSElliott Hughes        p = Program()
83*e1fe3e4aSElliott Hughes        assert not bool(p)
84*e1fe3e4aSElliott Hughes
85*e1fe3e4aSElliott Hughes        bc = array.array("B", [0])
86*e1fe3e4aSElliott Hughes        p.fromBytecode(bc)
87*e1fe3e4aSElliott Hughes        assert bool(p)
88*e1fe3e4aSElliott Hughes
89*e1fe3e4aSElliott Hughes        assert p.bytecode.pop() == 0
90*e1fe3e4aSElliott Hughes        assert not bool(p)
91*e1fe3e4aSElliott Hughes
92*e1fe3e4aSElliott Hughes        p = Program()
93*e1fe3e4aSElliott Hughes        asm = ["SVTCA[0]"]
94*e1fe3e4aSElliott Hughes        p.fromAssembly(asm)
95*e1fe3e4aSElliott Hughes        assert bool(p)
96*e1fe3e4aSElliott Hughes
97*e1fe3e4aSElliott Hughes        assert p.assembly.pop() == "SVTCA[0]"
98*e1fe3e4aSElliott Hughes        assert not bool(p)
99*e1fe3e4aSElliott Hughes
100*e1fe3e4aSElliott Hughes    def test_from_assembly_list(self):
101*e1fe3e4aSElliott Hughes        p = Program()
102*e1fe3e4aSElliott Hughes        p.fromAssembly(ASSEMBLY)
103*e1fe3e4aSElliott Hughes        asm = p.getAssembly()
104*e1fe3e4aSElliott Hughes        assert ASSEMBLY == asm
105*e1fe3e4aSElliott Hughes
106*e1fe3e4aSElliott Hughes    def test_from_assembly_str(self):
107*e1fe3e4aSElliott Hughes        p = Program()
108*e1fe3e4aSElliott Hughes        p.fromAssembly("\n".join(ASSEMBLY))
109*e1fe3e4aSElliott Hughes        asm = p.getAssembly()
110*e1fe3e4aSElliott Hughes        assert ASSEMBLY == asm
111*e1fe3e4aSElliott Hughes
112*e1fe3e4aSElliott Hughes    def test_roundtrip(self):
113*e1fe3e4aSElliott Hughes        p = Program()
114*e1fe3e4aSElliott Hughes        p.fromBytecode(BYTECODE)
115*e1fe3e4aSElliott Hughes        asm = p.getAssembly(preserve=True)
116*e1fe3e4aSElliott Hughes        p.fromAssembly(asm)
117*e1fe3e4aSElliott Hughes        assert BYTECODE == p.getBytecode()
118*e1fe3e4aSElliott Hughes
119*e1fe3e4aSElliott Hughes    def test_xml_indentation(self):
120*e1fe3e4aSElliott Hughes        with open(TTPROGRAM_TTX, "r", encoding="utf-8") as f:
121*e1fe3e4aSElliott Hughes            ttProgramXML = f.read()
122*e1fe3e4aSElliott Hughes        p = Program()
123*e1fe3e4aSElliott Hughes        p.fromBytecode(BYTECODE)
124*e1fe3e4aSElliott Hughes        ttfont = TestFont()
125*e1fe3e4aSElliott Hughes        buf = StringIO()
126*e1fe3e4aSElliott Hughes        writer = XMLWriter(buf)
127*e1fe3e4aSElliott Hughes        try:
128*e1fe3e4aSElliott Hughes            p.toXML(writer, ttfont)
129*e1fe3e4aSElliott Hughes        finally:
130*e1fe3e4aSElliott Hughes            output_string = buf.getvalue()
131*e1fe3e4aSElliott Hughes        assert output_string == ttProgramXML
132*e1fe3e4aSElliott Hughes
133*e1fe3e4aSElliott Hughes
134*e1fe3e4aSElliott Hughesif __name__ == "__main__":
135*e1fe3e4aSElliott Hughes    import sys
136*e1fe3e4aSElliott Hughes
137*e1fe3e4aSElliott Hughes    sys.exit(unittest.main())
138