/*
 *  Copyright 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/test/echo_canceller3_config_json.h"

#include "api/audio/echo_canceller3_config.h"
#include "test/gtest.h"

namespace webrtc {

TEST(EchoCanceller3JsonHelpers, ToStringAndParseJson) {
  EchoCanceller3Config cfg;
  cfg.delay.down_sampling_factor = 1u;
  cfg.delay.log_warning_on_delay_changes = true;
  cfg.filter.refined.error_floor = 2.f;
  cfg.filter.coarse_initial.length_blocks = 3u;
  cfg.filter.high_pass_filter_echo_reference =
      !cfg.filter.high_pass_filter_echo_reference;
  cfg.comfort_noise.noise_floor_dbfs = 100.f;
  cfg.echo_model.model_reverb_in_nonlinear_mode = false;
  cfg.suppressor.normal_tuning.mask_hf.enr_suppress = .5f;
  cfg.suppressor.subband_nearend_detection.nearend_average_blocks = 3;
  cfg.suppressor.subband_nearend_detection.subband1 = {1, 3};
  cfg.suppressor.subband_nearend_detection.subband1 = {4, 5};
  cfg.suppressor.subband_nearend_detection.nearend_threshold = 2.f;
  cfg.suppressor.subband_nearend_detection.snr_threshold = 100.f;
  cfg.multi_channel.detect_stereo_content =
      !cfg.multi_channel.detect_stereo_content;
  cfg.multi_channel.stereo_detection_threshold += 1.0f;
  cfg.multi_channel.stereo_detection_timeout_threshold_seconds += 1;
  cfg.multi_channel.stereo_detection_hysteresis_seconds += 1;

  std::string json_string = Aec3ConfigToJsonString(cfg);
  EchoCanceller3Config cfg_transformed;
  bool parsing_successful;
  Aec3ConfigFromJsonString(json_string, &cfg_transformed, & parsing_successful);
  ASSERT_TRUE(parsing_successful);

  // Expect unchanged values to remain default.
  EXPECT_EQ(cfg.ep_strength.default_len,
            cfg_transformed.ep_strength.default_len);
  EXPECT_EQ(cfg.ep_strength.nearend_len,
            cfg_transformed.ep_strength.nearend_len);
  EXPECT_EQ(cfg.suppressor.normal_tuning.mask_lf.enr_suppress,
            cfg_transformed.suppressor.normal_tuning.mask_lf.enr_suppress);

  // Expect changed values to carry through the transformation.
  EXPECT_EQ(cfg.delay.down_sampling_factor,
            cfg_transformed.delay.down_sampling_factor);
  EXPECT_EQ(cfg.delay.log_warning_on_delay_changes,
            cfg_transformed.delay.log_warning_on_delay_changes);
  EXPECT_EQ(cfg.filter.coarse_initial.length_blocks,
            cfg_transformed.filter.coarse_initial.length_blocks);
  EXPECT_EQ(cfg.filter.refined.error_floor,
            cfg_transformed.filter.refined.error_floor);
  EXPECT_EQ(cfg.filter.high_pass_filter_echo_reference,
            cfg_transformed.filter.high_pass_filter_echo_reference);
  EXPECT_EQ(cfg.comfort_noise.noise_floor_dbfs,
            cfg_transformed.comfort_noise.noise_floor_dbfs);
  EXPECT_EQ(cfg.echo_model.model_reverb_in_nonlinear_mode,
            cfg_transformed.echo_model.model_reverb_in_nonlinear_mode);
  EXPECT_EQ(cfg.suppressor.normal_tuning.mask_hf.enr_suppress,
            cfg_transformed.suppressor.normal_tuning.mask_hf.enr_suppress);
  EXPECT_EQ(cfg.suppressor.subband_nearend_detection.nearend_average_blocks,
            cfg_transformed.suppressor.subband_nearend_detection
                .nearend_average_blocks);
  EXPECT_EQ(cfg.suppressor.subband_nearend_detection.subband1.low,
            cfg_transformed.suppressor.subband_nearend_detection.subband1.low);
  EXPECT_EQ(cfg.suppressor.subband_nearend_detection.subband1.high,
            cfg_transformed.suppressor.subband_nearend_detection.subband1.high);
  EXPECT_EQ(cfg.suppressor.subband_nearend_detection.subband2.low,
            cfg_transformed.suppressor.subband_nearend_detection.subband2.low);
  EXPECT_EQ(cfg.suppressor.subband_nearend_detection.subband2.high,
            cfg_transformed.suppressor.subband_nearend_detection.subband2.high);
  EXPECT_EQ(
      cfg.suppressor.subband_nearend_detection.nearend_threshold,
      cfg_transformed.suppressor.subband_nearend_detection.nearend_threshold);
  EXPECT_EQ(cfg.suppressor.subband_nearend_detection.snr_threshold,
            cfg_transformed.suppressor.subband_nearend_detection.snr_threshold);
  EXPECT_EQ(cfg.multi_channel.detect_stereo_content,
            cfg_transformed.multi_channel.detect_stereo_content);
  EXPECT_EQ(cfg.multi_channel.stereo_detection_threshold,
            cfg_transformed.multi_channel.stereo_detection_threshold);
  EXPECT_EQ(
      cfg.multi_channel.stereo_detection_timeout_threshold_seconds,
      cfg_transformed.multi_channel.stereo_detection_timeout_threshold_seconds);
  EXPECT_EQ(cfg.multi_channel.stereo_detection_hysteresis_seconds,
            cfg_transformed.multi_channel.stereo_detection_hysteresis_seconds);
}
}  // namespace webrtc
