using MeetingAssistant.Recording; using NAudio.Wave; namespace MeetingAssistant.Tests; public sealed class RollingAudioBufferTests { [Fact] public void TryExtractWavReturnsRequestedRangeFromBufferedPcm() { var buffer = new RollingAudioBuffer(TimeSpan.FromSeconds(10)); buffer.Append(new AudioChunk(Samples(0, 1, 2, 3), SampleRate: 2, Channels: 1)); buffer.Append(new AudioChunk(Samples(4, 5, 6, 7), SampleRate: 2, Channels: 1)); var wav = buffer.TryExtractWav(TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(3)); using var reader = new WaveFileReader(new MemoryStream(wav)); var bytes = new byte[reader.Length]; var read = reader.Read(bytes, 0, bytes.Length); Assert.Equal(bytes.Length, read); Assert.Equal(Samples(2, 3, 4, 5), bytes); } [Fact] public void TryExtractWavDropsAudioOutsideRetentionWindow() { var buffer = new RollingAudioBuffer(TimeSpan.FromSeconds(1)); buffer.Append(new AudioChunk(Samples(0, 1), SampleRate: 1, Channels: 1)); buffer.Append(new AudioChunk(Samples(2, 3), SampleRate: 1, Channels: 1)); var wav = buffer.TryExtractWav(TimeSpan.Zero, TimeSpan.FromSeconds(1)); Assert.Empty(wav); } private static byte[] Samples(params short[] samples) { var bytes = new byte[samples.Length * sizeof(short)]; Buffer.BlockCopy(samples, 0, bytes, 0, bytes.Length); return bytes; } }