test_xml_generator.py 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. import os
  2. import xml.etree.ElementTree as ET
  3. from ..src.core.synchronizer import Synchronizer
  4. from ..src.hardware.constraints import HardwareConstraints
  5. from ..src.interfaces.xml_generator import XMLGenerator
  6. def test_xml_generator_output_structure(tmp_path):
  7. hw = HardwareConstraints()
  8. # Определяем простую последовательность: RF блок без ADC, затем Grad блок с ADC
  9. blocks = [
  10. {"type": "RF", "duration": 1e-4, "has_adc": False},
  11. {"type": "GRAD", "duration": 2e-4, "has_adc": True}
  12. ]
  13. seq_data = {"blocks": blocks}
  14. # Генерируем события синхронизации
  15. events = Synchronizer(hw).process(seq_data)
  16. # Генерация XML в временный файл
  17. xml_path = tmp_path / "test_sync.xml"
  18. xml_gen = XMLGenerator()
  19. xml_gen.generate(events, str(xml_path), hw)
  20. # Чтение и парсинг XML
  21. tree = ET.parse(xml_path)
  22. root = tree.getroot()
  23. # Проверяем наличие основных разделов
  24. sections = [elem.tag for elem in root]
  25. assert "ParamCount" in sections and "RF" in sections and "SW" in sections and "ADC" in sections and "GR" in sections and "CL" in sections
  26. # Проверяем правильность ParamCount
  27. count = int(root.findtext("ParamCount"))
  28. assert count == len(events)
  29. # Проверяем значения триггеров RF, SW, ADC
  30. rf_values = [int(child.text) for child in root.find("RF")]
  31. sw_values = [int(child.text) for child in root.find("SW")]
  32. adc_values = [int(child.text) for child in root.find("ADC")]
  33. # Должно быть столько же значений, сколько событий
  34. assert len(rf_values) == count
  35. assert len(sw_values) == count
  36. assert len(adc_values) == count
  37. # Первый RF должен быть 0 (нет RF в начальной задержке), первый SW должен быть 1, первый ADC должен быть 0
  38. assert rf_values[0] == 0
  39. assert sw_values[0] == 1
  40. assert adc_values[0] == 0
  41. # Проверяем, что для RF-блока (второе событие RF) RF-триггер 1, ADC 0; для Grad-блока с ADC RF=0, ADC=1
  42. # События: [DELAY(start), DELAY(RF_delay), RF, GRAD, DELAY(TR_delay)]
  43. # RF-триггер должен быть 1 только на событии RF (индекс 2 списка events)
  44. assert rf_values[2] == 1 and all(val in (0, 1) for val in rf_values)
  45. # ADC-триггер должен быть 1 только на событии с ADC (Grad, индекс 3)
  46. assert adc_values[3] == 1 and all(val in (0, 1) for val in adc_values)
  47. # Проверяем секцию CL: количество тиков каждого события
  48. cl_values = [int(child.text) for child in root.find("CL")]
  49. # Количество CL значений равно числу событий, и первое значение соответствует стартовой задержке (в тиках)
  50. assert len(cl_values) == count
  51. start_delay_ticks = int(round(hw.START_DELAY / hw.MIN_BLOCK_DURATION))
  52. assert cl_values[0] == start_delay_ticks