#!/usr/bin/env python3 """ Test script for SIO module implementation ======================================== Tests the SIO boilerplate model to ensure it works correctly with IP address configuration and comment updates. """ import os import sys # Add the models directory to the path sys.path.append(os.path.join(os.path.dirname(__file__), 'models')) from models.sio_boilerplate_model import create_sio_module, SIOModuleGenerator def test_sio_basic_functionality(): """Test basic SIO module creation and configuration.""" print("Testing SIO module basic functionality...") # Create a basic SIO configuration config = create_sio_module( name="SIO_TEST_1", ip_address="192.168.1.100", safety_input_names={ 0: "Emergency Stop Line 1", 1: "Emergency Stop Line 2", 2: "Safety Gate Position", 3: "Light Curtain Active", 4: "Safety Mat Pressure", 5: "Reset Button Pressed", 6: "Enable Switch Active", 7: "Safety Scanner Zone" }, safety_output_names={ 0: "Main Safety Relay", 1: "Backup Safety Relay", 2: "Warning Light Red", 3: "Warning Light Amber", 4: "Safety Brake Release", 5: "Safety Brake Release", 6: "Safety Brake Release", 7: "Safety Brake Release" } ) # Create generator and apply updates generator = SIOModuleGenerator(config) try: generator.load_boilerplate() print(" ✓ Boilerplate loaded successfully") generator.apply_updates() print(" ✓ Updates applied successfully") # Check that the IP address was updated port = generator.root.find(".//Port[@Type='Ethernet']") if port is not None and port.get("Address") == "192.168.1.100": print(" ✓ IP address updated correctly") else: print(" ✗ IP address not updated correctly") return False # Check that module name was updated module = generator.root.find(".//Module[@Use='Target']") if module is not None and module.get("Name") == "SIO_TEST_1": print(" ✓ Module name updated correctly") else: print(" ✗ Module name not updated correctly") return False # Check safety input comments si_comments = generator.root.find(".//Connection[@Name='_200424962CC22C87']/InputTag/Comments") if si_comments is not None: comment_count = len(list(si_comments)) if comment_count == 8: # Should have 8 safety input comments print(f" ✓ Safety input comments added ({comment_count} comments)") else: print(f" ✗ Expected 8 safety input comments, got {comment_count}") return False else: print(" ✗ Safety input comments section not found") return False # Check safety output comments so_comments = generator.root.find(".//Connection[@Name='_200424962C862CC2']/OutputTag/Comments") if so_comments is not None: comment_count = len(list(so_comments)) if comment_count == 5: # Should have 5 safety output comments print(f" ✓ Safety output comments added ({comment_count} comments)") else: print(f" ✗ Expected 5 safety output comments, got {comment_count}") return False else: print(" ✗ Safety output comments section not found") return False # Test saving the output os.makedirs("generated", exist_ok=True) output_path = "generated/SIO_TEST_1.L5X" generator.save(output_path) if os.path.exists(output_path): print(f" ✓ SIO module saved successfully to {output_path}") # Check file size to ensure it's not empty file_size = os.path.getsize(output_path) if file_size > 1000: # Reasonable size for XML file print(f" ✓ Generated file has reasonable size ({file_size} bytes)") else: print(f" ✗ Generated file seems too small ({file_size} bytes)") return False else: print(" ✗ Failed to save SIO module") return False return True except FileNotFoundError as e: print(f" ✗ Boilerplate file not found: {e}") return False except Exception as e: print(f" ✗ Error during testing: {e}") return False def test_sio_minimal_config(): """Test SIO module with minimal configuration.""" print("\nTesting SIO module with minimal configuration...") # Create minimal configuration config = create_sio_module( name="SIO_MINIMAL", ip_address="10.0.0.50" ) generator = SIOModuleGenerator(config) try: generator.load_boilerplate() generator.apply_updates() # Verify basic properties module = generator.root.find(".//Module[@Use='Target']") port = generator.root.find(".//Port[@Type='Ethernet']") if (module is not None and module.get("Name") == "SIO_MINIMAL" and port is not None and port.get("Address") == "10.0.0.50"): print(" ✓ Minimal configuration applied successfully") return True else: print(" ✗ Minimal configuration failed") return False except Exception as e: print(f" ✗ Error with minimal configuration: {e}") return False def main(): """Run all SIO tests.""" print("Running SIO Module Implementation Tests") print("=" * 40) test_results = [] # Test basic functionality test_results.append(test_sio_basic_functionality()) # Test minimal configuration test_results.append(test_sio_minimal_config()) # Summary print("\n" + "=" * 40) passed = sum(test_results) total = len(test_results) if passed == total: print(f"✓ All tests passed ({passed}/{total})") print("SIO module implementation is working correctly!") return 0 else: print(f"✗ Some tests failed ({passed}/{total})") print("Please check the SIO implementation.") return 1 if __name__ == "__main__": exit(main())