@hybridlabor-api/bdb-hardware-pcb 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +116 -0
- package/config/mcp/antigravity.json +22 -0
- package/config/mcp/claude.json +22 -0
- package/config/mcp/codex.toml +25 -0
- package/docs/adr/ADR-001-KICAD-OPENSCAD-MCP-STRATEGY.md +334 -0
- package/docs/review_documentation.md +121 -0
- package/installer.js +358 -0
- package/mcp_servers/kicad-mcp-server/.env.example +22 -0
- package/mcp_servers/kicad-mcp-server/.github/workflows/ci.yml +36 -0
- package/mcp_servers/kicad-mcp-server/CLAUDE.md +487 -0
- package/mcp_servers/kicad-mcp-server/README.md +316 -0
- package/mcp_servers/kicad-mcp-server/docs/DEVICE_TREE.md +416 -0
- package/mcp_servers/kicad-mcp-server/docs/INSTALLATION.md +332 -0
- package/mcp_servers/kicad-mcp-server/docs/PIN_ANALYSIS.md +332 -0
- package/mcp_servers/kicad-mcp-server/docs/README.md +240 -0
- package/mcp_servers/kicad-mcp-server/docs/TESTING.md +613 -0
- package/mcp_servers/kicad-mcp-server/docs/VALIDATION.md +268 -0
- package/mcp_servers/kicad-mcp-server/pyproject.toml +96 -0
- package/mcp_servers/kicad-mcp-server/requirements-dev.txt +16 -0
- package/mcp_servers/kicad-mcp-server/requirements-test.txt +24 -0
- package/mcp_servers/kicad-mcp-server/requirements.txt +13 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/__init__.py +3 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/__main__.py +17 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/config.py +46 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/models/__init__.py +1 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/models/types.py +87 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/parsers/__init__.py +1 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/parsers/netlist_parser.py +234 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/parsers/pcb_parser.py +375 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/parsers/pcb_parser_kicad.py +327 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/parsers/schematic_parser.py +902 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/server.py +71 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/__init__.py +1 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/arduino/connectivity_test.cpp.j2 +189 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/device_tree/atmega.dts.j2 +77 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/device_tree/esp32.dts.j2 +77 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/device_tree/nrf52.dts.j2 +77 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/device_tree/stm32f4.dts.j2 +89 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/esp_idf/test_suite.c.j2 +340 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/pytest/test_connectivity.py.j2 +147 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/st_hal/hal_test.c.j2 +313 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/pytest_gpio_test.py.j2 +99 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/pytest_i2c_test.py.j2 +117 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/pytest_pinmux_test.py.j2 +43 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/pytest_spi_test.py.j2 +94 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/unity_gpio_test.c.j2 +113 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/unity_i2c_test.c.j2 +101 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/unity_spi_test.c.j2 +94 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/unittest/test_schematic.py.j2 +172 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/__init__.py +36 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/device_tree.py +1187 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/hierarchical_analysis.py +211 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/netlist.py +320 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/parts_registry.py +142 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/pcb.py +955 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/pcb_layout.py +308 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/pin_analysis.py +765 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/project.py +196 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/schematic.py +319 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/schematic_editor.py +674 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/schematic_search.py +158 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/validation.py +866 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/visualization.py +225 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/utils/__init__.py +1 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/utils/file_handlers.py +65 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/utils/kicad_cli.py +103 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/utils/kicad_version.py +103 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/utils/parts_registry.py +197 -0
- package/mcp_servers/kicad-mcp-server/tests/__init__.py +1 -0
- package/mcp_servers/kicad-mcp-server/tests/examples/ESP32S3_TEST.md +219 -0
- package/mcp_servers/kicad-mcp-server/tests/fixtures/README.md +65 -0
- package/mcp_servers/kicad-mcp-server/tests/fixtures/__init__.py +1 -0
- package/mcp_servers/kicad-mcp-server/tests/fixtures/example_pcb.kicad_pcb +177 -0
- package/mcp_servers/kicad-mcp-server/tests/fixtures/example_schematic.kicad_sch +145 -0
- package/mcp_servers/kicad-mcp-server/tests/fixtures/hier/child.kicad_sch +24 -0
- package/mcp_servers/kicad-mcp-server/tests/fixtures/hier/root.kicad_sch +38 -0
- package/mcp_servers/kicad-mcp-server/tests/test_tools/__init__.py +1 -0
- package/mcp_servers/kicad-mcp-server/tests/test_tools/test_hierarchical_labels.py +195 -0
- package/mcp_servers/kicad-mcp-server/tests/test_tools/test_kicad_cli.py +116 -0
- package/mcp_servers/kicad-mcp-server/tests/test_tools/test_netlist_cache_path.py +29 -0
- package/mcp_servers/kicad-mcp-server/tests/test_tools/test_schematic.py +189 -0
- package/mcp_servers/kicad-mcp-server/tests/test_tools/test_schematic_hierarchy.py +69 -0
- package/mcp_servers/kicad-mcp-server/tests/test_tools/test_visualization.py +136 -0
- package/mcp_servers/kicad-mcp-server/uv.lock +2873 -0
- package/mcp_servers/openscad-mcp-server/.dockerignore +9 -0
- package/mcp_servers/openscad-mcp-server/.github/workflows/test.yml +40 -0
- package/mcp_servers/openscad-mcp-server/Dockerfile +29 -0
- package/mcp_servers/openscad-mcp-server/LICENSE +21 -0
- package/mcp_servers/openscad-mcp-server/README.md +154 -0
- package/mcp_servers/openscad-mcp-server/docs/audit.md +56 -0
- package/mcp_servers/openscad-mcp-server/docs/docker.md +66 -0
- package/mcp_servers/openscad-mcp-server/docs/issue-followup.md +19 -0
- package/mcp_servers/openscad-mcp-server/docs/jetson.md +17 -0
- package/mcp_servers/openscad-mcp-server/glama.json +4 -0
- package/mcp_servers/openscad-mcp-server/legacy/README.md +15 -0
- package/mcp_servers/openscad-mcp-server/legacy/README.original.md +294 -0
- package/mcp_servers/openscad-mcp-server/legacy/implementation_plan.md +100 -0
- package/mcp_servers/openscad-mcp-server/legacy/old/download_sam2_checkpoint.py +115 -0
- package/mcp_servers/openscad-mcp-server/legacy/old/src/ai/sam_segmentation.py +209 -0
- package/mcp_servers/openscad-mcp-server/legacy/old/src/models/threestudio_generator.py +231 -0
- package/mcp_servers/openscad-mcp-server/legacy/old/src/workflow/image_to_model_pipeline.py +260 -0
- package/mcp_servers/openscad-mcp-server/legacy/old/test_sam2_segmentation.py +96 -0
- package/mcp_servers/openscad-mcp-server/legacy/requirements.txt +57 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/README.md +39 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/decisions/ai-driven-code-generation.md +122 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/decisions/export-formats.md +76 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/files/src/ai/ai_service.py.md +51 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/files/src/main.py.md +63 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/files/src/models/code_generator.py.md +63 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/files/src/nlp/parameter_extractor.py.md +63 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/knowledge/ai/natural-language-processing.md +78 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/knowledge/nlp/parameter-extraction.md +173 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/knowledge/openscad/export-formats.md +91 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/knowledge/openscad/openscad-basics.md +66 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/knowledge/openscad/primitive-testing.md +79 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/__init__.py +0 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/ai/ai_service.py +257 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/ai/gemini_api.py +161 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/ai/venice_api.py +203 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/config.py +121 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/main.py +1456 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/main.py.new +404 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/main_remote.py +401 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/models/__init__.py +0 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/models/code_generator.py +321 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/models/cuda_mvs.py +209 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/models/scad_templates/basic_shapes.scad +144 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/nlp/__init__.py +0 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/nlp/parameter_extractor.py +388 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/openscad_wrapper/__init__.py +0 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/openscad_wrapper/wrapper.py +418 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/printer_discovery/__init__.py +1 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/printer_discovery/printer_discovery.py +471 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/remote/connection_manager.py +537 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/remote/cuda_mvs_client.py +435 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/remote/cuda_mvs_server.py +787 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/remote/error_handling.py +415 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/testing/__init__.py +0 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/testing/primitive_tester.py +203 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/testing/test_primitives.py +98 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/utils/__init__.py +1 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/utils/cad_exporter.py +241 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/utils/format_validator.py +206 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/utils/stl_exporter.py +140 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/utils/stl_repair.py +91 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/utils/stl_validator.py +123 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/visualization/__init__.py +0 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/visualization/headless_renderer.py +52 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/visualization/renderer.py +177 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/visualization/web_interface.py +639 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/workflow/image_approval.py +148 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/workflow/multi_view_to_model_pipeline.py +338 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_complete_workflow.py +374 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_cuda_mvs.py +191 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_gemini_api.py +168 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_image_approval.py +192 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_image_approval_workflow.py +251 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_image_to_model_pipeline.py +145 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_model_selection.py +41 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_multi_view_pipeline.py +290 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_primitives.sh +13 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_rabbit_direct.py +71 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_remote_cuda_mvs.py +283 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_venice_example.py +69 -0
- package/mcp_servers/openscad-mcp-server/pyproject.toml +33 -0
- package/mcp_servers/openscad-mcp-server/requirements.txt +2 -0
- package/mcp_servers/openscad-mcp-server/scad/simple_cube.scad +2 -0
- package/mcp_servers/openscad-mcp-server/scripts/test_docker.py +220 -0
- package/mcp_servers/openscad-mcp-server/src/openscad_mcp/__init__.py +3 -0
- package/mcp_servers/openscad-mcp-server/src/openscad_mcp/__main__.py +3 -0
- package/mcp_servers/openscad-mcp-server/src/openscad_mcp/engine.py +94 -0
- package/mcp_servers/openscad-mcp-server/src/openscad_mcp/geometry.py +242 -0
- package/mcp_servers/openscad-mcp-server/src/openscad_mcp/server.py +245 -0
- package/mcp_servers/openscad-mcp-server/src/openscad_mcp/service.py +190 -0
- package/mcp_servers/openscad-mcp-server/tests/conftest.py +17 -0
- package/mcp_servers/openscad-mcp-server/tests/test_engine.py +37 -0
- package/mcp_servers/openscad-mcp-server/tests/test_geometry.py +106 -0
- package/mcp_servers/openscad-mcp-server/tests/test_integration.py +172 -0
- package/mcp_servers/openscad-mcp-server/tests/test_transports.py +314 -0
- package/mcp_servers/openscad-mcp-server/uv.lock +1123 -0
- package/package.json +44 -0
- package/scripts/install_mcps.sh +86 -0
- package/scripts/openscad_wrapper.sh +62 -0
- package/scripts/run_kicad_mcp.sh +25 -0
- package/scripts/run_openscad_mcp.sh +41 -0
- package/scripts/test_mcp_connection.py +626 -0
- package/scripts/test_mcp_connection.sh +168 -0
- package/skills/code-first-hardware-design/SKILL.md +260 -0
- package/skills/pcb-constraint-definition/SKILL.md +236 -0
- package/skills/pcb-layout-routing-automation/SKILL.md +153 -0
- package/skills/pcb-validation-dfm-signoff/SKILL.md +194 -0
- package/skills/schematic-datasheet-analysis/SKILL.md +202 -0
|
@@ -0,0 +1,613 @@
|
|
|
1
|
+
# Testing Guide for KiCad MCP Server
|
|
2
|
+
|
|
3
|
+
This guide will help you test all the newly implemented features of the KiCad MCP Server.
|
|
4
|
+
|
|
5
|
+
## Test Preparation
|
|
6
|
+
|
|
7
|
+
### 1. Install Dependencies
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
# Navigate to project directory
|
|
11
|
+
cd kicad-mcp-server
|
|
12
|
+
|
|
13
|
+
# Install core dependencies
|
|
14
|
+
pip install -r requirements.txt
|
|
15
|
+
|
|
16
|
+
# Install development dependencies
|
|
17
|
+
pip install -r requirements-dev.txt
|
|
18
|
+
|
|
19
|
+
# (Optional) Install hardware testing dependencies
|
|
20
|
+
pip install -r requirements-test.txt
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
### 2. Verify Installation
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
# Check Python version (requires 3.10+)
|
|
27
|
+
python --version
|
|
28
|
+
|
|
29
|
+
# Verify KiCad installation
|
|
30
|
+
kicad-cli --version
|
|
31
|
+
|
|
32
|
+
# Test Python environment imports
|
|
33
|
+
python -c "
|
|
34
|
+
from kicad_mcp_server.tools import validation, pin_analysis, device_tree, test_generation
|
|
35
|
+
print('OK All modules imported successfully')
|
|
36
|
+
"
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### 3. Prepare Test Files
|
|
40
|
+
|
|
41
|
+
If you don't have existing KiCad files, you can use sample files from the project or create simple test files:
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
# Create test directory
|
|
45
|
+
mkdir -p test_files
|
|
46
|
+
|
|
47
|
+
# Check for sample files
|
|
48
|
+
ls -la examples/
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## Basic Functionality Testing
|
|
52
|
+
|
|
53
|
+
### Test 1: Verify Module Imports
|
|
54
|
+
|
|
55
|
+
```python
|
|
56
|
+
# test_imports.py
|
|
57
|
+
def test_module_imports():
|
|
58
|
+
"""Test that all new modules can be imported correctly"""
|
|
59
|
+
try:
|
|
60
|
+
from kicad_mcp_server.tools import validation
|
|
61
|
+
from kicad_mcp_server.tools import pin_analysis
|
|
62
|
+
from kicad_mcp_server.tools import device_tree
|
|
63
|
+
from kicad_mcp_server.tools import test_generation
|
|
64
|
+
print("OK All modules imported successfully")
|
|
65
|
+
return True
|
|
66
|
+
except ImportError as e:
|
|
67
|
+
print(f"X Module import failed: {e}")
|
|
68
|
+
return False
|
|
69
|
+
|
|
70
|
+
if __name__ == "__main__":
|
|
71
|
+
test_module_imports()
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
Run test:
|
|
75
|
+
```bash
|
|
76
|
+
python test_imports.py
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### Test 2: Verify Tool Registration
|
|
80
|
+
|
|
81
|
+
```python
|
|
82
|
+
# test_tools_registration.py
|
|
83
|
+
def test_tools_registration():
|
|
84
|
+
"""Test that all MCP tools are correctly registered"""
|
|
85
|
+
from kicad_mcp_server.server import mcp
|
|
86
|
+
|
|
87
|
+
# Get all registered tools
|
|
88
|
+
tools = list(mcp._tools.values())
|
|
89
|
+
|
|
90
|
+
print(f"Total registered tools: {len(tools)}")
|
|
91
|
+
|
|
92
|
+
# Check new feature tools
|
|
93
|
+
expected_tools = [
|
|
94
|
+
'run_erc', 'run_drc', # Validation tools
|
|
95
|
+
'analyze_pin_functions', 'detect_pin_conflicts', # Pin analysis
|
|
96
|
+
'generate_device_tree', # Device tree
|
|
97
|
+
'generate_hardware_tests' # Test generation
|
|
98
|
+
]
|
|
99
|
+
|
|
100
|
+
tool_names = [tool.name for tool in tools]
|
|
101
|
+
missing_tools = []
|
|
102
|
+
|
|
103
|
+
for expected in expected_tools:
|
|
104
|
+
if expected in tool_names:
|
|
105
|
+
print(f"OK {expected} registered")
|
|
106
|
+
else:
|
|
107
|
+
print(f"X {expected} not found")
|
|
108
|
+
missing_tools.append(expected)
|
|
109
|
+
|
|
110
|
+
if not missing_tools:
|
|
111
|
+
print("OK All expected tools registered!")
|
|
112
|
+
return True
|
|
113
|
+
else:
|
|
114
|
+
print(f"WARN Missing tools: {missing_tools}")
|
|
115
|
+
return False
|
|
116
|
+
|
|
117
|
+
if __name__ == "__main__":
|
|
118
|
+
test_tools_registration()
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
Run test:
|
|
122
|
+
```bash
|
|
123
|
+
python test_tools_registration.py
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
## Functional Testing (Requires KiCad Files)
|
|
127
|
+
|
|
128
|
+
### Test 3: Design Rule Checking (DRC/ERC)
|
|
129
|
+
|
|
130
|
+
Create test script `test_validation.py`:
|
|
131
|
+
|
|
132
|
+
```python
|
|
133
|
+
import asyncio
|
|
134
|
+
from kicad_mcp_server.tools import validation
|
|
135
|
+
|
|
136
|
+
async def test_erc_functionality():
|
|
137
|
+
"""Test ERC functionality"""
|
|
138
|
+
# Replace with your schematic file path
|
|
139
|
+
schematic_path = "path/to/your/schematic.kicad_sch"
|
|
140
|
+
|
|
141
|
+
try:
|
|
142
|
+
result = await validation.run_erc(schematic_path)
|
|
143
|
+
print("ERC test results:")
|
|
144
|
+
print(result[:500] + "..." if len(result) > 500 else result)
|
|
145
|
+
return True
|
|
146
|
+
except Exception as e:
|
|
147
|
+
print(f"ERC test failed: {e}")
|
|
148
|
+
return False
|
|
149
|
+
|
|
150
|
+
async def test_drc_functionality():
|
|
151
|
+
"""Test DRC functionality"""
|
|
152
|
+
pcb_path = "path/to/your/pcb.kicad_pcb"
|
|
153
|
+
|
|
154
|
+
try:
|
|
155
|
+
result = await validation.run_drc(pcb_path)
|
|
156
|
+
print("DRC test results:")
|
|
157
|
+
print(result[:500] + "..." if len(result) > 500 else result)
|
|
158
|
+
return True
|
|
159
|
+
except Exception as e:
|
|
160
|
+
print(f"DRC test failed: {e}")
|
|
161
|
+
return False
|
|
162
|
+
|
|
163
|
+
if __name__ == "__main__":
|
|
164
|
+
asyncio.run(test_erc_functionality())
|
|
165
|
+
asyncio.run(test_drc_functionality())
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
### Test 4: Pin Function Analysis
|
|
169
|
+
|
|
170
|
+
Create test script `test_pin_analysis.py`:
|
|
171
|
+
|
|
172
|
+
```python
|
|
173
|
+
import asyncio
|
|
174
|
+
from kicad_mcp_server.tools import pin_analysis
|
|
175
|
+
|
|
176
|
+
async def test_pin_analysis():
|
|
177
|
+
"""Test pin analysis functionality"""
|
|
178
|
+
schematic_path = "path/to/your/schematic.kicad_sch"
|
|
179
|
+
|
|
180
|
+
try:
|
|
181
|
+
# Analyze pin functions
|
|
182
|
+
result = await pin_analysis.analyze_pin_functions(schematic_path)
|
|
183
|
+
print("Pin function analysis:")
|
|
184
|
+
print(result[:500] + "..." if len(result) > 500 else result)
|
|
185
|
+
|
|
186
|
+
# Detect pin conflicts
|
|
187
|
+
conflicts = await pin_analysis.detect_pin_conflicts(schematic_path)
|
|
188
|
+
print("\nPin conflict detection:")
|
|
189
|
+
print(conflicts[:500] + "..." if len(conflicts) > 500 else conflicts)
|
|
190
|
+
|
|
191
|
+
return True
|
|
192
|
+
except Exception as e:
|
|
193
|
+
print(f"Pin analysis test failed: {e}")
|
|
194
|
+
return False
|
|
195
|
+
|
|
196
|
+
if __name__ == "__main__":
|
|
197
|
+
asyncio.run(test_pin_analysis())
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
### Test 5: Device Tree Generation
|
|
201
|
+
|
|
202
|
+
Create test script `test_device_tree.py`:
|
|
203
|
+
|
|
204
|
+
```python
|
|
205
|
+
import asyncio
|
|
206
|
+
from kicad_mcp_server.tools import device_tree
|
|
207
|
+
|
|
208
|
+
async def test_device_tree_generation():
|
|
209
|
+
"""Test device tree generation functionality"""
|
|
210
|
+
schematic_path = "path/to/your/schematic.kicad_sch"
|
|
211
|
+
|
|
212
|
+
try:
|
|
213
|
+
# Validate pin configuration
|
|
214
|
+
validation = await device_tree.validate_pin_configuration(schematic_path)
|
|
215
|
+
print("Pin configuration validation:")
|
|
216
|
+
print(validation[:500] + "..." if len(validation) > 500 else validation)
|
|
217
|
+
|
|
218
|
+
# Generate device tree
|
|
219
|
+
if "OK" in validation:
|
|
220
|
+
result = await device_tree.generate_device_tree(
|
|
221
|
+
schematic_path=schematic_path,
|
|
222
|
+
target_soc="stm32f4",
|
|
223
|
+
output_path="test_output.dts"
|
|
224
|
+
)
|
|
225
|
+
print("\nDevice tree generation:")
|
|
226
|
+
print(result[:500] + "..." if len(result) > 500 else result)
|
|
227
|
+
return True
|
|
228
|
+
else:
|
|
229
|
+
print("WARN Design validation failed, skipping device tree generation")
|
|
230
|
+
return False
|
|
231
|
+
|
|
232
|
+
except Exception as e:
|
|
233
|
+
print(f"Device tree generation test failed: {e}")
|
|
234
|
+
return False
|
|
235
|
+
|
|
236
|
+
if __name__ == "__main__":
|
|
237
|
+
asyncio.run(test_device_tree_generation())
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
### Test 6: Test Code Generation
|
|
241
|
+
|
|
242
|
+
Create test script `test_test_generation.py`:
|
|
243
|
+
|
|
244
|
+
```python
|
|
245
|
+
import asyncio
|
|
246
|
+
from kicad_mcp_server.tools import test_generation
|
|
247
|
+
|
|
248
|
+
async def test_test_generation():
|
|
249
|
+
"""Test code generation functionality"""
|
|
250
|
+
schematic_path = "path/to/your/schematic.kicad_sch"
|
|
251
|
+
|
|
252
|
+
try:
|
|
253
|
+
# Generate hardware test suite
|
|
254
|
+
result = await test_generation.generate_hardware_tests(
|
|
255
|
+
schematic_path=schematic_path,
|
|
256
|
+
framework="pytest",
|
|
257
|
+
output_dir="test_output/"
|
|
258
|
+
)
|
|
259
|
+
print("Hardware test generation:")
|
|
260
|
+
print(result[:500] + "..." if len(result) > 500 else result)
|
|
261
|
+
|
|
262
|
+
# Export test framework
|
|
263
|
+
framework = await test_generation.export_test_framework(
|
|
264
|
+
schematic_path=schematic_path,
|
|
265
|
+
framework="pytest",
|
|
266
|
+
output_dir="test_framework/"
|
|
267
|
+
)
|
|
268
|
+
print("\nTest framework export:")
|
|
269
|
+
print(framework[:500] + "..." if len(framework) > 500 else framework)
|
|
270
|
+
|
|
271
|
+
return True
|
|
272
|
+
except Exception as e:
|
|
273
|
+
print(f"Test generation failed: {e}")
|
|
274
|
+
return False
|
|
275
|
+
|
|
276
|
+
if __name__ == "__main__":
|
|
277
|
+
asyncio.run(test_test_generation())
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
## Complete Test Suite
|
|
281
|
+
|
|
282
|
+
Create comprehensive test script `test_complete_suite.py`:
|
|
283
|
+
|
|
284
|
+
```python
|
|
285
|
+
#!/usr/bin/env python3
|
|
286
|
+
"""
|
|
287
|
+
KiCad MCP Server Complete Test Suite
|
|
288
|
+
Tests all newly implemented features
|
|
289
|
+
"""
|
|
290
|
+
|
|
291
|
+
import asyncio
|
|
292
|
+
import sys
|
|
293
|
+
from pathlib import Path
|
|
294
|
+
|
|
295
|
+
# Test configuration
|
|
296
|
+
TEST_SCHEMATIC = "path/to/your/schematic.kicad_sch" # Replace with actual path
|
|
297
|
+
TEST_PCB = "path/to/your/pcb.kicad_pcb" # Replace with actual path
|
|
298
|
+
|
|
299
|
+
class TestSuite:
|
|
300
|
+
def __init__(self):
|
|
301
|
+
self.results = {
|
|
302
|
+
"passed": 0,
|
|
303
|
+
"failed": 0,
|
|
304
|
+
"skipped": 0,
|
|
305
|
+
"tests": []
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
async def test_imports(self):
|
|
309
|
+
"""Test 1: Module imports"""
|
|
310
|
+
print("Testing module imports...")
|
|
311
|
+
try:
|
|
312
|
+
from kicad_mcp_server.tools import validation
|
|
313
|
+
from kicad_mcp_server.tools import pin_analysis
|
|
314
|
+
from kicad_mcp_server.tools import device_tree
|
|
315
|
+
from kicad_mcp_server.tools import test_generation
|
|
316
|
+
self._record_result("Module imports", True)
|
|
317
|
+
return True
|
|
318
|
+
except Exception as e:
|
|
319
|
+
self._record_result("Module imports", False, str(e))
|
|
320
|
+
return False
|
|
321
|
+
|
|
322
|
+
async def test_validation_tools(self):
|
|
323
|
+
"""Test 2: Validation tools"""
|
|
324
|
+
print("\nTesting validation tools...")
|
|
325
|
+
try:
|
|
326
|
+
from kicad_mcp_server.tools import validation
|
|
327
|
+
|
|
328
|
+
if not Path(TEST_SCHEMATIC).exists():
|
|
329
|
+
print("WARN Test schematic not found, skipping ERC test")
|
|
330
|
+
self._record_result("ERC tool", None, "Test file does not exist")
|
|
331
|
+
return False
|
|
332
|
+
|
|
333
|
+
result = await validation.run_erc(TEST_SCHEMATIC)
|
|
334
|
+
success = "run_erc" in result.lower()
|
|
335
|
+
self._record_result("ERC tool", success)
|
|
336
|
+
return success
|
|
337
|
+
except Exception as e:
|
|
338
|
+
self._record_result("Validation tools", False, str(e))
|
|
339
|
+
return False
|
|
340
|
+
|
|
341
|
+
async def test_pin_analysis(self):
|
|
342
|
+
"""Test 3: Pin analysis"""
|
|
343
|
+
print("\nTesting pin analysis...")
|
|
344
|
+
try:
|
|
345
|
+
from kicad_mcp_server.tools import pin_analysis
|
|
346
|
+
|
|
347
|
+
if not Path(TEST_SCHEMATIC).exists():
|
|
348
|
+
print("WARN Test schematic not found, skipping pin analysis test")
|
|
349
|
+
self._record_result("Pin analysis", None, "Test file does not exist")
|
|
350
|
+
return False
|
|
351
|
+
|
|
352
|
+
result = await pin_analysis.analyze_pin_functions(TEST_SCHEMATIC)
|
|
353
|
+
success = "pin" in result.lower()
|
|
354
|
+
self._record_result("Pin function analysis", success)
|
|
355
|
+
return success
|
|
356
|
+
except Exception as e:
|
|
357
|
+
self._record_result("Pin analysis", False, str(e))
|
|
358
|
+
return False
|
|
359
|
+
|
|
360
|
+
async def test_device_tree(self):
|
|
361
|
+
"""Test 4: Device tree generation"""
|
|
362
|
+
print("\nTesting device tree generation...")
|
|
363
|
+
try:
|
|
364
|
+
from kicad_mcp_server.tools import device_tree
|
|
365
|
+
|
|
366
|
+
if not Path(TEST_SCHEMATIC).exists():
|
|
367
|
+
print("WARN Test schematic not found, skipping device tree test")
|
|
368
|
+
self._record_result("Device tree generation", None, "Test file does not exist")
|
|
369
|
+
return False
|
|
370
|
+
|
|
371
|
+
result = await device_tree.validate_pin_configuration(TEST_SCHEMATIC)
|
|
372
|
+
success = "validation" in result.lower() or "OK" in result
|
|
373
|
+
self._record_result("Device tree validation", success)
|
|
374
|
+
return success
|
|
375
|
+
except Exception as e:
|
|
376
|
+
self._record_result("Device tree generation", False, str(e))
|
|
377
|
+
return False
|
|
378
|
+
|
|
379
|
+
async def test_test_generation(self):
|
|
380
|
+
"""Test 5: Test code generation"""
|
|
381
|
+
print("\nTesting test code generation...")
|
|
382
|
+
try:
|
|
383
|
+
from kicad_mcp_server.tools import test_generation
|
|
384
|
+
|
|
385
|
+
if not Path(TEST_SCHEMATIC).exists():
|
|
386
|
+
print("WARN Test schematic not found, skipping test generation")
|
|
387
|
+
self._record_result("Test code generation", None, "Test file does not exist")
|
|
388
|
+
return False
|
|
389
|
+
|
|
390
|
+
result = await test_generation.generate_gpio_test(TEST_SCHEMATIC)
|
|
391
|
+
success = "gpio" in result.lower() or "test" in result.lower()
|
|
392
|
+
self._record_result("GPIO test generation", success)
|
|
393
|
+
return success
|
|
394
|
+
except Exception as e:
|
|
395
|
+
self._record_result("Test code generation", False, str(e))
|
|
396
|
+
return False
|
|
397
|
+
|
|
398
|
+
def _record_result(self, test_name, success, error=None):
|
|
399
|
+
"""Record test result"""
|
|
400
|
+
status = "PASS" if success else ("SKIP" if success is None else "FAIL")
|
|
401
|
+
result = {
|
|
402
|
+
"name": test_name,
|
|
403
|
+
"status": status,
|
|
404
|
+
"error": error
|
|
405
|
+
}
|
|
406
|
+
self.results["tests"].append(result)
|
|
407
|
+
|
|
408
|
+
if status == "PASS":
|
|
409
|
+
self.results["passed"] += 1
|
|
410
|
+
print(f"OK {test_name}: Passed")
|
|
411
|
+
elif status == "SKIP":
|
|
412
|
+
self.results["skipped"] += 1
|
|
413
|
+
print(f"SKIP {test_name}: Skipped - {error}")
|
|
414
|
+
else:
|
|
415
|
+
self.results["failed"] += 1
|
|
416
|
+
print(f"X {test_name}: Failed - {error}")
|
|
417
|
+
|
|
418
|
+
def print_summary(self):
|
|
419
|
+
"""Print test summary"""
|
|
420
|
+
print("\n" + "="*50)
|
|
421
|
+
print("Test Summary")
|
|
422
|
+
print("="*50)
|
|
423
|
+
print(f"Total: {self.results['passed'] + self.results['failed'] + self.results['skipped']} tests")
|
|
424
|
+
print(f"OK Passed: {self.results['passed']}")
|
|
425
|
+
print(f"X Failed: {self.results['failed']}")
|
|
426
|
+
print(f"SKIP Skipped: {self.results['skipped']}")
|
|
427
|
+
|
|
428
|
+
if self.results["failed"] == 0:
|
|
429
|
+
print("\nOK All tests passed!")
|
|
430
|
+
return 0
|
|
431
|
+
else:
|
|
432
|
+
print(f"\nWARN {self.results['failed']} test(s) failed")
|
|
433
|
+
return 1
|
|
434
|
+
|
|
435
|
+
async def run_all_tests():
|
|
436
|
+
"""Run all tests"""
|
|
437
|
+
print("Starting KiCad MCP Server Test Suite")
|
|
438
|
+
print("="*50)
|
|
439
|
+
|
|
440
|
+
suite = TestSuite()
|
|
441
|
+
|
|
442
|
+
# Run all tests
|
|
443
|
+
await suite.test_imports()
|
|
444
|
+
await suite.test_validation_tools()
|
|
445
|
+
await suite.test_pin_analysis()
|
|
446
|
+
await suite.test_device_tree()
|
|
447
|
+
await suite.test_test_generation()
|
|
448
|
+
|
|
449
|
+
# Print summary
|
|
450
|
+
return suite.print_summary()
|
|
451
|
+
|
|
452
|
+
if __name__ == "__main__":
|
|
453
|
+
# Check test file paths
|
|
454
|
+
if not Path(TEST_SCHEMATIC).exists():
|
|
455
|
+
print(f"WARN Test schematic file does not exist: {TEST_SCHEMATIC}")
|
|
456
|
+
print("Please edit the TEST_SCHEMATIC variable in the script to point to a valid KiCad schematic file")
|
|
457
|
+
print("\nContinuing with basic module import tests...\n")
|
|
458
|
+
|
|
459
|
+
exit_code = asyncio.run(run_all_tests())
|
|
460
|
+
sys.exit(exit_code)
|
|
461
|
+
```
|
|
462
|
+
|
|
463
|
+
Run complete test:
|
|
464
|
+
```bash
|
|
465
|
+
python test_complete_suite.py
|
|
466
|
+
```
|
|
467
|
+
|
|
468
|
+
## Debugging Tests
|
|
469
|
+
|
|
470
|
+
If you encounter issues, use the debug script:
|
|
471
|
+
|
|
472
|
+
```python
|
|
473
|
+
# debug_test.py
|
|
474
|
+
import sys
|
|
475
|
+
import traceback
|
|
476
|
+
|
|
477
|
+
def debug_import(module_name):
|
|
478
|
+
"""Debug module imports"""
|
|
479
|
+
try:
|
|
480
|
+
module = __import__(module_name)
|
|
481
|
+
print(f"OK {module_name} imported successfully")
|
|
482
|
+
return True
|
|
483
|
+
except Exception as e:
|
|
484
|
+
print(f"X {module_name} import failed:")
|
|
485
|
+
print(f" Error: {e}")
|
|
486
|
+
traceback.print_exc()
|
|
487
|
+
return False
|
|
488
|
+
|
|
489
|
+
if __name__ == "__main__":
|
|
490
|
+
print("Debugging KiCad MCP Server Imports")
|
|
491
|
+
print("="*50)
|
|
492
|
+
|
|
493
|
+
modules = [
|
|
494
|
+
"kicad_mcp_server",
|
|
495
|
+
"kicad_mcp_server.tools.validation",
|
|
496
|
+
"kicad_mcp_server.tools.pin_analysis",
|
|
497
|
+
"kicad_mcp_server.tools.device_tree",
|
|
498
|
+
"kicad_mcp_server.tools.test_generation"
|
|
499
|
+
]
|
|
500
|
+
|
|
501
|
+
results = []
|
|
502
|
+
for module in modules:
|
|
503
|
+
results.append(debug_import(module))
|
|
504
|
+
|
|
505
|
+
if all(results):
|
|
506
|
+
print("\nOK All modules imported successfully!")
|
|
507
|
+
else:
|
|
508
|
+
print(f"\nWARN {sum(not r for r in results)} module(s) failed to import")
|
|
509
|
+
sys.exit(1)
|
|
510
|
+
```
|
|
511
|
+
|
|
512
|
+
## Quick Verification Checklist
|
|
513
|
+
|
|
514
|
+
Use this quick checklist to verify all functionality:
|
|
515
|
+
|
|
516
|
+
```bash
|
|
517
|
+
# 1. Verify Python environment
|
|
518
|
+
python --version # Should be >= 3.10
|
|
519
|
+
|
|
520
|
+
# 2. Verify dependency installation
|
|
521
|
+
pip list | grep -E "mcp|kicad|pydantic|jinja2"
|
|
522
|
+
|
|
523
|
+
# 3. Verify module imports
|
|
524
|
+
python -c "from kicad_mcp_server.tools import validation, pin_analysis, device_tree, test_generation; print('OK Import successful')"
|
|
525
|
+
|
|
526
|
+
# 4. Verify KiCad installation
|
|
527
|
+
kicad-cli --version
|
|
528
|
+
|
|
529
|
+
# 5. Run basic tests
|
|
530
|
+
python test_imports.py
|
|
531
|
+
python test_tools_registration.py
|
|
532
|
+
|
|
533
|
+
# 6. If test files exist, run complete test suite
|
|
534
|
+
python test_complete_suite.py
|
|
535
|
+
```
|
|
536
|
+
|
|
537
|
+
## Testing Recommendations
|
|
538
|
+
|
|
539
|
+
### If you have KiCad files:
|
|
540
|
+
|
|
541
|
+
1. **Start Small**: Test with simple schematics first
|
|
542
|
+
2. **Incremental Testing**: Test each functional module incrementally
|
|
543
|
+
3. **Verify Output**: Check generated code and reports
|
|
544
|
+
|
|
545
|
+
### If you don't have KiCad files:
|
|
546
|
+
|
|
547
|
+
1. **Basic Tests**: Run module import and tool registration tests
|
|
548
|
+
2. **Template Tests**: Verify template files exist
|
|
549
|
+
3. **Documentation Tests**: Check documentation completeness
|
|
550
|
+
|
|
551
|
+
### Create Minimal Test Files:
|
|
552
|
+
|
|
553
|
+
```python
|
|
554
|
+
# create_minimal_test.py
|
|
555
|
+
import asyncio
|
|
556
|
+
from kicad_mcp_server.tools import validation
|
|
557
|
+
|
|
558
|
+
async def minimal_test():
|
|
559
|
+
"""Minimal functionality test"""
|
|
560
|
+
print("Running minimal functionality test...")
|
|
561
|
+
|
|
562
|
+
# Test ERC functionality (can test basic logic even if file doesn't exist)
|
|
563
|
+
try:
|
|
564
|
+
result = await validation.run_erc("nonexistent.kicad_sch")
|
|
565
|
+
if "X" in result and "not found" in result.lower():
|
|
566
|
+
print("OK ERC basic functionality normal (correctly handled non-existent file)")
|
|
567
|
+
return True
|
|
568
|
+
else:
|
|
569
|
+
print("WARN ERC response not as expected")
|
|
570
|
+
return False
|
|
571
|
+
except Exception as e:
|
|
572
|
+
print(f"X ERC test failed: {e}")
|
|
573
|
+
return False
|
|
574
|
+
|
|
575
|
+
if __name__ == "__main__":
|
|
576
|
+
success = asyncio.run(minimal_test())
|
|
577
|
+
print(f"\n{'OK Success' if success else 'X Failed'}")
|
|
578
|
+
```
|
|
579
|
+
|
|
580
|
+
## Expected Test Results
|
|
581
|
+
|
|
582
|
+
If successful, you should see:
|
|
583
|
+
|
|
584
|
+
```
|
|
585
|
+
Starting KiCad MCP Server Test Suite
|
|
586
|
+
==================================================
|
|
587
|
+
Testing module imports...
|
|
588
|
+
OK Module imports: Passed
|
|
589
|
+
|
|
590
|
+
Testing validation tools...
|
|
591
|
+
OK ERC tool: Passed
|
|
592
|
+
|
|
593
|
+
Testing pin analysis...
|
|
594
|
+
OK Pin function analysis: Passed
|
|
595
|
+
|
|
596
|
+
Testing device tree generation...
|
|
597
|
+
OK Device tree validation: Passed
|
|
598
|
+
|
|
599
|
+
Testing test code generation...
|
|
600
|
+
OK GPIO test generation: Passed
|
|
601
|
+
|
|
602
|
+
==================================================
|
|
603
|
+
Test Summary
|
|
604
|
+
==================================================
|
|
605
|
+
Total: 5 tests
|
|
606
|
+
OK Passed: 5
|
|
607
|
+
X Failed: 0
|
|
608
|
+
SKIP Skipped: 0
|
|
609
|
+
|
|
610
|
+
OK All tests passed!
|
|
611
|
+
```
|
|
612
|
+
|
|
613
|
+
Start testing! If you encounter any issues, let me know the specific error messages.
|