/* * Copyright (c) 2018 The WebRTC project authors. All Rights Reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree. */ #include "modules/audio_processing/agc2/rnn_vad/sequence_buffer.h" #include #include #include "test/gtest.h" namespace webrtc { namespace rnn_vad { namespace { template void TestSequenceBufferPushOp() { SCOPED_TRACE(S); SCOPED_TRACE(N); SequenceBuffer seq_buf; auto seq_buf_view = seq_buf.GetBufferView(); std::array chunk; // Check that a chunk is fully gone after ceil(S / N) push ops. chunk.fill(1); seq_buf.Push(chunk); chunk.fill(0); constexpr int required_push_ops = (S % N) ? S / N + 1 : S / N; for (int i = 0; i < required_push_ops - 1; ++i) { SCOPED_TRACE(i); seq_buf.Push(chunk); // Still in the buffer. const auto* m = std::max_element(seq_buf_view.begin(), seq_buf_view.end()); EXPECT_EQ(1, *m); } // Gone after another push. seq_buf.Push(chunk); const auto* m = std::max_element(seq_buf_view.begin(), seq_buf_view.end()); EXPECT_EQ(0, *m); // Check that the last item moves left by N positions after a push op. if (S > N) { // Fill in with non-zero values. for (int i = 0; i < N; ++i) chunk[i] = static_cast(i + 1); seq_buf.Push(chunk); // With the next Push(), `last` will be moved left by N positions. const T last = chunk[N - 1]; for (int i = 0; i < N; ++i) chunk[i] = static_cast(last + i + 1); seq_buf.Push(chunk); EXPECT_EQ(last, seq_buf_view[S - N - 1]); } } TEST(RnnVadTest, SequenceBufferGetters) { constexpr int buffer_size = 8; constexpr int chunk_size = 8; SequenceBuffer seq_buf; EXPECT_EQ(buffer_size, seq_buf.size()); EXPECT_EQ(chunk_size, seq_buf.chunks_size()); // Test view. auto seq_buf_view = seq_buf.GetBufferView(); EXPECT_EQ(0, seq_buf_view[0]); EXPECT_EQ(0, seq_buf_view[seq_buf_view.size() - 1]); constexpr std::array chunk = {10, 20, 30, 40, 50, 60, 70, 80}; seq_buf.Push(chunk); EXPECT_EQ(10, *seq_buf_view.begin()); EXPECT_EQ(80, *(seq_buf_view.end() - 1)); } TEST(RnnVadTest, SequenceBufferPushOpsUnsigned) { TestSequenceBufferPushOp(); // Chunk size: 25%. TestSequenceBufferPushOp(); // Chunk size: 50%. TestSequenceBufferPushOp(); // Chunk size: 100%. TestSequenceBufferPushOp(); // Non-integer ratio. } TEST(RnnVadTest, SequenceBufferPushOpsSigned) { TestSequenceBufferPushOp(); // Chunk size: 25%. TestSequenceBufferPushOp(); // Chunk size: 50%. TestSequenceBufferPushOp(); // Chunk size: 100%. TestSequenceBufferPushOp(); // Non-integer ratio. } TEST(RnnVadTest, SequenceBufferPushOpsFloating) { TestSequenceBufferPushOp(); // Chunk size: 25%. TestSequenceBufferPushOp(); // Chunk size: 50%. TestSequenceBufferPushOp(); // Chunk size: 100%. TestSequenceBufferPushOp(); // Non-integer ratio. } } // namespace } // namespace rnn_vad } // namespace webrtc