| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 |
- import os
- import xml.etree.ElementTree as ET
- from ..src.core.synchronizer import Synchronizer
- from ..src.hardware.constraints import HardwareConstraints
- from ..src.interfaces.xml_generator import XMLGenerator
- def test_xml_generator_output_structure(tmp_path):
- hw = HardwareConstraints()
- # Определяем простую последовательность: RF блок без ADC, затем Grad блок с ADC
- blocks = [
- {"type": "RF", "duration": 1e-4, "has_adc": False},
- {"type": "GRAD", "duration": 2e-4, "has_adc": True}
- ]
- seq_data = {"blocks": blocks}
- # Генерируем события синхронизации
- events = Synchronizer(hw).process(seq_data)
- # Генерация XML в временный файл
- xml_path = tmp_path / "test_sync.xml"
- xml_gen = XMLGenerator()
- xml_gen.generate(events, str(xml_path), hw)
- # Чтение и парсинг XML
- tree = ET.parse(xml_path)
- root = tree.getroot()
- # Проверяем наличие основных разделов
- sections = [elem.tag for elem in root]
- assert "ParamCount" in sections and "RF" in sections and "SW" in sections and "ADC" in sections and "GR" in sections and "CL" in sections
- # Проверяем правильность ParamCount
- count = int(root.findtext("ParamCount"))
- assert count == len(events)
- # Проверяем значения триггеров RF, SW, ADC
- rf_values = [int(child.text) for child in root.find("RF")]
- sw_values = [int(child.text) for child in root.find("SW")]
- adc_values = [int(child.text) for child in root.find("ADC")]
- # Должно быть столько же значений, сколько событий
- assert len(rf_values) == count
- assert len(sw_values) == count
- assert len(adc_values) == count
- # Первый RF должен быть 0 (нет RF в начальной задержке), первый SW должен быть 1, первый ADC должен быть 0
- assert rf_values[0] == 0
- assert sw_values[0] == 1
- assert adc_values[0] == 0
- # Проверяем, что для RF-блока (второе событие RF) RF-триггер 1, ADC 0; для Grad-блока с ADC RF=0, ADC=1
- # События: [DELAY(start), DELAY(RF_delay), RF, GRAD, DELAY(TR_delay)]
- # RF-триггер должен быть 1 только на событии RF (индекс 2 списка events)
- assert rf_values[2] == 1 and all(val in (0, 1) for val in rf_values)
- # ADC-триггер должен быть 1 только на событии с ADC (Grad, индекс 3)
- assert adc_values[3] == 1 and all(val in (0, 1) for val in adc_values)
- # Проверяем секцию CL: количество тиков каждого события
- cl_values = [int(child.text) for child in root.find("CL")]
- # Количество CL значений равно числу событий, и первое значение соответствует стартовой задержке (в тиках)
- assert len(cl_values) == count
- start_delay_ticks = int(round(hw.START_DELAY / hw.MIN_BLOCK_DURATION))
- assert cl_values[0] == start_delay_ticks
|