// Copyright 2023 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "webrtc_apm.h"

#include <numeric>
#include <vector>

#include "common_audio/wav_file.h"
#include "gmock/gmock.h"
#include "gtest/gtest.h"

extern "C" {
#include "iniparser.h"
}

namespace {

TEST(WebRTCAPM, Smoke) {
  dictionary* aec_ini = dictionary_new(0);
  dictionary* apm_ini = dictionary_new(0);
  webrtc_apm apm = webrtc_apm_create_with_enforced_effects(1, 48000, aec_ini,
                                                           apm_ini, 0, 0, 0);
  dictionary_del(aec_ini);
  dictionary_del(apm_ini);
  webrtc_apm_destroy(apm);
}

struct VADParam {
  bool enable_aec = false;
};

class VADTest : public ::testing::TestWithParam<VADParam> {
 protected:
  void SetUp() override {
    aec_ini_ = dictionary_new(0);
    apm_ini_ = dictionary_new(0);
    apm_ = webrtc_apm_create_with_enforced_effects(1, 48000, aec_ini_, apm_ini_,
                                                   GetParam().enable_aec, 0, 0);
    webrtc_apm_enable_vad(apm_, true);
  }

  void TearDown() override {
    webrtc_apm_destroy(apm_);
    dictionary_del(aec_ini_);
    dictionary_del(apm_ini_);
  }

 protected:
  dictionary* aec_ini_;
  dictionary* apm_ini_;
  webrtc_apm apm_;
};

MATCHER_P(SumGreaterThan, n, "") {
  return std::accumulate(arg.begin(), arg.end(), 0) > n;
}

TEST_P(VADTest, Speech) {
  webrtc::WavReader wav("external/the_quick_brown_fox_wav/file/downloaded");

  // For documentation purposes.
  ASSERT_EQ(wav.num_channels(), 1);
  ASSERT_EQ(wav.num_samples(), 81792);

  std::vector<float> buffer(480);

  std::vector<int> detected;
  for (int i = 0; i < 40; i++) {
    ASSERT_EQ(wav.ReadSamples(buffer.size(), buffer.data()), buffer.size());
    float* ptr = buffer.data();
    webrtc_apm_process_stream_f(apm_, 1, 48000, &ptr);
    detected.push_back(webrtc_apm_get_voice_detected(apm_));
  }
  EXPECT_THAT(detected, SumGreaterThan(35));
}

TEST_P(VADTest, Silence) {
  for (int i = 0; i < 40; i++) {
    std::vector<float> buffer(480);

    float* ptr = buffer.data();
    webrtc_apm_process_stream_f(apm_, 1, 48000, &ptr);
    EXPECT_FALSE(webrtc_apm_get_voice_detected(apm_)) << "i = " << i;
  }
}

INSTANTIATE_TEST_SUITE_P(VADTestSuite, VADTest,
                         testing::Values(VADParam{.enable_aec = true},
                                         VADParam{.enable_aec = false}));

}  // namespace
