#!/usr/bin/env python3 # -*- coding: utf-8 -*- import sys import os # Agregar el directorio padre al path sys.path.append('.') # Importar el convertidor from x1_lad_converter import SimpleLadConverter def test_arraytoreal(): """Probar específicamente ARRAYTOREAL.EXP para verificar preservación de indentación""" print("=== TEST: ARRAYTOREAL.EXP - Preservación de indentación ST ===") print("-" * 60) # Buscar el archivo possible_paths = [ "ExportTwinCat/ARRAYTOREAL.EXP", "../ExportTwinCat/ARRAYTOREAL.EXP", "../../ExportTwinCat/ARRAYTOREAL.EXP", "C:/Trabajo/SIDEL/13 - E5.007560 - Modifica O&U - SAE235/Reporte/ExportTwinCat/ARRAYTOREAL.EXP" ] test_file = None for path in possible_paths: if os.path.exists(path): test_file = path break if test_file is None: print(f"❌ Error: No se encontró ARRAYTOREAL.EXP") return print(f"✓ Archivo encontrado: {test_file}") print("-" * 60) # Leer archivo original para mostrar indentación print("📄 CÓDIGO ORIGINAL:") with open(test_file, 'r', encoding='utf-8', errors='ignore') as f: original_lines = f.readlines() # Mostrar solo las líneas de código ST (después de (* @END_DECLARATION := '0' *)) st_start = False for i, line in enumerate(original_lines): if "@END_DECLARATION" in line: st_start = True continue if st_start and line.strip() and not line.strip().startswith("END_FUNCTION"): print(f" {i+1:2d}: '{line.rstrip()}'") print("-" * 60) # Crear convertidor converter = SimpleLadConverter() # Parsear archivo print("🔍 PARSEANDO ARCHIVO...") converter.parse_file(test_file) print(f"\n📊 INFORMACIÓN DETECTADA:") print(f" ✓ Tipo: {getattr(converter, 'program_type', 'PROGRAM')}") print(f" ✓ Nombre: {converter.program_name}") print(f" ✓ Path: {converter.program_path}") print(f" ✓ Variables: {list(converter.var_sections.keys())}") print(f" ✓ Código ST: {'Sí' if converter.st_main_code else 'No'}") if converter.st_main_code: print(f"\n📝 CÓDIGO ST EXTRAÍDO ({len(converter.st_main_code)} caracteres):") for i, line in enumerate(converter.st_main_code.split('\n')[:10], 1): print(f" {i:2d}: '{line}'") # Generar código SCL print(f"\n📝 GENERANDO CÓDIGO SCL...") scl_code = converter.convert_to_structured() # Guardar archivo de prueba output_file = "test_arraytoreal_indent.scl" with open(output_file, 'w', encoding='utf-8') as f: f.write(scl_code) print(f" ✓ Guardado en: {output_file}") # Mostrar código SCL generado print(f"\n📄 CÓDIGO SCL GENERADO:") lines = scl_code.split('\n') # Encontrar línea donde empieza el código ST st_start_line = -1 for i, line in enumerate(lines): if "Código ST original" in line: st_start_line = i break if st_start_line > -1: # Mostrar desde el código ST hasta el final de la función for i in range(st_start_line, min(st_start_line + 20, len(lines))): if i < len(lines): line = lines[i] if line.strip() and ("END_FUNCTION" in line or "END_PROGRAM" in line): print(f" {i+1:2d}: {line}") break print(f" {i+1:2d}: {line}") # Verificar preservación de indentación print(f"\n🔍 VERIFICANDO PRESERVACIÓN DE INDENTACIÓN:") if converter.st_main_code: original_lines = converter.st_main_code.split('\n') scl_lines = scl_code.split('\n') # Encontrar líneas con indentación en el original original_indented = [] for line in original_lines: if line.startswith('\t') or line.startswith(' '): original_indented.append(line) # Verificar que se preserven en el SCL if original_indented: print(f" 📋 Líneas con indentación original: {len(original_indented)}") print(f" Ejemplo: '{original_indented[0]}'" if original_indented else "") # Verificar si aparecen en el SCL preservadas preserved_count = 0 for orig_line in original_indented: for scl_line in scl_lines: if orig_line.strip() in scl_line and orig_line.startswith(('\t', ' ')): preserved_count += 1 break print(f" ✅ Indentación preservada: {preserved_count}/{len(original_indented)} líneas") else: print(f" ℹ No se encontraron líneas con indentación específica") else: print(f" ⚠ No hay código ST para verificar") return scl_code if __name__ == "__main__": test_arraytoreal()