# Copyright (c) 2017 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.

import("../../../../webrtc.gni")

if (!build_with_chromium) {
  group("py_quality_assessment") {
    testonly = true
    deps = [
      ":scripts",
      ":unit_tests",
    ]
  }

  copy("scripts") {
    testonly = true
    sources = [
      "README.md",
      "apm_quality_assessment.py",
      "apm_quality_assessment.sh",
      "apm_quality_assessment_boxplot.py",
      "apm_quality_assessment_export.py",
      "apm_quality_assessment_gencfgs.py",
      "apm_quality_assessment_optimize.py",
    ]
    outputs = [ "$root_build_dir/py_quality_assessment/{{source_file_part}}" ]
    deps = [
      ":apm_configs",
      ":lib",
      ":output",
      "../../../../resources/audio_processing/test/py_quality_assessment:probing_signals",
      "../../../../rtc_tools:audioproc_f",
    ]
  }

  copy("apm_configs") {
    testonly = true
    sources = [ "apm_configs/default.json" ]
    visibility = [ ":*" ]  # Only targets in this file can depend on this.
    outputs = [
      "$root_build_dir/py_quality_assessment/apm_configs/{{source_file_part}}",
    ]
  }  # apm_configs

  copy("lib") {
    testonly = true
    sources = [
      "quality_assessment/__init__.py",
      "quality_assessment/annotations.py",
      "quality_assessment/audioproc_wrapper.py",
      "quality_assessment/collect_data.py",
      "quality_assessment/data_access.py",
      "quality_assessment/echo_path_simulation.py",
      "quality_assessment/echo_path_simulation_factory.py",
      "quality_assessment/eval_scores.py",
      "quality_assessment/eval_scores_factory.py",
      "quality_assessment/evaluation.py",
      "quality_assessment/exceptions.py",
      "quality_assessment/export.py",
      "quality_assessment/export_unittest.py",
      "quality_assessment/external_vad.py",
      "quality_assessment/input_mixer.py",
      "quality_assessment/input_signal_creator.py",
      "quality_assessment/results.css",
      "quality_assessment/results.js",
      "quality_assessment/signal_processing.py",
      "quality_assessment/simulation.py",
      "quality_assessment/test_data_generation.py",
      "quality_assessment/test_data_generation_factory.py",
    ]
    visibility = [ ":*" ]  # Only targets in this file can depend on this.
    outputs = [ "$root_build_dir/py_quality_assessment/quality_assessment/{{source_file_part}}" ]
    deps = [ "../../../../resources/audio_processing/test/py_quality_assessment:noise_tracks" ]
  }

  copy("output") {
    testonly = true
    sources = [ "output/README.md" ]
    visibility = [ ":*" ]  # Only targets in this file can depend on this.
    outputs =
        [ "$root_build_dir/py_quality_assessment/output/{{source_file_part}}" ]
  }

  group("unit_tests") {
    testonly = true
    visibility = [ ":*" ]  # Only targets in this file can depend on this.
    deps = [
      ":apm_vad",
      ":fake_polqa",
      ":lib_unit_tests",
      ":scripts_unit_tests",
      ":vad",
    ]
  }

  rtc_executable("fake_polqa") {
    testonly = true
    sources = [ "quality_assessment/fake_polqa.cc" ]
    visibility = [ ":*" ]  # Only targets in this file can depend on this.
    output_dir = "${root_out_dir}/py_quality_assessment/quality_assessment"
    deps = [
      "../../../../rtc_base:checks",
      "../../../../rtc_base:rtc_base_approved",
    ]
  }

  rtc_executable("vad") {
    testonly = true
    sources = [ "quality_assessment/vad.cc" ]
    deps = [
      "../../../../common_audio",
      "../../../../rtc_base:rtc_base_approved",
      "//third_party/abseil-cpp/absl/flags:flag",
      "//third_party/abseil-cpp/absl/flags:parse",
    ]
  }

  rtc_executable("apm_vad") {
    testonly = true
    sources = [ "quality_assessment/apm_vad.cc" ]
    deps = [
      "../..",
      "../../../../common_audio",
      "../../../../rtc_base:rtc_base_approved",
      "../../vad",
      "//third_party/abseil-cpp/absl/flags:flag",
      "//third_party/abseil-cpp/absl/flags:parse",
    ]
  }

  rtc_executable("sound_level") {
    testonly = true
    sources = [ "quality_assessment/sound_level.cc" ]
    deps = [
      "../..",
      "../../../../common_audio",
      "../../../../rtc_base:rtc_base_approved",
      "//third_party/abseil-cpp/absl/flags:flag",
      "//third_party/abseil-cpp/absl/flags:parse",
    ]
  }

  copy("lib_unit_tests") {
    testonly = true
    sources = [
      "quality_assessment/annotations_unittest.py",
      "quality_assessment/echo_path_simulation_unittest.py",
      "quality_assessment/eval_scores_unittest.py",
      "quality_assessment/fake_external_vad.py",
      "quality_assessment/input_mixer_unittest.py",
      "quality_assessment/signal_processing_unittest.py",
      "quality_assessment/simulation_unittest.py",
      "quality_assessment/test_data_generation_unittest.py",
    ]
    visibility = [ ":*" ]  # Only targets in this file can depend on this.
    outputs = [ "$root_build_dir/py_quality_assessment/quality_assessment/{{source_file_part}}" ]
  }

  copy("scripts_unit_tests") {
    testonly = true
    sources = [ "apm_quality_assessment_unittest.py" ]
    visibility = [ ":*" ]  # Only targets in this file can depend on this.
    outputs = [ "$root_build_dir/py_quality_assessment/{{source_file_part}}" ]
  }
}
