def setUp(self): self.parser = ScriptParser() self.ScriptClass = Script
class ScriptParserTests(TestCase): def setUp(self): self.parser = ScriptParser() self.ScriptClass = Script def test_parse_with_empty_script(self): name = 'foo' content = "" script = self.parser.parse( name=name, content=content, script_class=self.ScriptClass, get_script_by_name=None, ) self.assertEqual(name, script.name) self.assertEqual(content, script.render()) self.assertEqual( [ TextRegion(content=content), ], script.regions, ) def test_parse_with_duplicate_keys(self): name = 'foo' contents = [ '%key a', '%key a', ] content = '\n'.join(contents) with self.assertRaises(ValueError): self.parser.parse( name=name, content=content, script_class=self.ScriptClass, get_script_by_name=None, ) def test_parse_with_duplicate_arguments(self): name = 'foo' contents = [ '%arg a', '%arg a', ] content = '\n'.join(contents) with self.assertRaises(ValueError): self.parser.parse( name=name, content=content, script_class=self.ScriptClass, get_script_by_name=None, ) def test_parse_with_duplicate_key_argument(self): name = 'foo' contents = [ '%key a', '%arg a', ] content = '\n'.join(contents) with self.assertRaises(ValueError): self.parser.parse( name=name, content=content, script_class=self.ScriptClass, get_script_by_name=None, ) def test_parse_regions_text_only(self): content = 'local a = 1;\nlocal b = 2;' get_script_by_name = MagicMock() regions = self.parser.parse_regions( content=content, current_path=".", get_script_by_name=get_script_by_name, ) self.assertEqual( [ TextRegion(content=content), ], regions, ) self.assertEqual(2, regions[0].line_count) self.assertEqual(2, regions[0].real_line_count) self.assertEqual(0, get_script_by_name.call_count) def test_extract_regions_include(self): contents = [ 'local a = 1;', '%include "foo"', 'local d = 4;', '%include "foo"', '%include "foo"', 'local e = 4;', '%include "../foo"', '%include "./bar/../foo"', ] content = '\n'.join(contents) script = Script( name='foo', regions=[ TextRegion(content='local b = 2;\nlocal c = 3;'), ], ) get_script_by_name = MagicMock(return_value=script) regions = self.parser.parse_regions( content=content, current_path=".", get_script_by_name=get_script_by_name, ) self.maxDiff = None self.assertEqual( [ TextRegion(content=contents[0]), ScriptRegion( script=script, content='%include "foo"', ), TextRegion(content=contents[2]), ScriptRegion( script=script, content='%include "foo"', ), ScriptRegion( script=script, content='%include "foo"', ), TextRegion(content=contents[5]), ScriptRegion( script=script, content='%include "../foo"', ), ScriptRegion( script=script, content='%include "./bar/../foo"', ), ], regions, ) self.assertEqual( [ call(name="%s" % script.name), call(name="%s" % script.name), call(name="%s" % script.name), call(name="../%s" % script.name), call(name="%s" % script.name), ], get_script_by_name.mock_calls[:], ) def test_extract_regions_keys(self): contents = [ '%key key1', '%include "foo"', '%key key3', ] content = '\n'.join(contents) script = Script( name='foo', regions=[ KeyRegion( name='key2', index=1, content='%key key2', ), ], ) get_script_by_name = MagicMock(return_value=script) regions = self.parser.parse_regions( content=content, current_path=".", get_script_by_name=get_script_by_name, ) self.maxDiff = None self.assertEqual( [ KeyRegion( name='key1', index=1, content=contents[0], ), ScriptRegion( script=script, content='%include "foo"', ), KeyRegion( name='key3', index=3, content=contents[2], ), ], regions, ) def test_extract_regions_arguments(self): contents = [ '%arg arg1', '%include "foo"', '%arg arg3 string', '%arg arg4 integer', '%arg arg5 boolean', ] content = '\n'.join(contents) script = Script( name='foo', regions=[ ArgumentRegion( name='arg2', index=1, type_='string', content='%arg arg2', ), ], ) get_script_by_name = MagicMock(return_value=script) regions = self.parser.parse_regions( content=content, current_path=".", get_script_by_name=get_script_by_name, ) self.maxDiff = None self.assertEqual( [ ArgumentRegion( name='arg1', index=1, type_='string', content=contents[0], ), ScriptRegion( script=script, content='%include "foo"', ), ArgumentRegion( name='arg3', index=3, type_='string', content=contents[2], ), ArgumentRegion( name='arg4', index=4, type_='integer', content=contents[3], ), ArgumentRegion( name='arg5', index=5, type_='boolean', content=contents[4], ), ], regions, ) def test_extract_regions_return(self): contents = [ '%include "foo"', '%return integer', ] content = '\n'.join(contents) script = Script( name='foo', regions=[ ReturnRegion( type_='string', content='%return string', ), ], ) get_script_by_name = MagicMock(return_value=script) regions = self.parser.parse_regions( content=content, current_path=".", get_script_by_name=get_script_by_name, ) self.maxDiff = None self.assertEqual( [ ScriptRegion( script=script, content='%include "foo"', ), ReturnRegion( type_='integer', content=contents[1], ), ], regions, ) def test_extract_regions_pragma(self): contents = [ '%include "foo"', '%pragma once', ] content = '\n'.join(contents) script = Script( name='foo', regions=[ PragmaRegion( value='once', content='%pragma once', ), ], ) get_script_by_name = MagicMock(return_value=script) regions = self.parser.parse_regions( content=content, current_path=".", get_script_by_name=get_script_by_name, ) self.maxDiff = None self.assertEqual( [ ScriptRegion( script=script, content='%include "foo"', ), PragmaRegion( value='once', content=contents[1], ), ], regions, ) def test_extract_regions_text_last(self): contents = [ '%arg arg1', '%include "foo"', '%key key2', 'a', 'b', 'c', ] content = '\n'.join(contents) script = Script( name='foo', regions=[ ArgumentRegion( name='arg2', index=1, type_='string', content='%arg arg2', ), KeyRegion( name='key1', index=1, content='%key key1', ), ], ) get_script_by_name = MagicMock(return_value=script) regions = self.parser.parse_regions( content=content, current_path=".", get_script_by_name=get_script_by_name, ) self.maxDiff = None self.assertEqual( [ ArgumentRegion( name='arg1', index=1, type_='string', content=contents[0], ), ScriptRegion( script=script, content='%include "foo"', ), KeyRegion( name='key2', index=2, content=contents[2], ), TextRegion(content='\n'.join(contents[3:6])), ], regions, ) def test_extract_regions_arguments_invalid(self): contents = [ '%arg arg1 unknowntype', ] content = '\n'.join(contents) with self.assertRaises(ValueError) as error: self.parser.parse_regions( content=content, current_path=".", get_script_by_name=None, ) self.assertEqual( ( "Unknown type 'unknowntype' in '%arg arg1 unknowntype' when " "parsing line 1" ), str(error.exception), ) def test_extract_regions_return_invalid(self): contents = [ '%return unknowntype', ] content = '\n'.join(contents) with self.assertRaises(ValueError) as error: self.parser.parse_regions( content=content, current_path=".", get_script_by_name=None, ) self.assertEqual( ( "Unknown type 'unknowntype' in '%return unknowntype' when " "parsing line 1" ), str(error.exception), ) def test_extract_regions_pragma_invalid(self): contents = [ '%pragma unknown', ] content = '\n'.join(contents) with self.assertRaises(ValueError) as error: self.parser.parse_regions( content=content, current_path=".", get_script_by_name=None, ) self.assertEqual( ( "Unknown value 'unknown' in '%pragma unknown' when " "parsing line 1" ), str(error.exception), )
class ScriptParserTests(TestCase): def setUp(self): self.parser = ScriptParser() self.ScriptClass = Script def test_parse_with_empty_script(self): name = 'foo' content = "" script = self.parser.parse( name=name, content=content, script_class=self.ScriptClass, get_script_by_name=None, ) self.assertEqual(name, script.name) self.assertEqual(content, script.render()) self.assertEqual( [ TextRegion(content=content), ], script.regions, ) def test_parse_with_duplicate_keys(self): name = 'foo' contents = [ '%key a', '%key a', ] content = '\n'.join(contents) with self.assertRaises(ValueError): self.parser.parse( name=name, content=content, script_class=self.ScriptClass, get_script_by_name=None, ) def test_parse_with_duplicate_arguments(self): name = 'foo' contents = [ '%arg a', '%arg a', ] content = '\n'.join(contents) with self.assertRaises(ValueError): self.parser.parse( name=name, content=content, script_class=self.ScriptClass, get_script_by_name=None, ) def test_parse_with_duplicate_key_argument(self): name = 'foo' contents = [ '%key a', '%arg a', ] content = '\n'.join(contents) with self.assertRaises(ValueError): self.parser.parse( name=name, content=content, script_class=self.ScriptClass, get_script_by_name=None, ) def test_parse_regions_text_only(self): content = 'local a = 1;\nlocal b = 2;' get_script_by_name = MagicMock() regions = self.parser.parse_regions( content=content, current_path=".", get_script_by_name=get_script_by_name, ) self.assertEqual( [ TextRegion(content=content), ], regions, ) self.assertEqual(2, regions[0].line_count) self.assertEqual(2, regions[0].real_line_count) self.assertEqual(0, get_script_by_name.call_count) def test_extract_regions_include(self): contents = [ 'local a = 1;', '%include "foo"', 'local d = 4;', '%include "foo"', '%include "foo"', 'local e = 4;', '%include "../foo"', '%include "./bar/../foo"', ] content = '\n'.join(contents) script = Script( name='foo', regions=[ TextRegion(content='local b = 2;\nlocal c = 3;'), ], ) get_script_by_name = MagicMock(return_value=script) regions = self.parser.parse_regions( content=content, current_path=".", get_script_by_name=get_script_by_name, ) self.maxDiff = None self.assertEqual( [ TextRegion(content=contents[0]), ScriptRegion( script=script, content='%include "foo"', ), TextRegion(content=contents[2]), ScriptRegion( script=script, content='%include "foo"', ), ScriptRegion( script=script, content='%include "foo"', ), TextRegion(content=contents[5]), ScriptRegion( script=script, content='%include "../foo"', ), ScriptRegion( script=script, content='%include "./bar/../foo"', ), ], regions, ) self.assertEqual( [ call(name="%s" % script.name), call(name="%s" % script.name), call(name="%s" % script.name), call(name="../%s" % script.name), call(name="%s" % script.name), ], get_script_by_name.mock_calls[:], ) def test_extract_regions_keys(self): contents = [ '%key key1', '%include "foo"', '%key key3', ] content = '\n'.join(contents) script = Script( name='foo', regions=[ KeyRegion( name='key2', index=1, content='%key key2', ), ], ) get_script_by_name = MagicMock(return_value=script) regions = self.parser.parse_regions( content=content, current_path=".", get_script_by_name=get_script_by_name, ) self.maxDiff = None self.assertEqual( [ KeyRegion( name='key1', index=1, content=contents[0], ), ScriptRegion( script=script, content='%include "foo"', ), KeyRegion( name='key3', index=3, content=contents[2], ), ], regions, ) def test_extract_regions_arguments(self): contents = [ '%arg arg1', '%include "foo"', '%arg arg3 string', '%arg arg4 integer', '%arg arg5 boolean', ] content = '\n'.join(contents) script = Script( name='foo', regions=[ ArgumentRegion( name='arg2', index=1, type_='string', content='%arg arg2', ), ], ) get_script_by_name = MagicMock(return_value=script) regions = self.parser.parse_regions( content=content, current_path=".", get_script_by_name=get_script_by_name, ) self.maxDiff = None self.assertEqual( [ ArgumentRegion( name='arg1', index=1, type_='string', content=contents[0], ), ScriptRegion( script=script, content='%include "foo"', ), ArgumentRegion( name='arg3', index=3, type_='string', content=contents[2], ), ArgumentRegion( name='arg4', index=4, type_='integer', content=contents[3], ), ArgumentRegion( name='arg5', index=5, type_='boolean', content=contents[4], ), ], regions, ) def test_extract_regions_return(self): contents = [ '%include "foo"', '%return integer', ] content = '\n'.join(contents) script = Script( name='foo', regions=[ ReturnRegion( type_='string', content='%return string', ), ], ) get_script_by_name = MagicMock(return_value=script) regions = self.parser.parse_regions( content=content, current_path=".", get_script_by_name=get_script_by_name, ) self.maxDiff = None self.assertEqual( [ ScriptRegion( script=script, content='%include "foo"', ), ReturnRegion( type_='integer', content=contents[1], ), ], regions, ) def test_extract_regions_pragma(self): contents = [ '%include "foo"', '%pragma once', ] content = '\n'.join(contents) script = Script( name='foo', regions=[ PragmaRegion( value='once', content='%pragma once', ), ], ) get_script_by_name = MagicMock(return_value=script) regions = self.parser.parse_regions( content=content, current_path=".", get_script_by_name=get_script_by_name, ) self.maxDiff = None self.assertEqual( [ ScriptRegion( script=script, content='%include "foo"', ), PragmaRegion( value='once', content=contents[1], ), ], regions, ) def test_extract_regions_text_last(self): contents = [ '%arg arg1', '%include "foo"', '%key key2', 'a', 'b', 'c', ] content = '\n'.join(contents) script = Script( name='foo', regions=[ ArgumentRegion( name='arg2', index=1, type_='string', content='%arg arg2', ), KeyRegion( name='key1', index=1, content='%key key1', ), ], ) get_script_by_name = MagicMock(return_value=script) regions = self.parser.parse_regions( content=content, current_path=".", get_script_by_name=get_script_by_name, ) self.maxDiff = None self.assertEqual( [ ArgumentRegion( name='arg1', index=1, type_='string', content=contents[0], ), ScriptRegion( script=script, content='%include "foo"', ), KeyRegion( name='key2', index=2, content=contents[2], ), TextRegion(content='\n'.join(contents[3:6])), ], regions, ) def test_extract_regions_arguments_invalid(self): contents = [ '%arg arg1 unknowntype', ] content = '\n'.join(contents) with self.assertRaises(ValueError) as error: self.parser.parse_regions( content=content, current_path=".", get_script_by_name=None, ) self.assertEqual( ("Unknown type 'unknowntype' in '%arg arg1 unknowntype' when " "parsing line 1"), str(error.exception), ) def test_extract_regions_return_invalid(self): contents = [ '%return unknowntype', ] content = '\n'.join(contents) with self.assertRaises(ValueError) as error: self.parser.parse_regions( content=content, current_path=".", get_script_by_name=None, ) self.assertEqual( ("Unknown type 'unknowntype' in '%return unknowntype' when " "parsing line 1"), str(error.exception), ) def test_extract_regions_pragma_invalid(self): contents = [ '%pragma unknown', ] content = '\n'.join(contents) with self.assertRaises(ValueError) as error: self.parser.parse_regions( content=content, current_path=".", get_script_by_name=None, ) self.assertEqual( ("Unknown value 'unknown' in '%pragma unknown' when " "parsing line 1"), str(error.exception), )