/*
 *  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 <array>

#include "modules/audio_processing/agc2/rnn_vad/common.h"
#include "modules/audio_processing/agc2/rnn_vad/fft_util.h"
#include "rtc_base/checks.h"
// TODO(bugs.webrtc.org/8948): Add when the issue is fixed.
// #include "test/fpe_observer.h"
#include "test/gtest.h"

namespace webrtc {
namespace rnn_vad {
namespace test {

TEST(RnnVadTest, CheckBandAnalysisFftOutput) {
  // Input data.
  std::array<float, kFrameSize20ms24kHz> samples{};
  for (int i = 0; i < static_cast<int>(kFrameSize20ms24kHz); ++i) {
    samples[i] = i - static_cast<int>(kFrameSize20ms24kHz / 2);
  }
  // TODO(bugs.webrtc.org/8948): Add when the issue is fixed.
  // FloatingPointExceptionObserver fpe_observer;
  BandAnalysisFft fft;
  std::array<std::complex<float>, kFrameSize20ms24kHz> fft_coeffs;
  fft.ForwardFft({samples}, {fft_coeffs});
  // First coefficient is DC - i.e., real number.
  EXPECT_EQ(0.f, fft_coeffs[0].imag());
  // Check conjugated symmetry of the FFT output.
  for (size_t i = 1; i < fft_coeffs.size() / 2; ++i) {
    SCOPED_TRACE(i);
    const auto& a = fft_coeffs[i];
    const auto& b = fft_coeffs[fft_coeffs.size() - i];
    EXPECT_NEAR(a.real(), b.real(), 2e-6f);
    EXPECT_NEAR(a.imag(), -b.imag(), 2e-6f);
  }
}

}  // namespace test
}  // namespace rnn_vad
}  // namespace webrtc
