""" Tests for PostRequestGenerator — the single canonical POST-manifest builder. Regression guard for the "points < 1" bug: a divergent GUI copy of this logic put raw ADC-window durations (seconds, e.g. 0.002) into ``iadc.points`` instead of sample counts ``int(window_s * srate)``, so int(0.002) collapsed to 0. """ from __future__ import annotations from seq_interp.src.core.synchronizer import Synchronizer from seq_interp.src.hardware.constraints import HardwareConstraints from seq_interp.src.interfaces.post_request_generator import PostRequestGenerator from seq_interp.src.interfaces.xml_generator import XMLGenerator def _adc_windows(make_seq, specs, tmp_path): hw = HardwareConstraints() sync_data = Synchronizer(hw).process(make_seq(specs)) adc_vals, _ = XMLGenerator().generate(sync_data, str(tmp_path / "s.xml"), hw) return adc_vals def test_points_are_sample_counts_not_seconds(make_seq, tmp_path): """points must be int(window_s * srate), i.e. >= 1 for a real ADC window.""" adc_vals = _adc_windows(make_seq, [{"adc": True, "dur": 2e-3}], tmp_path) srate = 8_000_000 payload = PostRequestGenerator().build( seq_data={}, adc_values=adc_vals, sequence_path="seq.seq", output_dir=str(tmp_path), hw_cfg={"iadc": {"srate": srate}}, rf_raster_time=1e-6, ) points = payload["info"]["iadc"]["points"] assert points == [int(2e-3 * srate)] # 16000 assert all(isinstance(p, int) and p >= 1 for p in points) def test_points_track_split_full_window(make_seq, tmp_path): """A split long ADC still yields one window -> one (large) sample count.""" adc_vals = _adc_windows(make_seq, [{"adc": True, "dur": 50e-3}], tmp_path) srate = 8_000_000 payload = PostRequestGenerator().build( seq_data={}, adc_values=adc_vals, sequence_path="seq.seq", output_dir=str(tmp_path), hw_cfg={"iadc": {"srate": srate}}, rf_raster_time=1e-6, ) points = payload["info"]["iadc"]["points"] assert points == [int(50e-3 * srate)] # 400000