[voltLib] test for duplicate lang tag

This commit is contained in:
moyogo 2016-01-27 15:51:45 +00:00
parent da80ce9cd1
commit c564b31f47
2 changed files with 45 additions and 1 deletions

View File

@ -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

View File

@ -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'