[voltLib] test for duplicate lang tag
This commit is contained in:
parent
da80ce9cd1
commit
c564b31f47
@ -27,6 +27,7 @@ class Parser(object):
|
|||||||
self.groups_ = SymbolTable()
|
self.groups_ = SymbolTable()
|
||||||
self.anchors_ = {} # dictionary of SymbolTable() keyed by glyph
|
self.anchors_ = {} # dictionary of SymbolTable() keyed by glyph
|
||||||
self.scripts_ = SymbolTable()
|
self.scripts_ = SymbolTable()
|
||||||
|
self.langs_ = SymbolTable()
|
||||||
self.lookups_ = SymbolTable()
|
self.lookups_ = SymbolTable()
|
||||||
self.next_token_type_, self.next_token_ = (None, None)
|
self.next_token_type_, self.next_token_ = (None, None)
|
||||||
self.next_token_location_ = None
|
self.next_token_location_ = None
|
||||||
@ -120,13 +121,22 @@ class Parser(object):
|
|||||||
'script tags are case insensitive' % tag,
|
'script tags are case insensitive' % tag,
|
||||||
location
|
location
|
||||||
)
|
)
|
||||||
|
self.langs_.enter_scope()
|
||||||
langs = []
|
langs = []
|
||||||
while self.next_token_ != "END_SCRIPT":
|
while self.next_token_ != "END_SCRIPT":
|
||||||
self.advance_lexer_()
|
self.advance_lexer_()
|
||||||
lang = self.parse_langsys_()
|
lang = self.parse_langsys_()
|
||||||
self.expect_keyword_("END_LANGSYS")
|
self.expect_keyword_("END_LANGSYS")
|
||||||
|
if self.langs_.resolve(lang.tag) is not None:
|
||||||
|
raise VoltLibError(
|
||||||
|
'Language "%s" already defined in script "%s", '
|
||||||
|
'language tags are case insensitive' % (lang.tag, tag),
|
||||||
|
location
|
||||||
|
)
|
||||||
|
self.langs_.define(lang.tag, lang)
|
||||||
langs.append(lang)
|
langs.append(lang)
|
||||||
self.expect_keyword_("END_SCRIPT")
|
self.expect_keyword_("END_SCRIPT")
|
||||||
|
self.langs_.exit_scope()
|
||||||
def_script = ast.ScriptDefinition(location, name, tag, langs)
|
def_script = ast.ScriptDefinition(location, name, tag, langs)
|
||||||
self.scripts_.define(tag, def_script)
|
self.scripts_.define(tag, def_script)
|
||||||
return def_script
|
return def_script
|
||||||
|
@ -266,7 +266,7 @@ class ParserTest(unittest.TestCase):
|
|||||||
'END_SCRIPT'
|
'END_SCRIPT'
|
||||||
).statements
|
).statements
|
||||||
|
|
||||||
def test_langsys_script_duplicate(self):
|
def test_langsys_duplicate_script(self):
|
||||||
with self.assertRaisesRegex(
|
with self.assertRaisesRegex(
|
||||||
VoltLibError,
|
VoltLibError,
|
||||||
'Script "DFLT" already defined, '
|
'Script "DFLT" already defined, '
|
||||||
@ -282,6 +282,40 @@ class ParserTest(unittest.TestCase):
|
|||||||
'END_SCRIPT'
|
'END_SCRIPT'
|
||||||
).statements
|
).statements
|
||||||
|
|
||||||
|
def test_langsys_duplicate_lang(self):
|
||||||
|
with self.assertRaisesRegex(
|
||||||
|
VoltLibError,
|
||||||
|
'Language "dflt" already defined in script "DFLT", '
|
||||||
|
'language tags are case insensitive'):
|
||||||
|
[langsys] = self.parse(
|
||||||
|
'DEF_SCRIPT NAME "Default" TAG "DFLT"\n'
|
||||||
|
'DEF_LANGSYS NAME "Default" TAG "dflt"\n'
|
||||||
|
'END_LANGSYS\n'
|
||||||
|
'DEF_LANGSYS NAME "Default" TAG "dflt"\n'
|
||||||
|
'END_LANGSYS\n'
|
||||||
|
'END_SCRIPT\n'
|
||||||
|
).statements
|
||||||
|
|
||||||
|
def test_langsys_lang_in_separate_scripts(self):
|
||||||
|
[langsys1, langsys2] = self.parse(
|
||||||
|
'DEF_SCRIPT NAME "Default" TAG "DFLT"\n'
|
||||||
|
'DEF_LANGSYS NAME "Default" TAG "dflt"\n'
|
||||||
|
'END_LANGSYS\n'
|
||||||
|
'DEF_LANGSYS NAME "Default" TAG "ROM "\n'
|
||||||
|
'END_LANGSYS\n'
|
||||||
|
'END_SCRIPT\n'
|
||||||
|
'DEF_SCRIPT NAME "Latin" TAG "latn"\n'
|
||||||
|
'DEF_LANGSYS NAME "Default" TAG "dflt"\n'
|
||||||
|
'END_LANGSYS\n'
|
||||||
|
'DEF_LANGSYS NAME "Default" TAG "ROM "\n'
|
||||||
|
'END_LANGSYS\n'
|
||||||
|
'END_SCRIPT'
|
||||||
|
).statements
|
||||||
|
self.assertEqual((langsys1.langs[0].tag, langsys1.langs[1].tag),
|
||||||
|
("dflt", "ROM "))
|
||||||
|
self.assertEqual((langsys2.langs[0].tag, langsys2.langs[1].tag),
|
||||||
|
("dflt", "ROM "))
|
||||||
|
|
||||||
def test_langsys_no_lang_name(self):
|
def test_langsys_no_lang_name(self):
|
||||||
[langsys] = self.parse(
|
[langsys] = self.parse(
|
||||||
'DEF_SCRIPT NAME "Latin" TAG "latn"\n'
|
'DEF_SCRIPT NAME "Latin" TAG "latn"\n'
|
||||||
|
Loading…
x
Reference in New Issue
Block a user