[voltLib] test for duplicate script tag
This commit is contained in:
parent
23106f71ec
commit
da80ce9cd1
@ -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):
|
||||
|
@ -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'
|
||||
|
Loading…
x
Reference in New Issue
Block a user