// Ceres Solver - A fast non-linear least squares minimizer
// Copyright 2015 Google Inc. All rights reserved.
// http://ceres-solver.org/
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// * Redistributions of source code must retain the above copyright notice,
//   this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above copyright notice,
//   this list of conditions and the following disclaimer in the documentation
//   and/or other materials provided with the distribution.
// * Neither the name of Google Inc. nor the names of its contributors may be
//   used to endorse or promote products derived from this software without
//   specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
//
// Author: dgossow@google.com (David Gossow)
//
// This file contains tests for the IsClose function.

#include "ceres/is_close.h"
#include "gtest/gtest.h"

namespace ceres {
namespace internal {

const double kTolerance = 1e-9;

TEST(IsClose, BothParametersPositive) {
  double relative_error = -1;
  double absolute_error = -1;

  // Test cases where both values are positive.
  EXPECT_TRUE(IsClose(9.9, 10.0, 0.011, &relative_error, &absolute_error));
  EXPECT_NEAR(relative_error, 0.01, kTolerance);
  EXPECT_NEAR(absolute_error, 0.1, kTolerance);
  relative_error = -1;
  absolute_error = -1;
  EXPECT_TRUE(IsClose(10.0, 9.9, 0.011, &relative_error, &absolute_error));
  EXPECT_NEAR(relative_error, 0.01, kTolerance);
  EXPECT_NEAR(absolute_error, 0.1, kTolerance);
  relative_error = -1;
  absolute_error = -1;

  EXPECT_FALSE(IsClose(9.9, 10.0, 0.009, &relative_error, &absolute_error));
  EXPECT_NEAR(relative_error, 0.01, kTolerance);
  EXPECT_NEAR(absolute_error, 0.1, kTolerance);
  relative_error = -1;
  absolute_error = -1;
  EXPECT_FALSE(IsClose(10.0, 9.9, 0.009, &relative_error, &absolute_error));
  EXPECT_NEAR(relative_error, 0.01, kTolerance);
  EXPECT_NEAR(absolute_error, 0.1, kTolerance);
}

TEST(IsClose, BothParametersNegative) {
  double relative_error = -1;
  double absolute_error = -1;

  // Test cases where both values are negative.
  EXPECT_TRUE(IsClose(-9.9, -10.0, 0.011, &relative_error, &absolute_error));
  EXPECT_NEAR(relative_error, 0.01, kTolerance);
  EXPECT_NEAR(absolute_error, 0.1, kTolerance);
  relative_error = -1;
  absolute_error = -1;
  EXPECT_TRUE(IsClose(-10.0, -9.9, 0.011, &relative_error, &absolute_error));
  EXPECT_NEAR(relative_error, 0.01, kTolerance);
  EXPECT_NEAR(absolute_error, 0.1, kTolerance);
  relative_error = -1;
  absolute_error = -1;

  EXPECT_FALSE(IsClose(-9.9, -10.0, 0.009, &relative_error, &absolute_error));
  EXPECT_NEAR(relative_error, 0.01, kTolerance);
  EXPECT_NEAR(absolute_error, 0.1, kTolerance);
  relative_error = -1;
  absolute_error = -1;
  EXPECT_FALSE(IsClose(-10.0, -9.9, 0.009, &relative_error, &absolute_error));
  EXPECT_NEAR(relative_error, 0.01, kTolerance);
  EXPECT_NEAR(absolute_error, 0.1, kTolerance);
}

TEST(IsClose, ParametersHaveMixedSigns) {
  double relative_error = -1;
  double absolute_error = -1;

  // Test cases with mixed signs.
  EXPECT_FALSE(IsClose(-0.1, 0.1, 1.99, &relative_error, &absolute_error));
  EXPECT_NEAR(relative_error, 2.0, kTolerance);
  EXPECT_NEAR(absolute_error, 0.2, kTolerance);
  relative_error = -1;
  absolute_error = -1;
  EXPECT_TRUE(IsClose(-0.1, 0.1, 2.01, &relative_error, &absolute_error));
  EXPECT_NEAR(relative_error, 2.0, kTolerance);
  EXPECT_NEAR(absolute_error, 0.2, kTolerance);
  relative_error = -1;
  absolute_error = -1;
  EXPECT_FALSE(IsClose(0.1, -0.1, 1.99, &relative_error, &absolute_error));
  EXPECT_NEAR(relative_error, 2.0, kTolerance);
  EXPECT_NEAR(absolute_error, 0.2, kTolerance);
  relative_error = -1;
  absolute_error = -1;
  EXPECT_TRUE(IsClose(0.1, -0.1, 2.01, &relative_error, &absolute_error));
  EXPECT_NEAR(relative_error, 2.0, kTolerance);
  EXPECT_NEAR(absolute_error, 0.2, kTolerance);
}

TEST(IsClose, OneParameterZero) {
  double relative_error = -1;
  double absolute_error = -1;

  // Test cases where one of the values is zero.
  EXPECT_TRUE(IsClose(0.0, 10.0, 10.1, &relative_error, &absolute_error));
  EXPECT_NEAR(relative_error, 10.0, kTolerance);
  EXPECT_NEAR(absolute_error, 10.0, kTolerance);
  relative_error = -1;
  absolute_error = -1;
  EXPECT_TRUE(IsClose(10.0, 0.0, 10.1, &relative_error, &absolute_error));
  EXPECT_NEAR(relative_error, 10.0, kTolerance);
  EXPECT_NEAR(absolute_error, 10.0, kTolerance);
  relative_error = -1;
  absolute_error = -1;
  EXPECT_TRUE(IsClose(0.0, -10.0, 10.1, &relative_error, &absolute_error));
  EXPECT_NEAR(relative_error, 10.0, kTolerance);
  EXPECT_NEAR(absolute_error, 10.0, kTolerance);
  relative_error = -1;
  absolute_error = -1;
  EXPECT_TRUE(IsClose(-10.0, 0.0, 10.1, &relative_error, &absolute_error));
  EXPECT_NEAR(relative_error, 10.0, kTolerance);
  EXPECT_NEAR(absolute_error, 10.0, kTolerance);
  relative_error = -1;
  absolute_error = -1;

  EXPECT_FALSE(IsClose(0, 10.0, 9.9, &relative_error, &absolute_error));
  EXPECT_NEAR(relative_error, 10.0, kTolerance);
  EXPECT_NEAR(absolute_error, 10.0, kTolerance);
  relative_error = -1;
  absolute_error = -1;
  EXPECT_FALSE(IsClose(10.0, 0.0, 9.9, &relative_error, &absolute_error));
  EXPECT_NEAR(relative_error, 10.0, kTolerance);
  EXPECT_NEAR(absolute_error, 10.0, kTolerance);
  relative_error = -1;
  absolute_error = -1;
  EXPECT_FALSE(IsClose(0, -10.0, 9.9, &relative_error, &absolute_error));
  EXPECT_NEAR(relative_error, 10.0, kTolerance);
  EXPECT_NEAR(absolute_error, 10.0, kTolerance);
  relative_error = -1;
  absolute_error = -1;
  EXPECT_FALSE(IsClose(-10.0, 0.0, 9.9, &relative_error, &absolute_error));
  EXPECT_NEAR(relative_error, 10.0, kTolerance);
  EXPECT_NEAR(absolute_error, 10.0, kTolerance);
}

TEST(IsClose, BothParametersZero) {
  double relative_error = -1;
  double absolute_error = -1;
  EXPECT_TRUE(IsClose(0.0, 0.0, 0.1, &relative_error, &absolute_error));
  EXPECT_NEAR(relative_error, 0.0, kTolerance);
  EXPECT_NEAR(absolute_error, 0.0, kTolerance);
  relative_error = -1;
  absolute_error = -1;
  EXPECT_FALSE(IsClose(0.0, 0.0, 0.0, &relative_error, &absolute_error));
  EXPECT_NEAR(relative_error, 0.0, kTolerance);
  EXPECT_NEAR(absolute_error, 0.0, kTolerance);
}
}  // namespace internal
}  // namespace ceres
