test_synchronizer.py 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. import os
  2. from ..src.core.synchronizer import Synchronizer, TimingEvent
  3. from ..src.hardware.constraints import HardwareConstraints
  4. def test_synchronizer_adds_delays():
  5. hw = HardwareConstraints() # используем значения по умолчанию
  6. # Два блока: RF (без ADC) и градиент (с ADC)
  7. blocks = [
  8. {"type": "RF", "duration": 1e-3, "has_adc": False},
  9. {"type": "GRAD", "duration": 2e-3, "has_adc": True}
  10. ]
  11. seq_data = {"blocks": blocks}
  12. synch = Synchronizer(hw)
  13. events = synch.process(seq_data)
  14. # Проверяем общее количество событий:
  15. # Ожидается: Start delay, RF delay, RF block, Grad block, TR delay = 5 событий
  16. assert isinstance(events, list) and all(isinstance(e, TimingEvent) for e in events)
  17. assert len(events) == 5
  18. # Проверяем последовательность типов событий
  19. types = [e.event_type for e in events]
  20. expected_types = ["DELAY", "DELAY", "RF", "GRAD", "DELAY"]
  21. assert types == expected_types
  22. # Проверяем, что первая задержка имеет длительность соответствующую START_DELAY
  23. start_delay_ticks = int(round(hw.START_DELAY / hw.MIN_BLOCK_DURATION))
  24. assert events[0].event_type == "DELAY"
  25. assert events[0].duration == start_delay_ticks
  26. # Проверяем, что RF_DELAY вставлена перед RF блоком
  27. rf_delay_ticks = int(round(hw.RF_DELAY / hw.MIN_BLOCK_DURATION))
  28. assert events[1].event_type == "DELAY" and events[2].event_type == "RF"
  29. assert events[1].duration == rf_delay_ticks
  30. # Проверяем, что TR_DELAY вставлена после градиентного блока с ADC
  31. tr_delay_ticks = int(round(hw.TR_DELAY / hw.MIN_BLOCK_DURATION))
  32. assert events[-1].event_type == "DELAY"
  33. assert events[-1].duration == tr_delay_ticks
  34. def test_synchronizer_timing_order():
  35. hw = HardwareConstraints()
  36. blocks = [
  37. {"type": "GRAD", "duration": 5e-4, "has_adc": True}, # один блок с ADC
  38. ]
  39. events = Synchronizer(hw).process({"blocks": blocks})
  40. # Должно быть: начальная задержка, блок, TR задержка (3 события)
  41. assert events[0].start == 0 # начало первой задержки в 0
  42. # Проверяем, что время старта каждого следующего события больше или равно предыдущего конца
  43. for i in range(1, len(events)):
  44. prev = events[i-1]
  45. curr = events[i]
  46. # start текущего должен равняться start предыдущего + duration предыдущего
  47. assert curr.start == prev.start + prev.duration