Ejemplo n.º 1
0
    def test_script_region_equality(self):
        script = MagicMock(spec=Script)
        other_script = MagicMock(spec=Script)
        script_region_a = ScriptRegion(
            script=script,
            content='%include "foo"',
        )
        script_region_b = ScriptRegion(
            script=script,
            content='%include "foo"',
        )
        script_region_c = ScriptRegion(
            script=other_script,
            content='%include "bar"',
        )
        script_region_d = ScriptRegion(
            script=script,
            content='%include "bar"',
        )

        self.assertIsNot(script_region_a, script_region_b)
        self.assertTrue(script_region_a == script_region_b)
        self.assertFalse(script_region_a == script_region_c)
        self.assertFalse(script_region_a == script_region_d)
        self.assertFalse(script_region_a == 42)
Ejemplo n.º 2
0
    def test_script_get_scripts_for_line(self):
        script_a = Script(
            name='a',
            regions=[
                TextRegion(content='>c\n>d'),
            ],
        )
        script_b = Script(
            name='b',
            regions=[
                TextRegion(content='>f\n>g'),
            ],
        )
        script = Script(
            name='foo',
            regions=[
                TextRegion(content='a'),
                TextRegion(content='b'),
                ScriptRegion(
                    script=script_a,
                    content='%include "a"',
                ),
                TextRegion(content='e'),
                ScriptRegion(
                    script=script_b,
                    content='%include "b"',
                ),
                # Next script inclusion will be ignored as the script was
                # already included.
                # It won't be possible to get an error from this inclusion line
                # so we expect a like skip.
                ScriptRegion(
                    script=script_a,
                    content='%include "a"',
                ),
                TextRegion(content='h\ni\nj'),
            ],
        )

        get_scripts_for_line = script.get_scripts_for_line

        with self.assertRaises(ValueError):
            get_scripts_for_line(0)

        self.assertEqual([(script, 1)], get_scripts_for_line(1))
        self.assertEqual([(script, 2)], get_scripts_for_line(2))
        self.assertEqual([(script, 3), (script_a, 1)], get_scripts_for_line(3))
        self.assertEqual([(script, 3), (script_a, 2)], get_scripts_for_line(4))
        self.assertEqual([(script, 4)], get_scripts_for_line(5))
        self.assertEqual([(script, 5), (script_b, 1)], get_scripts_for_line(6))
        self.assertEqual([(script, 5), (script_b, 2)], get_scripts_for_line(7))
        # Here goes the line skip.
        self.assertEqual([(script, 7)], get_scripts_for_line(8))
        self.assertEqual([(script, 8)], get_scripts_for_line(9))
        self.assertEqual([(script, 9)], get_scripts_for_line(10))

        with self.assertRaises(ValueError):
            get_scripts_for_line(11)
Ejemplo n.º 3
0
    def test_script_get_line_info_multiple_includes(self):
        name = 'a'
        c_regions = [
            TextRegion(content='4\n5\n6'),
        ]
        c_script = Script(
            name='c',
            regions=c_regions,
        )
        b_regions = [
            TextRegion(content='1\n2\n3'),
            ScriptRegion(
                script=c_script,
                content='%include "c"',
            ),
        ]
        b_script = Script(
            name='b',
            regions=b_regions,
        )
        a_regions = [
            ScriptRegion(
                script=b_script,
                content='%include "b"',
            ),
            ScriptRegion(
                script=c_script,
                content='%include "c"',
            ),
            ScriptRegion(
                script=c_script,
                content='%include "c"',
            ),
            TextRegion(content='7'),
        ]
        script = Script(
            name=name,
            regions=a_regions,
        )

        get_line_info = script.get_line_info

        with self.assertRaises(ValueError):
            get_line_info(0)

        self.assertEqual((1, 1, 1, 1, 1, 6, a_regions[0]), get_line_info(1))
        self.assertEqual((1, 1, 1, 1, 2, 6, a_regions[0]), get_line_info(2))
        self.assertEqual((1, 1, 1, 1, 3, 6, a_regions[0]), get_line_info(3))
        self.assertEqual((1, 1, 1, 1, 4, 6, a_regions[0]), get_line_info(4))
        self.assertEqual((1, 1, 1, 1, 5, 6, a_regions[0]), get_line_info(5))
        self.assertEqual((1, 1, 1, 1, 6, 6, a_regions[0]), get_line_info(6))
        self.assertEqual((4, 4, 1, 7, 7, 1, a_regions[3]), get_line_info(7))

        with self.assertRaises(ValueError):
            get_line_info(8)
Ejemplo n.º 4
0
    def test_script_region_as_string(self):
        name = 'foo'
        regions = [
            TextRegion(content='a'),
            TextRegion(content='b'),
        ]
        script = Script(
            name=name,
            regions=regions,
        )
        script_region = ScriptRegion(
            script=script,
            content='%include "foo"',
        )
        render_context = MagicMock()
        result = script_region.render(context=render_context)

        render_context.render_script.assert_called_once_with(script=script)
        self.assertEqual(render_context.render_script.return_value, result)
Ejemplo n.º 5
0
    def test_script_region_as_string(self):
        name = 'foo'
        regions = [
            TextRegion(content='a'),
            TextRegion(content='b'),
        ]
        script = Script(
            name=name,
            regions=regions,
        )
        script_region = ScriptRegion(
            script=script,
            content='%include "foo"',
        )
        render_context = MagicMock()
        result = script_region.render(context=render_context)

        render_context.render_script.assert_called_once_with(script=script)
        self.assertEqual(render_context.render_script.return_value, result)
Ejemplo n.º 6
0
    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,
        )
Ejemplo n.º 7
0
    def test_script_render_with_duplicate_includes_pragma_once(self):
        subsubscript = Script(
            name='a',
            regions=[
                TextRegion(content='a'),
            ],
        )
        subsubscript.multiple_inclusion = False
        subscript = Script(
            name='b',
            regions=[
                TextRegion(content='b'),
                ScriptRegion(
                    script=subsubscript,
                    content='%include "a"',
                ),
            ],
        )
        subscript.multiple_inclusion = False
        script = Script(
            name='c',
            regions=[
                ScriptRegion(
                    script=subsubscript,
                    content='%include "a"',
                ),
                ScriptRegion(
                    script=subscript,
                    content='%include "b"',
                ),
                ScriptRegion(
                    script=subscript,
                    content='%include "b"',
                ),
            ],
        )
        script.multiple_inclusion = False

        self.assertEqual('a\nb', script.render())
Ejemplo n.º 8
0
    def test_script_render_with_duplicate_includes(self):
        subsubscript = Script(
            name='a',
            regions=[
                TextRegion(content='a'),
            ],
        )
        subscript = Script(
            name='b',
            regions=[
                TextRegion(content='b'),
                ScriptRegion(
                    script=subsubscript,
                    content='%include "a"',
                ),
            ],
        )
        script = Script(
            name='c',
            regions=[
                ScriptRegion(
                    script=subsubscript,
                    content='%include "a"',
                ),
                ScriptRegion(
                    script=subscript,
                    content='%include "b"',
                ),
                ScriptRegion(
                    script=subscript,
                    content='%include "b"',
                ),
            ],
        )

        self.assertEqual('a\nb\na\nb\na', script.render())
Ejemplo n.º 9
0
    def test_script_region_instanciation(self):
        name = 'foo'
        regions = [
            TextRegion(content='a'),
        ]
        script = Script(
            name=name,
            regions=regions,
        )
        script_region = ScriptRegion(
            script=script,
            content='%include "foo"',
        )

        self.assertEqual(script, script_region.script)
Ejemplo n.º 10
0
    def test_script_instanciation_with_args(self):
        name = 'foo'
        subregions = [
            ArgumentRegion(
                name="arg2",
                index=1,
                type_='string',
                content='%arg arg2',
            ),
            TextRegion(content='local b = 0;'),
        ]
        regions = [
            ArgumentRegion(
                name="arg1",
                index=1,
                type_='string',
                content='%arg arg1',
            ),
            TextRegion(content='a'),
            ScriptRegion(
                script=Script(
                    name='bar',
                    regions=subregions,
                ),
                content='%include "bar"',
            ),
            ArgumentRegion(
                name="arg3",
                index=3,
                type_='integer',
                content='%arg arg3 integer',
            ),
        ]
        script = Script(
            name=name,
            regions=regions,
        )

        self.assertEqual(
            [
                ("arg1", str),
                ("arg2", str),
                ("arg3", int),
            ],
            script.args,
        )
Ejemplo n.º 11
0
    def test_script_region_line_count(self):
        name = 'foo'
        regions = [
            TextRegion(content='a'),
            TextRegion(content='b'),
        ]
        script = Script(
            name=name,
            regions=regions,
        )
        script_region = ScriptRegion(
            script=script,
            content='%include "foo"',
        )

        self.assertEqual(script.line_count, script_region.line_count)
        self.assertEqual(1, script_region.real_line_count)
Ejemplo n.º 12
0
    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,
        )
Ejemplo n.º 13
0
    def test_script_region_representation(self):
        name = 'foo'
        regions = [
            TextRegion(content='a'),
        ]
        script = Script(
            name=name,
            regions=regions,
        )
        script_region = ScriptRegion(
            script=script,
            content='%include "foo"',
        )

        self.assertEqual(
            ("ScriptRegion(real_line_count=1, line_count=1, "
             "script='foo.lua', content='%include \"foo\"')"),
            repr(script_region),
        )
Ejemplo n.º 14
0
    def test_script_instanciation_with_keys(self):
        name = 'foo'
        subregions = [
            KeyRegion(
                name="key2",
                index=1,
                content='%key key2',
            ),
            TextRegion(content='local b = 0;'),
        ]
        regions = [
            KeyRegion(
                name="key1",
                index=1,
                content='%key key1',
            ),
            TextRegion(content='a'),
            ScriptRegion(
                script=Script(
                    name='bar',
                    regions=subregions,
                ),
                content='%include "bar"',
            ),
            KeyRegion(
                name="key3",
                index=3,
                content='%key key3',
            ),
        ]
        script = Script(
            name=name,
            regions=regions,
        )

        self.assertEqual(
            [
                "key1",
                "key2",
                "key3",
            ],
            script.keys,
        )
Ejemplo n.º 15
0
    def test_script_region_keys(self):
        name = 'foo'
        regions = [
            KeyRegion(
                name='key1',
                index=1,
                content='%key key1',
            ),
            TextRegion(content='b'),
        ]
        script = Script(
            name=name,
            regions=regions,
        )
        script_region = ScriptRegion(
            script=script,
            content='%include "foo"',
        )

        self.assertEqual(script.keys, script_region.keys)
Ejemplo n.º 16
0
    def test_script_region_arguments(self):
        name = 'foo'
        regions = [
            ArgumentRegion(
                name='arg1',
                index=1,
                type_='string',
                content='%arg arg1',
            ),
            TextRegion(content='b'),
        ]
        script = Script(
            name=name,
            regions=regions,
        )
        script_region = ScriptRegion(
            script=script,
            content='%include "foo"',
        )

        self.assertEqual(script.args, script_region.args)
Ejemplo n.º 17
0
    def test_script_get_line_info(self):
        name = 'foo'
        subregions = [
            TextRegion(content='e\nf\ng'),
        ]
        regions = [
            TextRegion(content='a'),
            TextRegion(content='b'),
            TextRegion(content='c\nd'),
            ScriptRegion(
                script=Script(
                    name='bar',
                    regions=subregions,
                ),
                content='%include "bar"',
            ),
            TextRegion(content='h'),
        ]
        script = Script(
            name=name,
            regions=regions,
        )

        get_line_info = script.get_line_info

        with self.assertRaises(ValueError):
            get_line_info(0)

        self.assertEqual((1, 1, 1, 1, 1, 1, regions[0]), get_line_info(1))
        self.assertEqual((2, 2, 1, 2, 2, 1, regions[1]), get_line_info(2))
        self.assertEqual((3, 3, 2, 3, 3, 2, regions[2]), get_line_info(3))
        self.assertEqual((3, 4, 2, 3, 4, 2, regions[2]), get_line_info(4))
        self.assertEqual((5, 5, 1, 5, 5, 3, regions[3]), get_line_info(5))
        self.assertEqual((5, 5, 1, 5, 6, 3, regions[3]), get_line_info(6))
        self.assertEqual((5, 5, 1, 5, 7, 3, regions[3]), get_line_info(7))
        self.assertEqual((6, 6, 1, 8, 8, 1, regions[4]), get_line_info(8))

        with self.assertRaises(ValueError):
            get_line_info(9)
Ejemplo n.º 18
0
    def test_script_get_real_line_content(self):
        name = 'foo'
        subregions = [
            TextRegion(content='e\nf\ng'),
        ]
        regions = [
            TextRegion(content='a'),
            TextRegion(content='b'),
            TextRegion(content='c\nd'),
            ScriptRegion(
                script=Script(
                    name='bar',
                    regions=subregions,
                ),
                content='%include "bar"',
            ),
            TextRegion(content='h'),
        ]
        script = Script(
            name=name,
            regions=regions,
        )

        with self.assertRaises(ValueError):
            script.get_real_line_content(0)

        self.assertEqual('a', script.get_real_line_content(1))
        self.assertEqual('b', script.get_real_line_content(2))
        self.assertEqual('c', script.get_real_line_content(3))
        self.assertEqual('d', script.get_real_line_content(4))
        self.assertEqual('%include "bar"', script.get_real_line_content(5))
        self.assertEqual('%include "bar"', script.get_real_line_content(6))
        self.assertEqual('%include "bar"', script.get_real_line_content(7))
        self.assertEqual('h', script.get_real_line_content(8))

        with self.assertRaises(ValueError):
            script.get_real_line_content(9)
Ejemplo n.º 19
0
    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,
        )
Ejemplo n.º 20
0
    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,
        )
Ejemplo n.º 21
0
    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,
        )
Ejemplo n.º 22
0
    def test_script_render_with_duplicate_includes_nested_args(self):
        script_a = Script(
            name='a',
            regions=[
                ArgumentRegion(
                    name='arg1',
                    type_='string',
                    index=1,
                    content='%arg arg1',
                ),
            ],
        )
        script_b = Script(
            name='b',
            regions=[
                ArgumentRegion(
                    name='arg2',
                    type_='string',
                    index=1,
                    content='%arg arg2',
                ),
            ],
        )
        script_c = Script(
            name='c',
            regions=[
                ArgumentRegion(
                    name='arg3',
                    type_='string',
                    index=1,
                    content='%arg arg3',
                ),
            ],
        )
        script_d = Script(
            name='d',
            regions=[
                ScriptRegion(
                    script=script_c,
                    content='%include "c"',
                ),
                ArgumentRegion(
                    name='arg4',
                    type_='string',
                    index=2,
                    content='%arg arg4',
                ),
            ],
        )
        script = Script(
            name='abcd',
            regions=[
                ScriptRegion(
                    script=script_a,
                    content='%include "a"',
                ),
                ScriptRegion(
                    script=script_b,
                    content='%include "b"',
                ),
                ScriptRegion(
                    script=script_d,
                    content='%include "d"',
                ),
            ],
        )

        self.assertEqual(
            [
                'local arg1 = ARGV[1]',
                'local arg2 = ARGV[2]',
                'local arg3 = ARGV[3]',
                'local arg4 = ARGV[4]',
            ],
            script.render().split('\n'),
        )
Ejemplo n.º 23
0
    def test_script_render_with_duplicate_includes_nested_keys(self):
        script_a = Script(
            name='a',
            regions=[
                KeyRegion(
                    name='key1',
                    index=1,
                    content='%key key1',
                ),
            ],
        )
        script_b = Script(
            name='b',
            regions=[
                KeyRegion(
                    name='key2',
                    index=1,
                    content='%key key2',
                ),
            ],
        )
        script_c = Script(
            name='c',
            regions=[
                KeyRegion(
                    name='key3',
                    index=1,
                    content='%key key3',
                ),
            ],
        )
        script_d = Script(
            name='d',
            regions=[
                ScriptRegion(
                    script=script_c,
                    content='%include "c"',
                ),
                KeyRegion(
                    name='key4',
                    index=2,
                    content='%key key4',
                ),
            ],
        )
        script = Script(
            name='abcd',
            regions=[
                ScriptRegion(
                    script=script_a,
                    content='%include "a"',
                ),
                ScriptRegion(
                    script=script_b,
                    content='%include "b"',
                ),
                ScriptRegion(
                    script=script_d,
                    content='%include "d"',
                ),
            ],
        )

        self.assertEqual(
            [
                'local key1 = KEYS[1]',
                'local key2 = KEYS[2]',
                'local key3 = KEYS[3]',
                'local key4 = KEYS[4]',
            ],
            script.render().split('\n'),
        )
Ejemplo n.º 24
0
    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[:],
        )