[voltLib] test for duplicate script tag

This commit is contained in:
moyogo 2016-01-26 15:17:49 +00:00
parent 23106f71ec
commit da80ce9cd1
2 changed files with 30 additions and 0 deletions

View File

@ -26,6 +26,7 @@ class Parser(object):
self.doc_ = ast.VoltFile()
self.groups_ = SymbolTable()
self.anchors_ = {} # dictionary of SymbolTable() keyed by glyph
self.scripts_ = SymbolTable()
self.lookups_ = SymbolTable()
self.next_token_type_, self.next_token_ = (None, None)
self.next_token_location_ = None
@ -113,6 +114,12 @@ class Parser(object):
name = self.expect_string_()
self.expect_keyword_("TAG")
tag = self.expect_string_()
if self.scripts_.resolve(tag) is not None:
raise VoltLibError(
'Script "%s" already defined, '
'script tags are case insensitive' % tag,
location
)
langs = []
while self.next_token_ != "END_SCRIPT":
self.advance_lexer_()
@ -121,6 +128,7 @@ class Parser(object):
langs.append(lang)
self.expect_keyword_("END_SCRIPT")
def_script = ast.ScriptDefinition(location, name, tag, langs)
self.scripts_.define(tag, def_script)
return def_script
def parse_langsys_(self):

View File

@ -224,6 +224,8 @@ class ParserTest(unittest.TestCase):
'DEF_SCRIPT NAME "Latin" TAG "latn"\n'
'DEF_LANGSYS NAME "Romanian" TAG "ROM "\n'
'END_LANGSYS\n'
'DEF_LANGSYS NAME "Moldavian" TAG "MOL "\n'
'END_LANGSYS\n'
'END_SCRIPT'
).statements
self.assertEqual((def_script.name, def_script.tag),
@ -233,6 +235,10 @@ class ParserTest(unittest.TestCase):
self.assertEqual((def_lang.name, def_lang.tag),
("Romanian",
"ROM "))
def_lang = def_script.langs[1]
self.assertEqual((def_lang.name, def_lang.tag),
("Moldavian",
"MOL "))
def test_langsys_no_script_name(self):
[langsys] = self.parse(
@ -260,6 +266,22 @@ class ParserTest(unittest.TestCase):
'END_SCRIPT'
).statements
def test_langsys_script_duplicate(self):
with self.assertRaisesRegex(
VoltLibError,
'Script "DFLT" already defined, '
'script tags are case insensitive'):
[langsys1, langsys2] = self.parse(
'DEF_SCRIPT NAME "Default" TAG "DFLT"\n'
'DEF_LANGSYS NAME "Default" TAG "dflt"\n'
'END_LANGSYS\n'
'END_SCRIPT\n'
'DEF_SCRIPT TAG "DFLT"\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'