// Copyright 2015 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include <limits>

#include "cobalt/web_animations/animation_effect_timing_read_only.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace cobalt {
namespace web_animations {

namespace {
AnimationEffectTimingReadOnly::Data CreateCanonicalTimingData() {
  return AnimationEffectTimingReadOnly::Data(
      base::TimeDelta::FromSeconds(1), base::TimeDelta::FromSeconds(1),
      AnimationEffectTimingReadOnly::kBoth, 0.2, 1.0,
      base::TimeDelta::FromSeconds(2), AnimationEffectTimingReadOnly::kNormal,
      cssom::TimingFunction::GetLinear());
}
}  // namespace

TEST(AnimationEffectTimingReadOnlyDataTests,
     ActiveTimeComputesToUnresolvedIfLocalTimeIsUnresolved) {
  AnimationEffectTimingReadOnly::Data timing = CreateCanonicalTimingData();

  base::optional<base::TimeDelta> active_time =
      timing.ComputeActiveTimeFromLocalTime(base::nullopt);

  EXPECT_FALSE(active_time);
}

TEST(AnimationEffectTimingReadOnlyDataTests,
     ActiveTimeSubtractsDelayDuringActivePhase) {
  AnimationEffectTimingReadOnly::Data timing = CreateCanonicalTimingData();

  base::optional<base::TimeDelta> active_time =
      timing.ComputeActiveTimeFromLocalTime(base::TimeDelta::FromSecondsD(2.0));

  ASSERT_TRUE(active_time);
  EXPECT_DOUBLE_EQ(1.0, active_time->InSecondsF());
}

TEST(AnimationEffectTimingReadOnlyDataTests,
     ActiveTimeComputesToZeroBeforeDelayWithFillModeBoth) {
  AnimationEffectTimingReadOnly::Data timing = CreateCanonicalTimingData();

  base::optional<base::TimeDelta> active_time =
      timing.ComputeActiveTimeFromLocalTime(base::TimeDelta::FromSecondsD(0.5));

  ASSERT_TRUE(active_time);
  EXPECT_DOUBLE_EQ(0.0, active_time->InSecondsF());
}

TEST(AnimationEffectTimingReadOnlyDataTests,
     ActiveTimeCapsAtDurationWithFillModeBoth) {
  AnimationEffectTimingReadOnly::Data timing = CreateCanonicalTimingData();

  base::optional<base::TimeDelta> active_time =
      timing.ComputeActiveTimeFromLocalTime(base::TimeDelta::FromSecondsD(3.5));

  ASSERT_TRUE(active_time);
  EXPECT_DOUBLE_EQ(2.0, active_time->InSecondsF());
}

TEST(AnimationEffectTimingReadOnlyDataTests,
     ScaledActiveTimeComputesToUnresolvedIfActiveTimeIsUnresolved) {
  AnimationEffectTimingReadOnly::Data timing = CreateCanonicalTimingData();

  base::optional<base::TimeDelta> scaled_active_time =
      timing.ComputeScaledActiveTimeFromActiveTime(base::nullopt);

  EXPECT_FALSE(scaled_active_time);
}

TEST(AnimationEffectTimingReadOnlyDataTests,
     ScaledActiveTimeAddsStartOffsetToActiveTime) {
  AnimationEffectTimingReadOnly::Data timing = CreateCanonicalTimingData();

  base::optional<base::TimeDelta> scaled_active_time =
      timing.ComputeScaledActiveTimeFromActiveTime(
          base::TimeDelta::FromSecondsD(0.5));

  ASSERT_TRUE(scaled_active_time);
  EXPECT_DOUBLE_EQ(0.9, scaled_active_time->InSecondsF());
}

TEST(AnimationEffectTimingReadOnlyDataTests,
     IterationTimeComputesToUnresolvedIfScaledActiveTimeIsUnresolved) {
  AnimationEffectTimingReadOnly::Data timing = CreateCanonicalTimingData();

  base::optional<base::TimeDelta> iteration_time =
      timing.ComputeIterationTimeFromScaledActiveTime(base::nullopt);

  EXPECT_FALSE(iteration_time);
}

TEST(AnimationEffectTimingReadOnlyDataTests,
     IterationTimeIsZeroIfDurationIsZero) {
  AnimationEffectTimingReadOnly::Data timing(
      base::TimeDelta::FromSeconds(1), base::TimeDelta::FromSeconds(1),
      AnimationEffectTimingReadOnly::kBoth, 0.2, 1.0,
      base::TimeDelta::FromSeconds(0), AnimationEffectTimingReadOnly::kNormal,
      cssom::TimingFunction::GetLinear());

  base::optional<base::TimeDelta> iteration_time =
      timing.ComputeIterationTimeFromScaledActiveTime(
          base::TimeDelta::FromSecondsD(0.5));

  ASSERT_TRUE(iteration_time);
  EXPECT_DOUBLE_EQ(0.0, iteration_time->InSecondsF());
}

TEST(AnimationEffectTimingReadOnlyDataTests,
     IterationTimeIsDurationIfAtEndOfIterations) {
  AnimationEffectTimingReadOnly::Data timing(
      base::TimeDelta::FromSeconds(1), base::TimeDelta::FromSeconds(1),
      AnimationEffectTimingReadOnly::kBoth, 0.2, 0.8,
      base::TimeDelta::FromSeconds(2), AnimationEffectTimingReadOnly::kNormal,
      cssom::TimingFunction::GetLinear());

  base::optional<base::TimeDelta> iteration_time =
      timing.ComputeIterationTimeFromScaledActiveTime(
          base::TimeDelta::FromSecondsD(2.0));

  ASSERT_TRUE(iteration_time);
  EXPECT_DOUBLE_EQ(2.0, iteration_time->InSecondsF());
}

TEST(AnimationEffectTimingReadOnlyDataTests,
     IterationTimeIsScaledActiveTimeModulosIterationDuration) {
  AnimationEffectTimingReadOnly::Data timing = CreateCanonicalTimingData();

  base::optional<base::TimeDelta> iteration_time =
      timing.ComputeIterationTimeFromScaledActiveTime(
          base::TimeDelta::FromSecondsD(2.5));

  ASSERT_TRUE(iteration_time);
  EXPECT_DOUBLE_EQ(0.5, iteration_time->InSecondsF());
}

TEST(AnimationEffectTimingReadOnlyDataTests,
     CurrentIterationIsUnresolvedIfActiveTimeIsUnresolved) {
  AnimationEffectTimingReadOnly::Data timing = CreateCanonicalTimingData();

  base::optional<double> current_iteration = timing.ComputeCurrentIteration(
      base::nullopt, base::nullopt, base::nullopt);

  EXPECT_FALSE(current_iteration);
}

TEST(AnimationEffectTimingReadOnlyDataTests,
     CurrentIterationIsFloorOfIterationStartIfActiveTimeIsZero) {
  AnimationEffectTimingReadOnly::Data timing(
      base::TimeDelta::FromSeconds(1), base::TimeDelta::FromSeconds(1),
      AnimationEffectTimingReadOnly::kBoth, 3.5, 0.8,
      base::TimeDelta::FromSeconds(2), AnimationEffectTimingReadOnly::kNormal,
      cssom::TimingFunction::GetLinear());

  base::TimeDelta active_time = base::TimeDelta();
  base::TimeDelta scaled_active_time =
      *timing.ComputeScaledActiveTimeFromActiveTime(active_time);
  base::TimeDelta iteration_time =
      *timing.ComputeIterationTimeFromScaledActiveTime(scaled_active_time);

  base::optional<double> current_iteration = timing.ComputeCurrentIteration(
      active_time, scaled_active_time, iteration_time);

  ASSERT_TRUE(current_iteration);
  EXPECT_EQ(3.0, *current_iteration);
}

TEST(AnimationEffectTimingReadOnlyDataTests,
     CurrentIterationIsInfinityIfDurationIsZeroAndIterationCountIsInfinity) {
  AnimationEffectTimingReadOnly::Data timing(
      base::TimeDelta::FromSeconds(1), base::TimeDelta::FromSeconds(1),
      AnimationEffectTimingReadOnly::kBoth, 3.5,
      std::numeric_limits<double>::infinity(), base::TimeDelta(),
      AnimationEffectTimingReadOnly::kNormal,
      cssom::TimingFunction::GetLinear());

  base::TimeDelta active_time(base::TimeDelta::FromSecondsD(1.0));
  base::TimeDelta scaled_active_time =
      *timing.ComputeScaledActiveTimeFromActiveTime(active_time);
  base::TimeDelta iteration_time =
      *timing.ComputeIterationTimeFromScaledActiveTime(scaled_active_time);

  base::optional<double> current_iteration = timing.ComputeCurrentIteration(
      active_time, scaled_active_time, iteration_time);

  ASSERT_TRUE(current_iteration);
  EXPECT_EQ(std::numeric_limits<double>::infinity(), *current_iteration);
}

TEST(AnimationEffectTimingReadOnlyDataTests,
     CurrentIterationIsCeilMinusOneOfCountPlusStartIfDurationIsZero) {
  AnimationEffectTimingReadOnly::Data timing(
      base::TimeDelta::FromSeconds(1), base::TimeDelta::FromSeconds(1),
      AnimationEffectTimingReadOnly::kBoth, 3.5, 0.8, base::TimeDelta(),
      AnimationEffectTimingReadOnly::kNormal,
      cssom::TimingFunction::GetLinear());

  base::TimeDelta active_time(base::TimeDelta::FromSecondsD(1.0));
  base::TimeDelta scaled_active_time =
      *timing.ComputeScaledActiveTimeFromActiveTime(active_time);
  base::TimeDelta iteration_time =
      *timing.ComputeIterationTimeFromScaledActiveTime(scaled_active_time);

  base::optional<double> current_iteration = timing.ComputeCurrentIteration(
      active_time, scaled_active_time, iteration_time);

  ASSERT_TRUE(current_iteration);
  EXPECT_EQ(4.0, *current_iteration);
}

TEST(AnimationEffectTimingReadOnlyDataTests,
     CurrentIterationIsCountPlusStartMinusOneIfIterationTimeIsDuration) {
  AnimationEffectTimingReadOnly::Data timing(
      base::TimeDelta::FromSeconds(1), base::TimeDelta::FromSeconds(1),
      AnimationEffectTimingReadOnly::kBoth, 0.2, 0.8,
      base::TimeDelta::FromSeconds(2), AnimationEffectTimingReadOnly::kNormal,
      cssom::TimingFunction::GetLinear());

  // This active time is chosen such that the resulting iteration_time will
  // be equal to the effect timing's duration.
  base::TimeDelta active_time(base::TimeDelta::FromSecondsD(1.6));
  base::TimeDelta scaled_active_time =
      *timing.ComputeScaledActiveTimeFromActiveTime(active_time);
  base::TimeDelta iteration_time =
      *timing.ComputeIterationTimeFromScaledActiveTime(scaled_active_time);

  ASSERT_DOUBLE_EQ(timing.duration().InSecondsF(), iteration_time.InSecondsF());

  base::optional<double> current_iteration = timing.ComputeCurrentIteration(
      active_time, scaled_active_time, iteration_time);

  ASSERT_TRUE(current_iteration);
  EXPECT_EQ(0.0, *current_iteration);
}

TEST(AnimationEffectTimingReadOnlyDataTests,
     CurrentIterationIsFloorOfScaledActiveTimeDividedByDuration) {
  AnimationEffectTimingReadOnly::Data timing(
      base::TimeDelta::FromSeconds(1), base::TimeDelta::FromSeconds(1),
      AnimationEffectTimingReadOnly::kBoth, 0.0, 3.0,
      base::TimeDelta::FromSeconds(2), AnimationEffectTimingReadOnly::kNormal,
      cssom::TimingFunction::GetLinear());

  base::TimeDelta active_time(base::TimeDelta::FromSecondsD(4.5));
  base::TimeDelta scaled_active_time =
      *timing.ComputeScaledActiveTimeFromActiveTime(active_time);
  base::TimeDelta iteration_time =
      *timing.ComputeIterationTimeFromScaledActiveTime(scaled_active_time);

  base::optional<double> current_iteration = timing.ComputeCurrentIteration(
      active_time, scaled_active_time, iteration_time);

  ASSERT_TRUE(current_iteration);
  EXPECT_EQ(2.0, *current_iteration);
}

TEST(AnimationEffectTimingReadOnlyDataTests,
     DirectedTimeIsUnresolvedIfIterationTimeIsUnresolved) {
  AnimationEffectTimingReadOnly::Data timing = CreateCanonicalTimingData();

  base::optional<base::TimeDelta> directed_time =
      timing.ComputeDirectedTimeFromIterationTime(base::nullopt, base::nullopt);

  EXPECT_FALSE(directed_time);
}

TEST(AnimationEffectTimingReadOnlyDataTests,
     DirectedTimeIsIterationTimeForForwardsDirection) {
  AnimationEffectTimingReadOnly::Data timing(
      base::TimeDelta::FromSeconds(1), base::TimeDelta::FromSeconds(1),
      AnimationEffectTimingReadOnly::kBoth, 0.0, 4.0,
      base::TimeDelta::FromSeconds(1), AnimationEffectTimingReadOnly::kNormal,
      cssom::TimingFunction::GetLinear());

  base::optional<base::TimeDelta> directed_time =
      timing.ComputeDirectedTimeFromIterationTime(
          base::TimeDelta::FromSecondsD(0.25), 0.0);

  ASSERT_TRUE(directed_time);
  EXPECT_EQ(0.25, directed_time->InSecondsF());
}

TEST(AnimationEffectTimingReadOnlyDataTests,
     DirectedTimeIsDurationMinusIterationTimeForReverseDirection) {
  AnimationEffectTimingReadOnly::Data timing(
      base::TimeDelta::FromSeconds(1), base::TimeDelta::FromSeconds(1),
      AnimationEffectTimingReadOnly::kBoth, 0.0, 4.0,
      base::TimeDelta::FromSeconds(1), AnimationEffectTimingReadOnly::kReverse,
      cssom::TimingFunction::GetLinear());

  base::optional<base::TimeDelta> directed_time =
      timing.ComputeDirectedTimeFromIterationTime(
          base::TimeDelta::FromSecondsD(0.25), 0.0);

  ASSERT_TRUE(directed_time);
  EXPECT_EQ(0.75, directed_time->InSecondsF());
}

TEST(AnimationEffectTimingReadOnlyDataTests,
     DirectedTimeAlternatesForAlternateDirection) {
  AnimationEffectTimingReadOnly::Data timing(
      base::TimeDelta::FromSeconds(1), base::TimeDelta::FromSeconds(1),
      AnimationEffectTimingReadOnly::kBoth, 0.0, 4.0,
      base::TimeDelta::FromSeconds(1),
      AnimationEffectTimingReadOnly::kAlternate,
      cssom::TimingFunction::GetLinear());

  base::optional<base::TimeDelta> directed_time =
      timing.ComputeDirectedTimeFromIterationTime(
          base::TimeDelta::FromSecondsD(0.25), 0.0);

  ASSERT_TRUE(directed_time);
  EXPECT_EQ(0.25, directed_time->InSecondsF());

  directed_time = timing.ComputeDirectedTimeFromIterationTime(
      base::TimeDelta::FromSecondsD(0.25), 1.0);

  ASSERT_TRUE(directed_time);
  EXPECT_EQ(0.75, directed_time->InSecondsF());
}

TEST(AnimationEffectTimingReadOnlyDataTests,
     DirectedTimeAlternatesForAlternateReverseDirection) {
  AnimationEffectTimingReadOnly::Data timing(
      base::TimeDelta::FromSeconds(1), base::TimeDelta::FromSeconds(1),
      AnimationEffectTimingReadOnly::kBoth, 0.0, 4.0,
      base::TimeDelta::FromSeconds(1),
      AnimationEffectTimingReadOnly::kAlternateReverse,
      cssom::TimingFunction::GetLinear());

  base::optional<base::TimeDelta> directed_time =
      timing.ComputeDirectedTimeFromIterationTime(
          base::TimeDelta::FromSecondsD(0.25), 0.0);

  ASSERT_TRUE(directed_time);
  EXPECT_EQ(0.75, directed_time->InSecondsF());

  directed_time = timing.ComputeDirectedTimeFromIterationTime(
      base::TimeDelta::FromSecondsD(0.25), 1.0);

  ASSERT_TRUE(directed_time);
  EXPECT_EQ(0.25, directed_time->InSecondsF());
}

TEST(AnimationEffectTimingReadOnlyDataTests,
     DirectedTimeIsIterationTimeForCurrentIterationOfInfinity) {
  AnimationEffectTimingReadOnly::Data timing(
      base::TimeDelta::FromSeconds(1), base::TimeDelta::FromSeconds(1),
      AnimationEffectTimingReadOnly::kBoth, 0.0,
      std::numeric_limits<double>::infinity(), base::TimeDelta::FromSeconds(1),
      AnimationEffectTimingReadOnly::kAlternate,
      cssom::TimingFunction::GetLinear());

  base::optional<base::TimeDelta> directed_time =
      timing.ComputeDirectedTimeFromIterationTime(
          base::TimeDelta::FromSecondsD(0.25),
          std::numeric_limits<double>::infinity());

  ASSERT_TRUE(directed_time);
  EXPECT_EQ(0.25, directed_time->InSecondsF());
}

TEST(AnimationEffectTimingReadOnlyDataTests,
     TransformedTimeIsUnresolvedIfDirectedTimeIsUnresolved) {
  AnimationEffectTimingReadOnly::Data timing = CreateCanonicalTimingData();

  base::optional<base::TimeDelta> transformed_time =
      timing.ComputeTransformedTimeFromDirectedTime(base::nullopt);

  EXPECT_FALSE(transformed_time);
}

TEST(AnimationEffectTimingReadOnlyDataTests,
     TransformedTimeIsDirectedTimeIfDurationIsInfinity) {
  AnimationEffectTimingReadOnly::Data timing(
      base::TimeDelta::FromSeconds(1), base::TimeDelta::FromSeconds(1),
      AnimationEffectTimingReadOnly::kBoth, 0.0, 3.0, base::TimeDelta::Max(),
      AnimationEffectTimingReadOnly::kNormal,
      cssom::TimingFunction::GetLinear());

  base::optional<base::TimeDelta> transformed_time =
      timing.ComputeTransformedTimeFromDirectedTime(
          base::TimeDelta::FromSecondsD(1.5));

  ASSERT_TRUE(transformed_time);
  EXPECT_DOUBLE_EQ(1.5, transformed_time->InSecondsF());
}

TEST(AnimationEffectTimingReadOnlyDataTests,
     TransformedTimeIsZeroIfDurationIsZero) {
  AnimationEffectTimingReadOnly::Data timing(
      base::TimeDelta::FromSeconds(1), base::TimeDelta::FromSeconds(1),
      AnimationEffectTimingReadOnly::kBoth, 0.0, 3.0, base::TimeDelta(),
      AnimationEffectTimingReadOnly::kNormal,
      cssom::TimingFunction::GetLinear());

  base::optional<base::TimeDelta> transformed_time =
      timing.ComputeTransformedTimeFromDirectedTime(
          base::TimeDelta::FromSecondsD(1.5));

  ASSERT_TRUE(transformed_time);
  EXPECT_DOUBLE_EQ(0.0, transformed_time->InSecondsF());
}

TEST(AnimationEffectTimingReadOnlyDataTests,
     TransformedTimeIsEqualToDirectedTimeForLinearEasing) {
  AnimationEffectTimingReadOnly::Data timing = CreateCanonicalTimingData();

  base::optional<base::TimeDelta> transformed_time =
      timing.ComputeTransformedTimeFromDirectedTime(
          base::TimeDelta::FromSecondsD(1.5));

  ASSERT_TRUE(transformed_time);
  EXPECT_NEAR(1.5, transformed_time->InSecondsF(), 0.0001);
}

TEST(AnimationEffectTimingReadOnlyDataTests,
     TransformedTimeIsEqualToTimingFunctionResultTimesDuration) {
  AnimationEffectTimingReadOnly::Data timing(
      base::TimeDelta::FromSeconds(1), base::TimeDelta::FromSeconds(1),
      AnimationEffectTimingReadOnly::kBoth, 0.2, 1.0,
      base::TimeDelta::FromSeconds(2), AnimationEffectTimingReadOnly::kNormal,
      cssom::TimingFunction::GetEase());

  base::optional<base::TimeDelta> transformed_time =
      timing.ComputeTransformedTimeFromDirectedTime(
          base::TimeDelta::FromSecondsD(1.5));

  ASSERT_TRUE(transformed_time);
  EXPECT_NEAR(cssom::TimingFunction::GetEase()->Evaluate(0.75) *
                  timing.duration().InSecondsF(),
              transformed_time->InSecondsF(), 0.0001);
}

TEST(AnimationEffectTimingReadOnlyDataTests,
     IterationProgressIsUnresolvedIfTransformedTimeIsUnresolved) {
  AnimationEffectTimingReadOnly::Data timing = CreateCanonicalTimingData();

  base::optional<double> iteration_progress =
      timing.ComputeIterationProgressFromTransformedTime(base::nullopt);

  EXPECT_FALSE(iteration_progress);
}

TEST(AnimationEffectTimingReadOnlyDataTests,
     IterationProgressIsTransformedTimeDividedByDuration) {
  AnimationEffectTimingReadOnly::Data timing = CreateCanonicalTimingData();

  base::optional<double> iteration_progress =
      timing.ComputeIterationProgressFromTransformedTime(
          base::TimeDelta::FromSecondsD(1.5));

  ASSERT_TRUE(iteration_progress);
  EXPECT_DOUBLE_EQ(0.75, *iteration_progress);
}

}  // namespace web_animations
}  // namespace cobalt
