"""WAV encoding: float32 PCM -> valid 16-bit PCM WAV bytes (no model needed)."""
import io
import wave

import numpy as np

import tts


def test_wav_bytes_are_valid_16bit_pcm():
    samples = (np.sin(np.linspace(0, 6.28, 2400)) * 0.5).astype(np.float32)
    blob = tts.float32_to_wav_bytes(samples, tts.SAMPLE_RATE)
    with wave.open(io.BytesIO(blob), "rb") as w:
        assert w.getnchannels() == 1
        assert w.getsampwidth() == 2            # 16-bit
        assert w.getframerate() == tts.SAMPLE_RATE
        assert w.getnframes() == 2400


def test_empty_samples_still_valid_wav():
    blob = tts.float32_to_wav_bytes(np.zeros(0, dtype=np.float32))
    with wave.open(io.BytesIO(blob), "rb") as w:
        assert w.getnframes() == 0


def test_clipping_is_applied():
    loud = np.array([5.0, -5.0], dtype=np.float32)   # out of [-1, 1]
    blob = tts.float32_to_wav_bytes(loud)
    with wave.open(io.BytesIO(blob), "rb") as w:
        frames = w.readframes(w.getnframes())
    vals = np.frombuffer(frames, dtype="<i2")
    assert vals.max() <= 32767 and vals.min() >= -32767
