from __future__ import print_function, division, absolute_import, unicode_literals
from fontTools.misc.py23 import *
from fontTools.misc.testTools import FakeFont, getXML, parseXML
from fontTools.misc.textTools import deHexStr, hexStr
from fontTools.ttLib import newTable
import unittest


# Apple's spec of the baseline table gives no example for 'bsln' format 0,
# but the Apple Chancery font contains the following data.
BSLN_FORMAT_0_DATA = deHexStr(
    '0001 0000 0000 '       #  0: Version=1.0, Format=0
    '0000 '                 #  6: DefaultBaseline=0 (Roman baseline)
    '0000 01D1 0000 0541 '  #  8: Delta[0..3]=0, 465, 0, 1345
    '01FB 0000 0000 0000 '  # 16: Delta[4..7]=507, 0, 0, 0
    '0000 0000 0000 0000 '  # 24: Delta[8..11]=0, 0, 0, 0
    '0000 0000 0000 0000 '  # 32: Delta[12..15]=0, 0, 0, 0
    '0000 0000 0000 0000 '  # 40: Delta[16..19]=0, 0, 0, 0
    '0000 0000 0000 0000 '  # 48: Delta[20..23]=0, 0, 0, 0
    '0000 0000 0000 0000 '  # 56: Delta[24..27]=0, 0, 0, 0
    '0000 0000 0000 0000 '  # 64: Delta[28..31]=0, 0, 0, 0
)                           # 72: <end>
assert len(BSLN_FORMAT_0_DATA) == 72


BSLN_FORMAT_0_XML = [
    '<Version value="0x00010000"/>',
    '<Baseline Format="0">',
    '  <DefaultBaseline value="0"/>',
    '  <Delta index="0" value="0"/>',
    '  <Delta index="1" value="465"/>',
    '  <Delta index="2" value="0"/>',
    '  <Delta index="3" value="1345"/>',
    '  <Delta index="4" value="507"/>',
    '  <Delta index="5" value="0"/>',
    '  <Delta index="6" value="0"/>',
    '  <Delta index="7" value="0"/>',
    '  <Delta index="8" value="0"/>',
    '  <Delta index="9" value="0"/>',
    '  <Delta index="10" value="0"/>',
    '  <Delta index="11" value="0"/>',
    '  <Delta index="12" value="0"/>',
    '  <Delta index="13" value="0"/>',
    '  <Delta index="14" value="0"/>',
    '  <Delta index="15" value="0"/>',
    '  <Delta index="16" value="0"/>',
    '  <Delta index="17" value="0"/>',
    '  <Delta index="18" value="0"/>',
    '  <Delta index="19" value="0"/>',
    '  <Delta index="20" value="0"/>',
    '  <Delta index="21" value="0"/>',
    '  <Delta index="22" value="0"/>',
    '  <Delta index="23" value="0"/>',
    '  <Delta index="24" value="0"/>',
    '  <Delta index="25" value="0"/>',
    '  <Delta index="26" value="0"/>',
    '  <Delta index="27" value="0"/>',
    '  <Delta index="28" value="0"/>',
    '  <Delta index="29" value="0"/>',
    '  <Delta index="30" value="0"/>',
    '  <Delta index="31" value="0"/>',
    '</Baseline>',
]


# Example: Format 1 Baseline Table
# https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6bsln.html
# The example in the AAT specification uses the value 270 for Seg[0].LastGlyph,
# whereas we use the value 10 for testng to shorten the XML dump.
BSLN_FORMAT_1_DATA = deHexStr(
    '0001 0000 0001 '       #  0: Version=1.0, Format=1
    '0001 '                 #  6: DefaultBaseline=1 (Ideographic baseline)
    '0000 0357 0000 05F0 '  #  8: Delta[0..3]=0, 855, 0, 1520
    '0000 0000 0000 0000 '  # 16: Delta[4..7]=0, 0, 0, 0
    '0000 0000 0000 0000 '  # 24: Delta[8..11]=0, 0, 0, 0
    '0000 0000 0000 0000 '  # 32: Delta[12..15]=0, 0, 0, 0
    '0000 0000 0000 0000 '  # 40: Delta[16..19]=0, 0, 0, 0
    '0000 0000 0000 0000 '  # 48: Delta[20..23]=0, 0, 0, 0
    '0000 0000 0000 0000 '  # 56: Delta[24..27]=0, 0, 0, 0
    '0000 0000 0000 0000 '  # 64: Delta[28..31]=0, 0, 0, 0
    '0002 0006 0001 '       # 72: LookupFormat=2, UnitSize=6, NUnits=1
    '0006 0000 0000 '       # 78: SearchRange=6, EntrySelector=0, RangeShift=0
    '000A 0002 0000 '       # 84: Seg[0].LastGlyph=10 FirstGl=2 Value=0/Roman
    'FFFF FFFF 0000 '       # 90: Seg[1]=<end>
)                           # 96: <end>
assert len(BSLN_FORMAT_1_DATA) == 96


BSLN_FORMAT_1_XML = [
    '<Version value="0x00010000"/>',
    '<Baseline Format="1">',
    '  <DefaultBaseline value="1"/>',
    '  <Delta index="0" value="0"/>',
    '  <Delta index="1" value="855"/>',
    '  <Delta index="2" value="0"/>',
    '  <Delta index="3" value="1520"/>',
    '  <Delta index="4" value="0"/>',
    '  <Delta index="5" value="0"/>',
    '  <Delta index="6" value="0"/>',
    '  <Delta index="7" value="0"/>',
    '  <Delta index="8" value="0"/>',
    '  <Delta index="9" value="0"/>',
    '  <Delta index="10" value="0"/>',
    '  <Delta index="11" value="0"/>',
    '  <Delta index="12" value="0"/>',
    '  <Delta index="13" value="0"/>',
    '  <Delta index="14" value="0"/>',
    '  <Delta index="15" value="0"/>',
    '  <Delta index="16" value="0"/>',
    '  <Delta index="17" value="0"/>',
    '  <Delta index="18" value="0"/>',
    '  <Delta index="19" value="0"/>',
    '  <Delta index="20" value="0"/>',
    '  <Delta index="21" value="0"/>',
    '  <Delta index="22" value="0"/>',
    '  <Delta index="23" value="0"/>',
    '  <Delta index="24" value="0"/>',
    '  <Delta index="25" value="0"/>',
    '  <Delta index="26" value="0"/>',
    '  <Delta index="27" value="0"/>',
    '  <Delta index="28" value="0"/>',
    '  <Delta index="29" value="0"/>',
    '  <Delta index="30" value="0"/>',
    '  <Delta index="31" value="0"/>',
    '  <BaselineValues>',
    '    <Lookup glyph="B" value="0"/>',
    '    <Lookup glyph="C" value="0"/>',
    '    <Lookup glyph="D" value="0"/>',
    '    <Lookup glyph="E" value="0"/>',
    '    <Lookup glyph="F" value="0"/>',
    '    <Lookup glyph="G" value="0"/>',
    '    <Lookup glyph="H" value="0"/>',
    '    <Lookup glyph="I" value="0"/>',
    '    <Lookup glyph="J" value="0"/>',
    '  </BaselineValues>',
    '</Baseline>',
]


BSLN_FORMAT_2_DATA = deHexStr(
    '0001 0000 0002 '       #  0: Version=1.0, Format=2
    '0004 '                 #  6: DefaultBaseline=4 (Math)
    '0016 '                 #  8: StandardGlyph=22
    '0050 0051 FFFF 0052 '  # 10: ControlPoint[0..3]=80, 81, <none>, 82
    'FFFF FFFF FFFF FFFF '  # 18: ControlPoint[4..7]=<none>
    'FFFF FFFF FFFF FFFF '  # 26: ControlPoint[8..11]=<none>
    'FFFF FFFF FFFF FFFF '  # 34: ControlPoint[12..15]=<none>
    'FFFF FFFF FFFF FFFF '  # 42: ControlPoint[16..19]=<none>
    'FFFF FFFF FFFF FFFF '  # 50: ControlPoint[20..23]=<none>
    'FFFF FFFF FFFF FFFF '  # 58: ControlPoint[24..27]=<none>
    'FFFF FFFF FFFF FFFF '  # 66: ControlPoint[28..31]=<none>
)                           # 74: <end>
assert len(BSLN_FORMAT_2_DATA) == 74


BSLN_FORMAT_2_XML = [
    '<Version value="0x00010000"/>',
    '<Baseline Format="2">',
    '  <DefaultBaseline value="4"/>',
    '  <StandardGlyph value="V"/>',
    '  <ControlPoint index="0" value="80"/>',
    '  <ControlPoint index="1" value="81"/>',
    '  <ControlPoint index="2" value="65535"/>',
    '  <ControlPoint index="3" value="82"/>',
    '  <ControlPoint index="4" value="65535"/>',
    '  <ControlPoint index="5" value="65535"/>',
    '  <ControlPoint index="6" value="65535"/>',
    '  <ControlPoint index="7" value="65535"/>',
    '  <ControlPoint index="8" value="65535"/>',
    '  <ControlPoint index="9" value="65535"/>',
    '  <ControlPoint index="10" value="65535"/>',
    '  <ControlPoint index="11" value="65535"/>',
    '  <ControlPoint index="12" value="65535"/>',
    '  <ControlPoint index="13" value="65535"/>',
    '  <ControlPoint index="14" value="65535"/>',
    '  <ControlPoint index="15" value="65535"/>',
    '  <ControlPoint index="16" value="65535"/>',
    '  <ControlPoint index="17" value="65535"/>',
    '  <ControlPoint index="18" value="65535"/>',
    '  <ControlPoint index="19" value="65535"/>',
    '  <ControlPoint index="20" value="65535"/>',
    '  <ControlPoint index="21" value="65535"/>',
    '  <ControlPoint index="22" value="65535"/>',
    '  <ControlPoint index="23" value="65535"/>',
    '  <ControlPoint index="24" value="65535"/>',
    '  <ControlPoint index="25" value="65535"/>',
    '  <ControlPoint index="26" value="65535"/>',
    '  <ControlPoint index="27" value="65535"/>',
    '  <ControlPoint index="28" value="65535"/>',
    '  <ControlPoint index="29" value="65535"/>',
    '  <ControlPoint index="30" value="65535"/>',
    '  <ControlPoint index="31" value="65535"/>',
    '</Baseline>',
]


# Example: Format 3 Baseline Table
# https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6bsln.html
# The example in the AAT specification uses the value 270 for Seg[0].LastGlyph,
# whereas we use the value 10 for testng to shorten the XML dump.
BSLN_FORMAT_3_DATA = deHexStr(
    '0001 0000 0003 '       #  0: Version=1.0, Format=3
    '0001 '                 #  6: DefaultBaseline=1 (Ideographic)
    '0016 '                 #  8: StandardGlyph=22
    '0050 0051 FFFF 0052 '  # 10: ControlPoint[0..3]=80, 81, <none>, 82
    'FFFF FFFF FFFF FFFF '  # 18: ControlPoint[4..7]=<none>
    'FFFF FFFF FFFF FFFF '  # 26: ControlPoint[8..11]=<none>
    'FFFF FFFF FFFF FFFF '  # 34: ControlPoint[12..15]=<none>
    'FFFF FFFF FFFF FFFF '  # 42: ControlPoint[16..19]=<none>
    'FFFF FFFF FFFF FFFF '  # 50: ControlPoint[20..23]=<none>
    'FFFF FFFF FFFF FFFF '  # 58: ControlPoint[24..27]=<none>
    'FFFF FFFF FFFF FFFF '  # 66: ControlPoint[28..31]=<none>
    '0002 0006 0001 '       # 74: LookupFormat=2, UnitSize=6, NUnits=1
    '0006 0000 0000 '       # 80: SearchRange=6, EntrySelector=0, RangeShift=0
    '000A 0002 0000 '       # 86: Seg[0].LastGlyph=10 FirstGl=2 Value=0/Roman
    'FFFF FFFF 0000 '       # 92: Seg[1]=<end>
)                           # 98: <end>
assert len(BSLN_FORMAT_3_DATA) == 98


BSLN_FORMAT_3_XML = [
    '<Version value="0x00010000"/>',
    '<Baseline Format="3">',
    '  <DefaultBaseline value="1"/>',
    '  <StandardGlyph value="V"/>',
    '  <ControlPoint index="0" value="80"/>',
    '  <ControlPoint index="1" value="81"/>',
    '  <ControlPoint index="2" value="65535"/>',
    '  <ControlPoint index="3" value="82"/>',
    '  <ControlPoint index="4" value="65535"/>',
    '  <ControlPoint index="5" value="65535"/>',
    '  <ControlPoint index="6" value="65535"/>',
    '  <ControlPoint index="7" value="65535"/>',
    '  <ControlPoint index="8" value="65535"/>',
    '  <ControlPoint index="9" value="65535"/>',
    '  <ControlPoint index="10" value="65535"/>',
    '  <ControlPoint index="11" value="65535"/>',
    '  <ControlPoint index="12" value="65535"/>',
    '  <ControlPoint index="13" value="65535"/>',
    '  <ControlPoint index="14" value="65535"/>',
    '  <ControlPoint index="15" value="65535"/>',
    '  <ControlPoint index="16" value="65535"/>',
    '  <ControlPoint index="17" value="65535"/>',
    '  <ControlPoint index="18" value="65535"/>',
    '  <ControlPoint index="19" value="65535"/>',
    '  <ControlPoint index="20" value="65535"/>',
    '  <ControlPoint index="21" value="65535"/>',
    '  <ControlPoint index="22" value="65535"/>',
    '  <ControlPoint index="23" value="65535"/>',
    '  <ControlPoint index="24" value="65535"/>',
    '  <ControlPoint index="25" value="65535"/>',
    '  <ControlPoint index="26" value="65535"/>',
    '  <ControlPoint index="27" value="65535"/>',
    '  <ControlPoint index="28" value="65535"/>',
    '  <ControlPoint index="29" value="65535"/>',
    '  <ControlPoint index="30" value="65535"/>',
    '  <ControlPoint index="31" value="65535"/>',
    '  <BaselineValues>',
    '    <Lookup glyph="B" value="0"/>',
    '    <Lookup glyph="C" value="0"/>',
    '    <Lookup glyph="D" value="0"/>',
    '    <Lookup glyph="E" value="0"/>',
    '    <Lookup glyph="F" value="0"/>',
    '    <Lookup glyph="G" value="0"/>',
    '    <Lookup glyph="H" value="0"/>',
    '    <Lookup glyph="I" value="0"/>',
    '    <Lookup glyph="J" value="0"/>',
    '  </BaselineValues>',
    '</Baseline>',
]


class BSLNTest(unittest.TestCase):

    @classmethod
    def setUpClass(cls):
        cls.maxDiff = None
        cls.font = FakeFont(
            ['.notdef'] + [g for g in 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'])

    def decompileToXML(self, data, xml):
        table = newTable('bsln')
        table.decompile(data, self.font)
        self.assertEqual(getXML(table.toXML), xml)

    def compileFromXML(self, xml, data):
        table = newTable('bsln')
        for name, attrs, content in parseXML(xml):
            table.fromXML(name, attrs, content, font=self.font)
        self.assertEqual(hexStr(table.compile(self.font)), hexStr(data))

    def testFormat0(self):
        self.decompileToXML(BSLN_FORMAT_0_DATA, BSLN_FORMAT_0_XML)
        self.compileFromXML(BSLN_FORMAT_0_XML, BSLN_FORMAT_0_DATA)

    def testFormat1(self):
        self.decompileToXML(BSLN_FORMAT_1_DATA, BSLN_FORMAT_1_XML)
        self.compileFromXML(BSLN_FORMAT_1_XML, BSLN_FORMAT_1_DATA)

    def testFormat2(self):
        self.decompileToXML(BSLN_FORMAT_2_DATA, BSLN_FORMAT_2_XML)
        self.compileFromXML(BSLN_FORMAT_2_XML, BSLN_FORMAT_2_DATA)

    def testFormat3(self):
        self.decompileToXML(BSLN_FORMAT_3_DATA, BSLN_FORMAT_3_XML)
        self.compileFromXML(BSLN_FORMAT_3_XML, BSLN_FORMAT_3_DATA)


if __name__ == '__main__':
    import sys
    sys.exit(unittest.main())
