[voltLib] parser_test.py
This commit is contained in:
parent
52c5c121e1
commit
7d8ee16b81
@ -2,7 +2,7 @@ from __future__ import print_function, division, absolute_import
|
|||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
from fontTools.voltLib.error import VoltLibError
|
from fontTools.voltLib.error import VoltLibError
|
||||||
from fontTools.voltLib.parser import Parser
|
from fontTools.voltLib.parser import Parser
|
||||||
import codecs
|
from io import open
|
||||||
import os
|
import os
|
||||||
import shutil
|
import shutil
|
||||||
import tempfile
|
import tempfile
|
||||||
@ -64,6 +64,41 @@ class ParserTest(unittest.TestCase):
|
|||||||
"ae", "agrave", "amacron", "aogonek", "aring",
|
"ae", "agrave", "amacron", "aogonek", "aring",
|
||||||
"atilde"]))
|
"atilde"]))
|
||||||
|
|
||||||
|
def test_def_group_groups(self):
|
||||||
|
[group1, group2, test_group] = self.parse(
|
||||||
|
'DEF_GROUP "Group1"\n'
|
||||||
|
'ENUM GLYPH "a" GLYPH "b" GLYPH "c" GLYPH "d" END_ENUM\n'
|
||||||
|
'END_GROUP\n'
|
||||||
|
'DEF_GROUP "Group2"\n'
|
||||||
|
'ENUM GLYPH "e" GLYPH "f" GLYPH "g" GLYPH "h" END_ENUM\n'
|
||||||
|
'END_GROUP\n'
|
||||||
|
'DEF_GROUP "TestGroup"\n'
|
||||||
|
'ENUM GROUP "Group1" GROUP "Group2" END_ENUM\n'
|
||||||
|
'END_GROUP\n'
|
||||||
|
).statements
|
||||||
|
self.assertEqual(
|
||||||
|
(test_group.name, test_group.enum),
|
||||||
|
("TestGroup",
|
||||||
|
["a", "b", "c", "d", "e", "f", "g", "h"]))
|
||||||
|
|
||||||
|
# TODO
|
||||||
|
# def test_def_group_groups_not_yet_defined(self):
|
||||||
|
# [group1, group2, test_group] = self.parse(
|
||||||
|
# 'DEF_GROUP "Group1"\n'
|
||||||
|
# 'ENUM GLYPH "a" GLYPH "b" GLYPH "c" GLYPH "d" END_ENUM\n'
|
||||||
|
# 'END_GROUP\n'
|
||||||
|
# 'DEF_GROUP "TestGroup"\n'
|
||||||
|
# 'ENUM GROUP "Group1" GROUP "Group2" END_ENUM\n'
|
||||||
|
# 'END_GROUP\n'
|
||||||
|
# 'DEF_GROUP "Group2"\n'
|
||||||
|
# 'ENUM GLYPH "e" GLYPH "f" GLYPH "g" GLYPH "h" END_ENUM\n'
|
||||||
|
# 'END_GROUP\n'
|
||||||
|
# ).statements
|
||||||
|
# self.assertEqual(
|
||||||
|
# (test_group.name, test_group.enum),
|
||||||
|
# ("TestGroup",
|
||||||
|
# ["a", "b", "c", "d", "e", "f", "g", "h"]))
|
||||||
|
|
||||||
def test_def_group_glyphs_and_group(self):
|
def test_def_group_glyphs_and_group(self):
|
||||||
[def_group1, def_group2] = self.parse(
|
[def_group1, def_group2] = self.parse(
|
||||||
'DEF_GROUP "aaccented"\n'
|
'DEF_GROUP "aaccented"\n'
|
||||||
@ -103,7 +138,15 @@ class ParserTest(unittest.TestCase):
|
|||||||
'END_GROUP\n'
|
'END_GROUP\n'
|
||||||
)
|
)
|
||||||
|
|
||||||
def test_langsys(self):
|
def test_script_without_langsys(self):
|
||||||
|
[script] = self.parse(
|
||||||
|
'DEF_SCRIPT NAME "Latin" TAG "latn"\n'
|
||||||
|
'END_SCRIPT'
|
||||||
|
).statements
|
||||||
|
self.assertEqual((script.name, script.tag, script.langs),
|
||||||
|
("Latin", "latn", []))
|
||||||
|
|
||||||
|
def test_langsys_normal(self):
|
||||||
[def_script] = self.parse(
|
[def_script] = self.parse(
|
||||||
'DEF_SCRIPT NAME "Latin" TAG "latn"\n'
|
'DEF_SCRIPT NAME "Latin" TAG "latn"\n'
|
||||||
'DEF_LANGSYS NAME "Romanian" TAG "ROM "\n'
|
'DEF_LANGSYS NAME "Romanian" TAG "ROM "\n'
|
||||||
@ -118,6 +161,58 @@ class ParserTest(unittest.TestCase):
|
|||||||
("Romanian",
|
("Romanian",
|
||||||
"ROM "))
|
"ROM "))
|
||||||
|
|
||||||
|
def test_langsys_no_script_name(self):
|
||||||
|
[langsys] = self.parse(
|
||||||
|
'DEF_SCRIPT TAG "latn"\n'
|
||||||
|
'DEF_LANGSYS NAME "Default" TAG "dflt"\n'
|
||||||
|
'END_LANGSYS\n'
|
||||||
|
'END_SCRIPT'
|
||||||
|
).statements
|
||||||
|
self.assertEqual((langsys.name, langsys.tag),
|
||||||
|
(None,
|
||||||
|
"latn"))
|
||||||
|
lang = langsys.langs[0]
|
||||||
|
self.assertEqual((lang.name, lang.tag),
|
||||||
|
("Default",
|
||||||
|
"dflt"))
|
||||||
|
|
||||||
|
def test_langsys_no_script_tag_fails(self):
|
||||||
|
with self.assertRaisesRegex(
|
||||||
|
VoltLibError,
|
||||||
|
r'.*Expected "TAG"'):
|
||||||
|
[langsys] = self.parse(
|
||||||
|
'DEF_SCRIPT NAME "Latin"\n'
|
||||||
|
'DEF_LANGSYS NAME "Default" TAG "dflt"\n'
|
||||||
|
'END_LANGSYS\n'
|
||||||
|
'END_SCRIPT'
|
||||||
|
).statements
|
||||||
|
|
||||||
|
def test_langsys_no_lang_name(self):
|
||||||
|
[langsys] = self.parse(
|
||||||
|
'DEF_SCRIPT NAME "Latin" TAG "latn"\n'
|
||||||
|
'DEF_LANGSYS TAG "dflt"\n'
|
||||||
|
'END_LANGSYS\n'
|
||||||
|
'END_SCRIPT'
|
||||||
|
).statements
|
||||||
|
self.assertEqual((langsys.name, langsys.tag),
|
||||||
|
("Latin",
|
||||||
|
"latn"))
|
||||||
|
lang = langsys.langs[0]
|
||||||
|
self.assertEqual((lang.name, lang.tag),
|
||||||
|
(None,
|
||||||
|
"dflt"))
|
||||||
|
|
||||||
|
def test_langsys_no_langsys_tag_fails(self):
|
||||||
|
with self.assertRaisesRegex(
|
||||||
|
VoltLibError,
|
||||||
|
r'.*Expected "TAG"'):
|
||||||
|
[langsys] = self.parse(
|
||||||
|
'DEF_SCRIPT NAME "Latin" TAG "latn"\n'
|
||||||
|
'DEF_LANGSYS NAME "Default"\n'
|
||||||
|
'END_LANGSYS\n'
|
||||||
|
'END_SCRIPT'
|
||||||
|
).statements
|
||||||
|
|
||||||
def test_feature(self):
|
def test_feature(self):
|
||||||
[def_script] = self.parse(
|
[def_script] = self.parse(
|
||||||
'DEF_SCRIPT NAME "Latin" TAG "latn"\n'
|
'DEF_SCRIPT NAME "Latin" TAG "latn"\n'
|
||||||
@ -187,13 +282,12 @@ class ParserTest(unittest.TestCase):
|
|||||||
'END_SUBSTITUTION'
|
'END_SUBSTITUTION'
|
||||||
).statements
|
).statements
|
||||||
context = lookup.context[0]
|
context = lookup.context[0]
|
||||||
self.assertEqual((lookup.name, list(lookup.sub.mapping), context.ex_or_in,
|
self.assertEqual(
|
||||||
context.left, context.right),
|
(lookup.name, list(lookup.sub.mapping),
|
||||||
("fracdnom",
|
context.ex_or_in, context.left, context.right),
|
||||||
[("one", "one.dnom"), ("two", "two.dnom")],
|
("fracdnom", [("one", "one.dnom"), ("two", "two.dnom")],
|
||||||
"IN_CONTEXT",
|
"IN_CONTEXT", [[["one.dnom", "two.dnom", "fraction"]]], [])
|
||||||
[[["one.dnom", "two.dnom", "fraction"]]],
|
)
|
||||||
[]))
|
|
||||||
|
|
||||||
def test_substitution_single_in_contexts(self):
|
def test_substitution_single_in_contexts(self):
|
||||||
[group, lookup] = self.parse(
|
[group, lookup] = self.parse(
|
||||||
@ -217,18 +311,59 @@ class ParserTest(unittest.TestCase):
|
|||||||
).statements
|
).statements
|
||||||
context1 = lookup.context[0]
|
context1 = lookup.context[0]
|
||||||
context2 = lookup.context[1]
|
context2 = lookup.context[1]
|
||||||
self.assertEqual((lookup.name, context1.ex_or_in, context1.left,
|
self.assertEqual(
|
||||||
context1.right, context2.ex_or_in, context2.left,
|
(lookup.name, context1.ex_or_in, context1.left,
|
||||||
context2.right),
|
context1.right, context2.ex_or_in,
|
||||||
("HebrewCurrency",
|
context2.left, context2.right),
|
||||||
"IN_CONTEXT",
|
("HebrewCurrency", "IN_CONTEXT", [],
|
||||||
[],
|
[["uni05D0", "uni05D1"], ["one.Hebr"]], "IN_CONTEXT",
|
||||||
[["uni05D0", "uni05D1"], ["one.Hebr"]],
|
[["uni05D0", "uni05D1"], ["one.Hebr"]], []))
|
||||||
"IN_CONTEXT",
|
|
||||||
[["uni05D0", "uni05D1"], ["one.Hebr"]],
|
|
||||||
[]))
|
|
||||||
|
|
||||||
def test_def_attach(self):
|
def test_substitution_skip_marks(self):
|
||||||
|
[group, lookup] = self.parse(
|
||||||
|
'DEF_GROUP "SomeMarks" ENUM GLYPH "marka" GLYPH "markb" '
|
||||||
|
'END_ENUM END_GROUP\n'
|
||||||
|
'DEF_LOOKUP "SomeSub" PROCESS_BASE SKIP_MARKS '
|
||||||
|
'DIRECTION LTR\n'
|
||||||
|
'IN_CONTEXT\n'
|
||||||
|
'END_CONTEXT\n'
|
||||||
|
'AS_SUBSTITUTION\n'
|
||||||
|
'SUB GLYPH "A"\n'
|
||||||
|
'WITH GLYPH "A.c2sc"\n'
|
||||||
|
'END_SUB\n'
|
||||||
|
'END_SUBSTITUTION'
|
||||||
|
).statements
|
||||||
|
process_marks = lookup.process_marks
|
||||||
|
all_marks = lookup.all
|
||||||
|
self.assertEqual(
|
||||||
|
(lookup.name, process_marks, all_marks),
|
||||||
|
("SomeSub", None, False))
|
||||||
|
|
||||||
|
def test_substitution_process_marks(self):
|
||||||
|
[group, lookup] = self.parse(
|
||||||
|
'DEF_GROUP "SomeMarks" ENUM GLYPH "acutecmb" GLYPH "gravecmb" '
|
||||||
|
'END_ENUM END_GROUP\n'
|
||||||
|
'DEF_LOOKUP "SomeSub" PROCESS_BASE '
|
||||||
|
'PROCESS_MARKS "SomeMarks" \n'
|
||||||
|
'DIRECTION RTL\n'
|
||||||
|
'AS_SUBSTITUTION\n'
|
||||||
|
'SUB GLYPH "A"\n'
|
||||||
|
'WITH GLYPH "A.c2sc"\n'
|
||||||
|
'END_SUB\n'
|
||||||
|
'END_SUBSTITUTION'
|
||||||
|
).statements
|
||||||
|
process_marks = lookup.process_marks
|
||||||
|
all_marks = lookup.all
|
||||||
|
self.assertEqual(
|
||||||
|
(lookup.name, process_marks, all_marks),
|
||||||
|
("SomeSub", "SomeMarks", False))
|
||||||
|
|
||||||
|
# GPOS
|
||||||
|
# ATTACH_CURSIVE
|
||||||
|
# ATTACH
|
||||||
|
# ADJUST_PAIR
|
||||||
|
# ADJUST_SINGLE
|
||||||
|
def test_position_attach(self):
|
||||||
[lookup, anchor1, anchor2, anchor3, anchor4] = self.parse(
|
[lookup, anchor1, anchor2, anchor3, anchor4] = self.parse(
|
||||||
'DEF_LOOKUP "anchor_top" PROCESS_BASE PROCESS_MARKS ALL '
|
'DEF_LOOKUP "anchor_top" PROCESS_BASE PROCESS_MARKS ALL '
|
||||||
'DIRECTION RTL\n'
|
'DIRECTION RTL\n'
|
||||||
@ -277,7 +412,10 @@ class ParserTest(unittest.TestCase):
|
|||||||
("top", 35, "e", 1, False, (None, 215, 450, {}, {}, {}))
|
("top", 35, "e", 1, False, (None, 215, 450, {}, {}, {}))
|
||||||
)
|
)
|
||||||
|
|
||||||
def test_adjust_pair(self):
|
def test_position_attach_cursive(self):
|
||||||
|
pass # XXX
|
||||||
|
|
||||||
|
def test_position_adjust_pair(self):
|
||||||
[lookup] = self.parse(
|
[lookup] = self.parse(
|
||||||
'DEF_LOOKUP "kern1" PROCESS_BASE PROCESS_MARKS ALL '
|
'DEF_LOOKUP "kern1" PROCESS_BASE PROCESS_MARKS ALL '
|
||||||
'DIRECTION RTL\n'
|
'DIRECTION RTL\n'
|
||||||
@ -302,9 +440,13 @@ class ParserTest(unittest.TestCase):
|
|||||||
(None, None, None, {}, {}, {}))})
|
(None, None, None, {}, {}, {}))})
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def test_position_adjust_single(self):
|
||||||
|
pass # XXX
|
||||||
|
|
||||||
def test_def_anchor(self):
|
def test_def_anchor(self):
|
||||||
[anchor] = self.parse(
|
[anchor] = self.parse(
|
||||||
'DEF_ANCHOR "MARK_top" ON 120 GLYPH acutecomb COMPONENT 1 AT POS DX 0 DY 450 END_POS END_ANCHOR'
|
'DEF_ANCHOR "MARK_top" ON 120 GLYPH acutecomb '
|
||||||
|
'COMPONENT 1 AT POS DX 0 DY 450 END_POS END_ANCHOR'
|
||||||
).statements
|
).statements
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
(anchor.name, anchor.gid, anchor.glyph_name, anchor.component,
|
(anchor.name, anchor.gid, anchor.glyph_name, anchor.component,
|
||||||
@ -367,7 +509,7 @@ class ParserTest(unittest.TestCase):
|
|||||||
self.tempdir = tempfile.mkdtemp()
|
self.tempdir = tempfile.mkdtemp()
|
||||||
self.num_tempfiles += 1
|
self.num_tempfiles += 1
|
||||||
path = os.path.join(self.tempdir, "tmp%d.vtp" % self.num_tempfiles)
|
path = os.path.join(self.tempdir, "tmp%d.vtp" % self.num_tempfiles)
|
||||||
with codecs.open(path, "wb", "utf-8") as outfile:
|
with open(path, "w") as outfile:
|
||||||
outfile.write(text)
|
outfile.write(text)
|
||||||
return Parser(path).parse()
|
return Parser(path).parse()
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user