예제 #1
0
    def test_read_nonexistent_file(self):
        grammar = AntlrGrammar(pathlib.Path('FooBar.g4'))

        # check if DistutilsFileError was thrown
        with pytest.raises(distutils.errors.DistutilsFileError) as excinfo:
            grammar.read_imports()
        assert excinfo.match('FooBar.g4')
예제 #2
0
    def test_read_nonexistent_file(self):
        grammar = AntlrGrammar(pathlib.Path('FooBar.g4'))

        # check if DistutilsFileError was thrown
        with pytest.raises(distutils.errors.DistutilsFileError) as excinfo:
            grammar.read_imports()
        assert excinfo.match('FooBar.g4')
예제 #3
0
    def test_run_grammars_multiple(self, mock_run, configured_command):
        mock_run.return_value = unittest.mock.Mock(returncode=0)

        configured_command._find_grammars = unittest.mock.Mock(return_value=[
            AntlrGrammar(pathlib.Path('Foo.g4')),
            AntlrGrammar(pathlib.Path('Bar.g4'))
        ])

        configured_command.grammars = ['Foo']
        configured_command.run()

        args, _ = mock_run.call_args
        assert mock_run.call_count == 1
        assert 'Foo.g4' in args[0]
예제 #4
0
    def test_run_package_exists(self, mock_find_grammars, mock_run,
                                mock_find_antlr, mock_find_java, tmpdir,
                                command):
        java_exe = pathlib.Path('c:/path/to/java/bin/java.exe')
        antlr_jar = pathlib.Path('antlr-4.5.3-complete.jar')
        mock_find_java.return_value = java_exe
        mock_find_antlr.return_value = antlr_jar

        grammar = AntlrGrammar(pathlib.Path('SomeGrammar.g4'))
        mock_find_grammars.return_value = [grammar]
        mock_run.return_value = unittest.mock.Mock(returncode=0)

        gen_dir = str(tmpdir.mkdir('gen'))
        package_dir = pathlib.Path(gen_dir, 'some_grammar')
        package_dir.mkdir()

        init_file = pathlib.Path(package_dir, '__init__.py')
        init_file.open('wt').close()

        origin_mtime_ns = init_file.stat().st_mtime_ns

        command.output['default'] = gen_dir
        command.run()

        assert init_file.stat().st_mtime_ns == origin_mtime_ns
예제 #5
0
    def test_find_grammars_distributed(self, command):
        grammars = command._find_grammars(pathlib.Path('distributed'))

        common_terminals = AntlrGrammar(
            pathlib.Path('distributed/CommonTerminals.g4'))
        shared_rules = AntlrGrammar(pathlib.Path('distributed/SharedRules.g4'))
        some_grammar = AntlrGrammar(pathlib.Path('distributed/SomeGrammar.g4'))

        shared_rules.dependencies.append(common_terminals)
        some_grammar.dependencies.append(common_terminals)
        some_grammar.dependencies.append(shared_rules)

        assert len(grammars) == 3
        assert common_terminals in grammars
        assert shared_rules in grammars
        assert some_grammar in grammars
예제 #6
0
    def test_find_grammars_standalone(self, command):
        grammars = command._find_grammars(pathlib.Path('standalone'))

        some_grammar = AntlrGrammar(pathlib.Path('standalone/SomeGrammar.g4'))

        assert len(grammars) == 1
        assert some_grammar in grammars
예제 #7
0
    def test_run_grammars_not_found(self, mock_run, configured_command):
        mock_run.return_value = unittest.mock.Mock(returncode=0)

        configured_command._find_grammars = unittest.mock.Mock(
            return_value=[AntlrGrammar(pathlib.Path('Foo.g4'))])

        configured_command.grammars = ['Bar']
        configured_command.run()

        assert mock_run.call_count == 0
예제 #8
0
    def test_run_multiple_library_location(self, mock_find_grammars, mock_run, mock_find_antlr,
                                           mock_find_java, tmpdir, command):
        java_exe = pathlib.Path('c:/path/to/java/bin/java.exe')
        antlr_jar = pathlib.Path('antlr-4.5.3-complete.jar')
        mock_find_java.return_value = java_exe
        mock_find_antlr.return_value = antlr_jar

        grammar = AntlrGrammar(pathlib.Path('SomeGrammar.g4'))
        grammar.dependencies = [
            AntlrGrammar(pathlib.Path('terminals/common.g4')),
            AntlrGrammar(pathlib.Path('rules/common.g4'))
        ]
        mock_find_grammars.return_value = [grammar]
        mock_run.return_value = unittest.mock.Mock(returncode=0)

        command.output['default'] = str(tmpdir.mkdir('gen'))

        with pytest.raises(distutils.errors.DistutilsOptionError) as excinfo:
            command.run()
        assert excinfo.match('Imported grammars of \'SomeGrammar\' are located in more than one '
                             'directory.')
예제 #9
0
    def test_run_one_library_location(self, mock_find_grammars, mock_run, mock_find_antlr,
                                      mock_find_java, tmpdir, command):
        java_exe = pathlib.Path('c:/path/to/java/bin/java.exe')
        antlr_jar = pathlib.Path('antlr-4.5.3-complete.jar')
        mock_find_java.return_value = java_exe
        mock_find_antlr.return_value = antlr_jar

        grammar = AntlrGrammar(pathlib.Path('SomeGrammar.g4'))
        grammar.dependencies = [
            AntlrGrammar(pathlib.Path('shared/CommonTerminals.g4'))
        ]
        mock_find_grammars.return_value = [grammar]
        mock_run.return_value = unittest.mock.Mock(returncode=0)

        command.output['default'] = str(tmpdir.mkdir('gen'))
        command.run()

        args, _ = mock_run.call_args
        assert mock_run.called
        assert '-lib' in args[0]
        assert any(a.endswith('shared') for a in args[0])
예제 #10
0
    def test_run_one_library_location(self, mock_find_grammars, mock_run,
                                      mock_find_antlr, mock_find_java, tmpdir,
                                      command):
        java_exe = pathlib.Path('c:/path/to/java/bin/java.exe')
        antlr_jar = pathlib.Path('antlr-4.5.3-complete.jar')
        mock_find_java.return_value = java_exe
        mock_find_antlr.return_value = antlr_jar

        grammar = AntlrGrammar(pathlib.Path('SomeGrammar.g4'))
        grammar.dependencies = [
            AntlrGrammar(pathlib.Path('shared/CommonTerminals.g4'))
        ]
        mock_find_grammars.return_value = [grammar]
        mock_run.return_value = unittest.mock.Mock(returncode=0)

        command.output['default'] = str(tmpdir.mkdir('gen'))
        command.run()

        args, _ = mock_run.call_args
        assert mock_run.called
        assert '-lib' in args[0]
        assert any(a.endswith('shared') for a in args[0])
예제 #11
0
    def test_run_multiple_library_location(self, mock_find_grammars, mock_run,
                                           mock_find_antlr, mock_find_java,
                                           tmpdir, command):
        java_exe = pathlib.Path('c:/path/to/java/bin/java.exe')
        antlr_jar = pathlib.Path('antlr-4.5.3-complete.jar')
        mock_find_java.return_value = java_exe
        mock_find_antlr.return_value = antlr_jar

        grammar = AntlrGrammar(pathlib.Path('SomeGrammar.g4'))
        grammar.dependencies = [
            AntlrGrammar(pathlib.Path('terminals/common.g4')),
            AntlrGrammar(pathlib.Path('rules/common.g4'))
        ]
        mock_find_grammars.return_value = [grammar]
        mock_run.return_value = unittest.mock.Mock(returncode=0)

        command.output['default'] = str(tmpdir.mkdir('gen'))

        with pytest.raises(distutils.errors.DistutilsOptionError) as excinfo:
            command.run()
        assert excinfo.match(
            'Imported grammars of \'SomeGrammar\' are located in more than one directory.'
        )
예제 #12
0
    def configured_command(self, monkeypatch, tmpdir, command):
        command._find_antlr = unittest.mock.Mock(
            return_value=pathlib.Path('antlr-4.5.3-complete.jar'))
        command._find_grammars = unittest.mock.Mock(return_value=[
            AntlrGrammar(pathlib.Path('standalone/SomeGrammar.g4'))
        ])
        command.output['default'] = str(tmpdir.mkdir('gen'))

        monkeypatch.setattr(
            setuptools_antlr.command, 'find_java',
            unittest.mock.Mock(
                return_value=pathlib.Path('c:/path/to/java/bin/java.exe')))

        return command
예제 #13
0
    def test_run_custom_output_dir(self, mock_run, configured_command):
        mock_run.return_value = unittest.mock.Mock(returncode=0)

        configured_command._find_grammars = unittest.mock.Mock(return_value=[
            AntlrGrammar(pathlib.Path('Foo.g4')),
        ])

        custom_output_dir = 'build/lib/custom'
        configured_command.output['Foo'] = custom_output_dir
        configured_command.run()

        args, _ = mock_run.call_args
        assert mock_run.call_count == 1
        custom_package_path = pathlib.Path(custom_output_dir, 'foo').absolute()
        assert any(custom_package_path == pathlib.Path(a) for a in args[0])
예제 #14
0
    def test_run_java_found(self, mock_find_grammars, mock_run, mock_find_java,
                            tmpdir, command):
        java_exe = pathlib.Path('c:/path/to/java/bin/java.exe')

        mock_find_java.return_value = java_exe
        mock_find_grammars.return_value = [
            AntlrGrammar(pathlib.Path('standalone/SomeGrammar.g4'))
        ]
        mock_run.return_value = subprocess.CompletedProcess([], 0)

        command.output['default'] = str(tmpdir.mkdir('gen'))
        command.run()

        args, _ = mock_run.call_args
        assert mock_run.called
        assert str(java_exe) in args[0]
        assert '-jar' in args[0]
예제 #15
0
    def test_run_antlr_found(self, mock_find_grammars, mock_run,
                             mock_find_antlr, mock_find_java, tmpdir, command):
        java_exe = pathlib.Path('c:/path/to/java/bin/java.exe')
        antlr_jar = pathlib.Path('antlr-4.5.3-complete.jar')

        mock_find_java.return_value = java_exe
        mock_find_antlr.return_value = antlr_jar
        mock_find_grammars.return_value = [
            AntlrGrammar(pathlib.Path('standalone/SomeGrammar.g4'))
        ]
        mock_run.return_value = unittest.mock.Mock(returncode=0)

        command.output['default'] = str(tmpdir.mkdir('gen'))
        command.run()

        args, _ = mock_run.call_args
        assert mock_run.called
        assert str(antlr_jar) in args[0]
예제 #16
0
    def test_run_package_not_exists(self, mock_find_grammars, mock_run,
                                    mock_find_antlr, mock_find_java, tmpdir,
                                    command):
        java_exe = pathlib.Path('c:/path/to/java/bin/java.exe')
        antlr_jar = pathlib.Path('antlr-4.5.3-complete.jar')
        mock_find_java.return_value = java_exe
        mock_find_antlr.return_value = antlr_jar

        grammar = AntlrGrammar(pathlib.Path('SomeGrammar.g4'))
        mock_find_grammars.return_value = [grammar]
        mock_run.return_value = unittest.mock.Mock(returncode=0)

        base_dir = str(tmpdir.mkdir('base'))
        package_dir = pathlib.Path(base_dir, 'some_grammar')

        package_init_file = pathlib.Path(package_dir, '__init__.py')

        command.output['default'] = base_dir
        os.chdir(str(base_dir))

        command.run()

        assert package_init_file.exists()
예제 #17
0
    def test_read_with_imports(self):
        grammar = AntlrGrammar(pathlib.Path('distributed', 'SomeGrammar.g4'))
        imports = set(grammar.read_imports())

        assert len(imports) == 2
        assert {'CommonTerminals', 'SharedRules'} == imports
예제 #18
0
    def test_read_without_imports(self):
        grammar = AntlrGrammar(pathlib.Path('distributed', 'CommonTerminals.g4'))
        imports = grammar.read_imports()

        assert not imports
예제 #19
0
    def test_read_without_imports(self):
        grammar = AntlrGrammar(
            pathlib.Path('distributed', 'CommonTerminals.g4'))
        imports = grammar.read_imports()

        assert not imports
예제 #20
0
    def test_read_with_imports(self):
        grammar = AntlrGrammar(pathlib.Path('distributed', 'SomeGrammar.g4'))
        imports = set(grammar.read_imports())

        assert len(imports) == 2
        assert {'CommonTerminals', 'SharedRules'} == imports