Example #1
0
 def setUp(self):
     self.parser = ScriptParser()
     self.ScriptClass = Script
Example #2
0
 def setUp(self):
     self.parser = ScriptParser()
     self.ScriptClass = Script
Example #3
0
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),
        )
Example #4
0
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),
        )