[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.anchors_ = {} # dictionary of SymbolTable() keyed by glyph
|
||||
self.scripts_ = SymbolTable()
|
||||
self.langs_ = SymbolTable()
|
||||
self.lookups_ = SymbolTable()
|
||||
self.next_token_type_, self.next_token_ = (None, None)
|
||||
self.next_token_location_ = None
|
||||
@ -120,13 +121,22 @@ class Parser(object):
|
||||
'script tags are case insensitive' % tag,
|
||||
location
|
||||
)
|
||||
self.langs_.enter_scope()
|
||||
langs = []
|
||||
while self.next_token_ != "END_SCRIPT":
|
||||
self.advance_lexer_()
|
||||
lang = self.parse_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)
|
||||
self.expect_keyword_("END_SCRIPT")
|
||||
self.langs_.exit_scope()
|
||||
def_script = ast.ScriptDefinition(location, name, tag, langs)
|
||||
self.scripts_.define(tag, def_script)
|
||||
return def_script
|
||||
|
@ -266,7 +266,7 @@ class ParserTest(unittest.TestCase):
|
||||
'END_SCRIPT'
|
||||
).statements
|
||||
|
||||
def test_langsys_script_duplicate(self):
|
||||
def test_langsys_duplicate_script(self):
|
||||
with self.assertRaisesRegex(
|
||||
VoltLibError,
|
||||
'Script "DFLT" already defined, '
|
||||
@ -282,6 +282,40 @@ class ParserTest(unittest.TestCase):
|
||||
'END_SCRIPT'
|
||||
).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):
|
||||
[langsys] = self.parse(
|
||||
'DEF_SCRIPT NAME "Latin" TAG "latn"\n'
|
||||
|
Loading…
x
Reference in New Issue
Block a user