// Copyright (c) 2012 The Chromium OS 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 <stdio.h>
#include <gtest/gtest.h>

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

namespace {

TEST(VolumeCurve, DefaultCurve) {
  struct cras_volume_curve *curve;
  curve = cras_volume_curve_create_default();
  ASSERT_NE(static_cast<struct cras_volume_curve *>(NULL), curve);
  EXPECT_EQ(0 - 50 * 50, curve->get_dBFS(curve, 50));
  EXPECT_EQ(0, curve->get_dBFS(curve, 100));
  EXPECT_EQ(0 - 100 * 50, curve->get_dBFS(curve, 0));
  EXPECT_EQ(0 - 25 * 50, curve->get_dBFS(curve, 75));
  cras_volume_curve_destroy(curve);
}

TEST(VolumeCurve, SteppedCurve) {
  struct cras_volume_curve *curve;
  curve = cras_volume_curve_create_simple_step(-600, 75);
  ASSERT_NE(static_cast<struct cras_volume_curve *>(NULL), curve);
  EXPECT_EQ(-600 - 50 * 75, curve->get_dBFS(curve, 50));
  EXPECT_EQ(-600, curve->get_dBFS(curve, 100));
  EXPECT_EQ(-600 - 100 * 75, curve->get_dBFS(curve, 0));
  EXPECT_EQ(-600 - 25 * 75, curve->get_dBFS(curve, 75));
  cras_volume_curve_destroy(curve);
}

TEST(VolumeCurve, ExplicitCurve) {
  struct cras_volume_curve *curve;
  long dB_vals[101];

  for (unsigned int i = 0; i < 101; i++)
	  dB_vals[i] = i * 2 + -400;
  curve = cras_volume_curve_create_explicit(dB_vals);
  ASSERT_NE(static_cast<struct cras_volume_curve *>(NULL), curve);
  for (unsigned int i = 0; i < 101; i++)
	  EXPECT_EQ(i * 2 - 400, curve->get_dBFS(curve, i));
  cras_volume_curve_destroy(curve);
}

}  //  namespace

int main(int argc, char **argv) {
  ::testing::InitGoogleTest(&argc, argv);
  return RUN_ALL_TESTS();
}