import numpy as np
from ..src.core.waveform_processor import WaveformProcessor
from ..src.hardware.constraints import HardwareConstraints

def test_process_rf_numba_scaling():
    # Тестируем масштабирование RF-сигнала
    rf = np.array([0.0, 0.5, -0.5, 1.0, -1.0], dtype=np.float32)
    max_val = 127
    result = WaveformProcessor.process_rf_numba(rf, max_val)
    # Ожидаем int8 значения
    assert result.dtype == np.int8
    expected = np.array([0, 64, -64, 127, -128], dtype=np.int8)
    # Проверяем равенство с ожидаемым результатом (с учетом округления)
    assert np.array_equal(result, expected)

def test_process_gradient_numba_scaling():
    # Тестируем масштабирование градиентного сигнала
    grad = np.array([-1.0, -0.5, 0.0, 0.5, 1.0], dtype=np.float32)
    max_val = 32767  # максимальное значение для int16
    result = WaveformProcessor.process_gradient_numba(grad, max_val)
    assert result.dtype == np.int16
    expected = np.array([-32767, -16384, 0, 16384, 32767], dtype=np.int16)
    assert np.array_equal(result, expected)

def test_preprocess_adc_contiguity():
    hw = HardwareConstraints()
    wp = WaveformProcessor(hw)
    # Создаем не смежный массив (шаг 2)
    arr = np.array([1.0, 2.5, 3.0], dtype=np.float64)
    arr_slice = arr[::2]  # это представление: [1.0, 3.0], не смежное в памяти
    processed = wp.preprocess_adc(arr_slice)
    # Проверяем, что результат смежен в памяти и имеет dtype float32
    assert processed.dtype == np.float32
    assert processed.flags['C_CONTIGUOUS'] is True
    # Проверяем, что значения сохранились
    assert np.allclose(processed, arr_slice.astype(np.float32))
