Home | History | Annotate | Download | only in tables
      1 from __future__ import print_function, division, absolute_import
      2 from fontTools.misc.py23 import SimpleNamespace
      3 from fontTools.misc.textTools import deHexStr
      4 from fontTools.misc.testTools import getXML
      5 from fontTools.ttLib.tables.T_S_I__0 import table_T_S_I__0
      6 import pytest
      7 
      8 
      9 # (gid, length, offset) for glyph programs
     10 TSI0_INDICES = [
     11     (0, 1, 0),
     12     (1, 5, 1),
     13     (2, 0, 1),
     14     (3, 0, 1),
     15     (4, 8, 6)]
     16 
     17 # (type, length, offset) for 'extra' programs
     18 TSI0_EXTRA_INDICES = [
     19     (0xFFFA, 2, 14),          # ppgm
     20     (0xFFFB, 4, 16),          # cvt
     21     (0xFFFC, 6, 20),          # reserved
     22     (0xFFFD, 10, 26)]         # fpgm
     23 
     24 # compiled TSI0 table from data above
     25 TSI0_DATA = deHexStr(
     26     "0000 0001 00000000"
     27     "0001 0005 00000001"
     28     "0002 0000 00000001"
     29     "0003 0000 00000001"
     30     "0004 0008 00000006"
     31     "FFFE 0000 ABFC1F34"      # 'magic' separates glyph from extra programs
     32     "FFFA 0002 0000000E"
     33     "FFFB 0004 00000010"
     34     "FFFC 0006 00000014"
     35     "FFFD 000A 0000001A")
     36 
     37 # empty font has no glyph programs but 4 extra programs are always present
     38 EMPTY_TSI0_EXTRA_INDICES = [
     39     (0xFFFA, 0, 0),
     40     (0xFFFB, 0, 0),
     41     (0xFFFC, 0, 0),
     42     (0xFFFD, 0, 0)]
     43 
     44 EMPTY_TSI0_DATA = deHexStr(
     45     "FFFE 0000 ABFC1F34"
     46     "FFFA 0000 00000000"
     47     "FFFB 0000 00000000"
     48     "FFFC 0000 00000000"
     49     "FFFD 0000 00000000")
     50 
     51 
     52 @pytest.fixture
     53 def table():
     54     return table_T_S_I__0()
     55 
     56 
     57 @pytest.mark.parametrize(
     58     "numGlyphs, data, expected_indices, expected_extra_indices",
     59     [
     60         (5, TSI0_DATA, TSI0_INDICES, TSI0_EXTRA_INDICES),
     61         (0, EMPTY_TSI0_DATA, [], EMPTY_TSI0_EXTRA_INDICES)
     62     ],
     63     ids=["simple", "empty"]
     64 )
     65 def test_decompile(table, numGlyphs, data, expected_indices,
     66                    expected_extra_indices):
     67     font = {'maxp': SimpleNamespace(numGlyphs=numGlyphs)}
     68 
     69     table.decompile(data, font)
     70 
     71     assert len(table.indices) == numGlyphs
     72     assert table.indices == expected_indices
     73     assert len(table.extra_indices) == 4
     74     assert table.extra_indices == expected_extra_indices
     75 
     76 
     77 @pytest.mark.parametrize(
     78     "numGlyphs, indices, extra_indices, expected_data",
     79     [
     80         (5, TSI0_INDICES, TSI0_EXTRA_INDICES, TSI0_DATA),
     81         (0, [], EMPTY_TSI0_EXTRA_INDICES, EMPTY_TSI0_DATA)
     82     ],
     83     ids=["simple", "empty"]
     84 )
     85 def test_compile(table, numGlyphs, indices, extra_indices, expected_data):
     86     assert table.compile(ttFont=None) == b""
     87 
     88     table.set(indices, extra_indices)
     89     data = table.compile(ttFont=None)
     90     assert data == expected_data
     91 
     92 
     93 def test_set(table):
     94     table.set(TSI0_INDICES, TSI0_EXTRA_INDICES)
     95     assert table.indices == TSI0_INDICES
     96     assert table.extra_indices == TSI0_EXTRA_INDICES
     97 
     98 
     99 def test_toXML(table):
    100     assert getXML(table.toXML, ttFont=None) == [
    101         '<!-- This table will be calculated by the compiler -->']
    102 
    103 
    104 if __name__ == "__main__":
    105     import sys
    106     sys.exit(pytest.main(sys.argv))
    107