from types import SimpleNamespace
from fontTools.misc.textTools import deHexStr
from fontTools.misc.testTools import getXML
from fontTools.ttLib.tables.T_S_I__0 import table_T_S_I__0
import pytest


# (gid, length, offset) for glyph programs
TSI0_INDICES = [
    (0, 1, 0),
    (1, 5, 1),
    (2, 0, 1),
    (3, 0, 1),
    (4, 8, 6)]

# (type, length, offset) for 'extra' programs
TSI0_EXTRA_INDICES = [
    (0xFFFA, 2, 14),          # ppgm
    (0xFFFB, 4, 16),          # cvt
    (0xFFFC, 6, 20),          # reserved
    (0xFFFD, 10, 26)]         # fpgm

# compiled TSI0 table from data above
TSI0_DATA = deHexStr(
    "0000 0001 00000000"
    "0001 0005 00000001"
    "0002 0000 00000001"
    "0003 0000 00000001"
    "0004 0008 00000006"
    "FFFE 0000 ABFC1F34"      # 'magic' separates glyph from extra programs
    "FFFA 0002 0000000E"
    "FFFB 0004 00000010"
    "FFFC 0006 00000014"
    "FFFD 000A 0000001A")

# empty font has no glyph programs but 4 extra programs are always present
EMPTY_TSI0_EXTRA_INDICES = [
    (0xFFFA, 0, 0),
    (0xFFFB, 0, 0),
    (0xFFFC, 0, 0),
    (0xFFFD, 0, 0)]

EMPTY_TSI0_DATA = deHexStr(
    "FFFE 0000 ABFC1F34"
    "FFFA 0000 00000000"
    "FFFB 0000 00000000"
    "FFFC 0000 00000000"
    "FFFD 0000 00000000")


@pytest.fixture
def table():
    return table_T_S_I__0()


@pytest.mark.parametrize(
    "numGlyphs, data, expected_indices, expected_extra_indices",
    [
        (5, TSI0_DATA, TSI0_INDICES, TSI0_EXTRA_INDICES),
        (0, EMPTY_TSI0_DATA, [], EMPTY_TSI0_EXTRA_INDICES)
    ],
    ids=["simple", "empty"]
)
def test_decompile(table, numGlyphs, data, expected_indices,
                   expected_extra_indices):
    font = {'maxp': SimpleNamespace(numGlyphs=numGlyphs)}

    table.decompile(data, font)

    assert len(table.indices) == numGlyphs
    assert table.indices == expected_indices
    assert len(table.extra_indices) == 4
    assert table.extra_indices == expected_extra_indices


@pytest.mark.parametrize(
    "numGlyphs, indices, extra_indices, expected_data",
    [
        (5, TSI0_INDICES, TSI0_EXTRA_INDICES, TSI0_DATA),
        (0, [], EMPTY_TSI0_EXTRA_INDICES, EMPTY_TSI0_DATA)
    ],
    ids=["simple", "empty"]
)
def test_compile(table, numGlyphs, indices, extra_indices, expected_data):
    assert table.compile(ttFont=None) == b""

    table.set(indices, extra_indices)
    data = table.compile(ttFont=None)
    assert data == expected_data


def test_set(table):
    table.set(TSI0_INDICES, TSI0_EXTRA_INDICES)
    assert table.indices == TSI0_INDICES
    assert table.extra_indices == TSI0_EXTRA_INDICES


def test_toXML(table):
    assert getXML(table.toXML, ttFont=None) == [
        '<!-- This table will be calculated by the compiler -->']


if __name__ == "__main__":
    import sys
    sys.exit(pytest.main(sys.argv))
