// Copyright 2014 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 "cobalt/media/base/text_ranges.h"

#include "base/time.h"
#include "starboard/types.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace cobalt {
namespace media {

class TextRangesTest : public ::testing::Test {
 protected:
  bool AddCue(int seconds) {
    return ranges_.AddCue(base::TimeDelta::FromSeconds(seconds));
  }

  void Reset() { ranges_.Reset(); }

  size_t RangeCount() { return ranges_.RangeCountForTesting(); }

  TextRanges ranges_;
};

TEST_F(TextRangesTest, TestEmptyRanges) {
  // Create a new active range, with t=5.
  EXPECT_TRUE(AddCue(5));

  // Create a new active range, with t=2.
  Reset();
  EXPECT_TRUE(AddCue(2));

  // Create a new active range, with t=8.
  Reset();
  EXPECT_TRUE(AddCue(8));

  Reset();

  // Make range [2, 2] active.
  EXPECT_FALSE(AddCue(2));
  EXPECT_EQ(RangeCount(), 3U);

  // Coalesce first two ranges: [2, 5].
  EXPECT_FALSE(AddCue(5));
  EXPECT_EQ(RangeCount(), 2U);

  // Coalesce first two ranges: [2, 8].
  EXPECT_FALSE(AddCue(8));
  EXPECT_EQ(RangeCount(), 1U);

  // Add new cue to end of (only) range.
  EXPECT_TRUE(AddCue(9));
  EXPECT_EQ(RangeCount(), 1U);
}

TEST_F(TextRangesTest, TestOneRange) {
  // Create a new active range, with t=0.
  EXPECT_TRUE(AddCue(0));

  // Add cues to end of existing range.
  EXPECT_TRUE(AddCue(1));
  EXPECT_TRUE(AddCue(4));

  Reset();
  EXPECT_FALSE(AddCue(2));
  EXPECT_FALSE(AddCue(3));
  EXPECT_FALSE(AddCue(4));
}

TEST_F(TextRangesTest, TestDuplicateLast) {
  // Create a new active range, with t=0.
  EXPECT_TRUE(AddCue(0));
  EXPECT_TRUE(AddCue(1));

  Reset();
  EXPECT_FALSE(AddCue(1));
  EXPECT_TRUE(AddCue(1));
}

TEST_F(TextRangesTest, TestTwoRanges) {
  // Create a new active range, with t=0.
  EXPECT_TRUE(AddCue(0));

  // Add cue to end of existing range.
  EXPECT_TRUE(AddCue(2));

  Reset();

  // Create a new active range, with t=4.
  EXPECT_TRUE(AddCue(4));

  // Add a new cue to end of last (active) range.
  EXPECT_TRUE(AddCue(5));

  Reset();

  // Make first range active.
  EXPECT_FALSE(AddCue(0));
  EXPECT_FALSE(AddCue(2));

  // Expand first range.
  EXPECT_TRUE(AddCue(3));

  // Coalesce first and second ranges.
  EXPECT_FALSE(AddCue(4));
  EXPECT_EQ(RangeCount(), 1U);
}

TEST_F(TextRangesTest, TestThreeRanges) {
  // Create a new active range, with t=0.
  EXPECT_TRUE(AddCue(0));

  // Add cue to end of existing range.
  EXPECT_TRUE(AddCue(2));

  Reset();

  // Create a new active range, with t=4.
  EXPECT_TRUE(AddCue(4));

  // Add a new cue to end of last (active) range.
  EXPECT_TRUE(AddCue(5));

  Reset();

  // Create a new active range, in between the other two.
  EXPECT_TRUE(AddCue(3));

  // Coalesce middle and last ranges.
  EXPECT_FALSE(AddCue(4));

  Reset();

  // Make first range active.
  EXPECT_FALSE(AddCue(0));
  EXPECT_FALSE(AddCue(2));

  // Coalesce first and last ranges.
  EXPECT_FALSE(AddCue(3));
  EXPECT_EQ(RangeCount(), 1U);
}

}  // namespace media
}  // namespace cobalt
