// Copyright (c) 2012 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 <math.h>
#include <stdlib.h>

#include "ppapi/shared_impl/time_conversion.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace ppapi {

// Slop we'll allow in two Time "internal values" to consider them equal.
// Double conversion can introduce rounding errors. The internal values are in
// microseconds, so an error here is very small.
static const int kTimeInternalValueSlop = 2;

// Same as above in double-precision seconds units.
static const double kTimeSecondsSlop =
    static_cast<double>(kTimeInternalValueSlop) /
    base::Time::kMicrosecondsPerSecond;

TEST(TimeConversion, Time) {
  // Should be able to round-trip.
  base::Time now = base::Time::Now();
  base::Time converted = ppapi::PPTimeToTime(TimeToPPTime(now));
  EXPECT_GE(kTimeInternalValueSlop,
            abs(static_cast<int>((converted - now).ToInternalValue())));

  // Units should be in seconds.
  base::Time one_second_from_now = now + base::TimeDelta::FromSeconds(1);
  double converted_one_second_from_now =
      ppapi::TimeToPPTime(one_second_from_now) - ppapi::TimeToPPTime(now);
  EXPECT_GE(kTimeSecondsSlop, fabs(converted_one_second_from_now - 1));
}

TEST(TimeConversion, EpochTime) {
  // Should be able to round-trip from epoch time.
  base::Time epoch = base::Time::UnixEpoch();
  base::Time converted = ppapi::PPTimeToTime(TimeToPPTime(epoch));
  EXPECT_GE(kTimeInternalValueSlop,
            abs(static_cast<int>((converted - epoch).ToInternalValue())));

  // Units should be in seconds.
  base::Time one_second_from_epoch = epoch + base::TimeDelta::FromSeconds(1);
  double converted_one_second_from_epoch =
      ppapi::TimeToPPTime(one_second_from_epoch) - ppapi::TimeToPPTime(epoch);
  EXPECT_GE(kTimeSecondsSlop, fabs(converted_one_second_from_epoch - 1));

  // Epoch time should be equal to a PP_Time of 0.0.
  EXPECT_GE(kTimeSecondsSlop, fabs(ppapi::TimeToPPTime(epoch) - 0.0));
  EXPECT_GE(kTimeInternalValueSlop,
            abs(static_cast<int>(
                (ppapi::PPTimeToTime(0.0) - epoch).ToInternalValue())));
}

}  // namespace ppapi
