// Copyright (c) 2021 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "media/audio/win/volume_range_util.h"

#include "base/test/metrics/histogram_tester.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/abseil-cpp/absl/types/optional.h"

namespace media {
namespace {

using base::Bucket;
using testing::ElementsAre;

constexpr int kClampedMaxVolumeDb = 60;
constexpr int kVolumeOffsetDb = 60;
constexpr int kMaxNumSteps = 2000;

constexpr VolumeRange kValidVolumeRange{.min_volume_db = -17.0f,
                                        .max_volume_db = 20.0f,
                                        .volume_step_db = 0.03125f};

constexpr int ComputeNumSteps(VolumeRange range) {
  return (range.max_volume_db - range.min_volume_db) / range.volume_step_db;
}

TEST(VolumeRangeUtilWin, LogUnavailableVolumeRange) {
  base::HistogramTester tester;
  LogVolumeRangeUmaHistograms(/*range=*/absl::nullopt);
  EXPECT_THAT(
      tester.GetAllSamples("Media.Audio.Capture.Win.VolumeRangeAvailable"),
      ElementsAre(Bucket(false, 1)));
}

TEST(VolumeRangeUtilWin, LogAvailableVolumeRange) {
  base::HistogramTester tester;
  LogVolumeRangeUmaHistograms(kValidVolumeRange);
  EXPECT_THAT(
      tester.GetAllSamples("Media.Audio.Capture.Win.VolumeRangeAvailable"),
      ElementsAre(Bucket(true, 1)));
}

TEST(VolumeRangeUtilWin, VolumeRangeMinMaxOffsetAdded) {
  base::HistogramTester tester;
  LogVolumeRangeUmaHistograms(kValidVolumeRange);
  tester.ExpectUniqueSample(
      "Media.Audio.Capture.Win.VolumeRangeMin2",
      static_cast<int>(kValidVolumeRange.min_volume_db + kVolumeOffsetDb), 1);
  tester.ExpectUniqueSample(
      "Media.Audio.Capture.Win.VolumeRangeMax2",
      static_cast<int>(kValidVolumeRange.max_volume_db + kVolumeOffsetDb), 1);
}

TEST(VolumeRangeUtilWin, VolumeRangeMinMaxRoundedOff) {
  base::HistogramTester tester;
  constexpr VolumeRange kVolumeRange{.min_volume_db = -1.123f,
                                     .max_volume_db = 1.123f,
                                     .volume_step_db = 2.246};
  LogVolumeRangeUmaHistograms(kVolumeRange);
  tester.ExpectUniqueSample("Media.Audio.Capture.Win.VolumeRangeMin2",
                            -2 + kVolumeOffsetDb, 1);
  tester.ExpectUniqueSample("Media.Audio.Capture.Win.VolumeRangeMax2",
                            2 + kVolumeOffsetDb, 1);
}

// Checks that volume values outside of the expected range fall into the first
// and the last (a.k.a., overflow) buckets respectively.
TEST(VolumeRangeUtilWin, VolumeRangeMinMaxClamped) {
  base::HistogramTester tester;
  constexpr VolumeRange kVolumeRange{.min_volume_db = -10000.0f,
                                     .max_volume_db = 10000.0f,
                                     .volume_step_db = 1.0f};
  LogVolumeRangeUmaHistograms(kVolumeRange);
  tester.ExpectUniqueSample("Media.Audio.Capture.Win.VolumeRangeMin2", 0, 1);
  constexpr int kOverflowBucket = kClampedMaxVolumeDb + kVolumeOffsetDb + 1;
  tester.ExpectUniqueSample("Media.Audio.Capture.Win.VolumeRangeMax2",
                            kOverflowBucket, 1);
}

TEST(VolumeRangeUtilWin, VolumeRangeNumSteps) {
  base::HistogramTester tester;
  LogVolumeRangeUmaHistograms(kValidVolumeRange);
  tester.ExpectUniqueSample("Media.Audio.Capture.Win.VolumeRangeNumSteps",
                            ComputeNumSteps(kValidVolumeRange), 1);
}

TEST(VolumeRangeUtilWin, VolumeRangeNumStepsClamped) {
  base::HistogramTester tester;
  constexpr VolumeRange kVolumeRange{.min_volume_db = -17.0f,
                                     .max_volume_db = 20.0f,
                                     .volume_step_db = 0.00925f};
  LogVolumeRangeUmaHistograms(kVolumeRange);
  constexpr int kNumSteps = ComputeNumSteps(kVolumeRange);
  static_assert(kNumSteps > kMaxNumSteps, "");
  tester.ExpectUniqueSample("Media.Audio.Capture.Win.VolumeRangeNumSteps",
                            kMaxNumSteps, 1);
}

}  // namespace
}  // namespace media
