mosaicode/tests/control/test_codegenerator.py

121 lines
3.7 KiB
Python

# -*- coding: utf-8 -*-
"""
Tests for CodeGenerator class.
Migrated from unittest/TestBase to pytest.
"""
import pytest
import tempfile
import shutil
from pathlib import Path
from unittest.mock import Mock, patch, MagicMock
from mosaicode.control.codegenerator import CodeGenerator
@pytest.fixture
def temp_dir():
"""Create temporary directory for tests."""
test_dir = Path(tempfile.mkdtemp(prefix="mosaicode_test_"))
yield test_dir
if test_dir.exists():
shutil.rmtree(test_dir)
@pytest.fixture
def diagram():
"""Create a basic diagram for testing."""
from mosaicode.model.diagrammodel import DiagramModel
return DiagramModel()
@pytest.fixture
def code_generator(diagram):
"""Create a CodeGenerator instance."""
return CodeGenerator(diagram)
@pytest.fixture
def block():
"""Create a basic block for testing."""
from mosaicode.model.blockmodel import BlockModel
return BlockModel()
@pytest.fixture
def port():
"""Create a basic port for testing."""
from mosaicode.model.port import Port
return Port()
@pytest.fixture
def connection():
"""Create a basic connection for testing."""
from mosaicode.model.connectionmodel import ConnectionModel
from mosaicode.model.blockmodel import BlockModel
from mosaicode.model.port import Port
# Create a basic connection with required parameters
block1 = BlockModel()
block2 = BlockModel()
port1 = Port()
port2 = Port()
connection = ConnectionModel(diagram=None, output=block1, output_port=port1, input=block2, input_port=port2)
return connection
def create_diagram_with_blocks(diagram, block, connection):
"""Create a diagram with test blocks."""
from mosaicode.model.blockmodel import BlockModel
# Add test blocks
block1 = block
block1.id = 1
block1.type = "test.block1"
block1.label = "Block 1"
block1.codes = {"function": "print('Hello from block 1')"}
block2 = BlockModel()
block2.id = 2
block2.type = "test.block2"
block2.label = "Block 2"
block2.codes = {"function": "print('Hello from block 2')"}
diagram.blocks = {"1": block1, "2": block2}
return diagram
def test_code_generator_initialization(code_generator, diagram):
"""Test CodeGenerator initialization."""
assert code_generator is not None
assert code_generator._CodeGenerator__diagram == diagram
assert code_generator._CodeGenerator__block_list == []
assert code_generator._CodeGenerator__connections == []
assert code_generator._CodeGenerator__codes == {}
def test_generate_code_integration(diagram, block, connection):
"""Test complete code generation integration."""
diagram = create_diagram_with_blocks(diagram, block, connection)
code_generator = CodeGenerator(diagram)
# Test complete code generation
result = code_generator.generate_code()
assert isinstance(result, dict)
def test_generate_code_empty_diagram(diagram):
"""Test code generation with empty diagram."""
empty_diagram = diagram
empty_diagram.blocks = {}
empty_diagram.connectors = []
code_generator = CodeGenerator(empty_diagram)
result = code_generator.generate_code()
assert isinstance(result, dict)
def test_generate_code_with_errors(diagram, block, connection):
"""Test code generation error handling."""
diagram = create_diagram_with_blocks(diagram, block, connection)
# Create block with invalid code
block = diagram.blocks["1"]
block.codes = {"function": "$invalid_property$"}
code_generator = CodeGenerator(diagram)
# Should not raise exception, should handle gracefully
result = code_generator.generate_code()
assert isinstance(result, dict)