// Copyright 2013 The Flutter 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 "flutter/shell/platform/common/cpp/text_range.h"

#include "gtest/gtest.h"

namespace flutter {

TEST(TextRange, TextRangeFromPositionZero) {
  TextRange range(0);
  EXPECT_EQ(range.base(), size_t(0));
  EXPECT_EQ(range.extent(), size_t(0));
  EXPECT_EQ(range.start(), size_t(0));
  EXPECT_EQ(range.end(), size_t(0));
  EXPECT_EQ(range.length(), size_t(0));
  EXPECT_EQ(range.position(), size_t(0));
  EXPECT_TRUE(range.collapsed());
}

TEST(TextRange, TextRangeFromPositionNonZero) {
  TextRange range(3);
  EXPECT_EQ(range.base(), size_t(3));
  EXPECT_EQ(range.extent(), size_t(3));
  EXPECT_EQ(range.start(), size_t(3));
  EXPECT_EQ(range.end(), size_t(3));
  EXPECT_EQ(range.length(), size_t(0));
  EXPECT_EQ(range.position(), size_t(3));
  EXPECT_TRUE(range.collapsed());
}

TEST(TextRange, TextRangeFromRange) {
  TextRange range(3, 7);
  EXPECT_EQ(range.base(), size_t(3));
  EXPECT_EQ(range.extent(), size_t(7));
  EXPECT_EQ(range.start(), size_t(3));
  EXPECT_EQ(range.end(), size_t(7));
  EXPECT_EQ(range.length(), size_t(4));
  EXPECT_FALSE(range.collapsed());
}

TEST(TextRange, TextRangeFromReversedRange) {
  TextRange range(7, 3);
  EXPECT_EQ(range.base(), size_t(7));
  EXPECT_EQ(range.extent(), size_t(3));
  EXPECT_EQ(range.start(), size_t(3));
  EXPECT_EQ(range.end(), size_t(7));
  EXPECT_EQ(range.length(), size_t(4));
  EXPECT_FALSE(range.collapsed());
}

TEST(TextRange, SetBase) {
  TextRange range(3, 7);
  range.set_base(4);
  EXPECT_EQ(range.base(), size_t(4));
  EXPECT_EQ(range.extent(), size_t(7));
}

TEST(TextRange, SetBaseReversed) {
  TextRange range(7, 3);
  range.set_base(5);
  EXPECT_EQ(range.base(), size_t(5));
  EXPECT_EQ(range.extent(), size_t(3));
}

TEST(TextRange, SetExtent) {
  TextRange range(3, 7);
  range.set_extent(6);
  EXPECT_EQ(range.base(), size_t(3));
  EXPECT_EQ(range.extent(), size_t(6));
}

TEST(TextRange, SetExtentReversed) {
  TextRange range(7, 3);
  range.set_extent(4);
  EXPECT_EQ(range.base(), size_t(7));
  EXPECT_EQ(range.extent(), size_t(4));
}

TEST(TextRange, SetStart) {
  TextRange range(3, 7);
  range.set_start(5);
  EXPECT_EQ(range.base(), size_t(5));
  EXPECT_EQ(range.extent(), size_t(7));
}

TEST(TextRange, SetStartReversed) {
  TextRange range(7, 3);
  range.set_start(5);
  EXPECT_EQ(range.base(), size_t(7));
  EXPECT_EQ(range.extent(), size_t(5));
}

TEST(TextRange, SetEnd) {
  TextRange range(3, 7);
  range.set_end(6);
  EXPECT_EQ(range.base(), size_t(3));
  EXPECT_EQ(range.extent(), size_t(6));
}

TEST(TextRange, SetEndReversed) {
  TextRange range(7, 3);
  range.set_end(5);
  EXPECT_EQ(range.base(), size_t(5));
  EXPECT_EQ(range.extent(), size_t(3));
}

TEST(TextRange, ContainsPreStartPosition) {
  TextRange range(2, 6);
  EXPECT_FALSE(range.Contains(1));
}

TEST(TextRange, ContainsStartPosition) {
  TextRange range(2, 6);
  EXPECT_TRUE(range.Contains(2));
}

TEST(TextRange, ContainsMiddlePosition) {
  TextRange range(2, 6);
  EXPECT_TRUE(range.Contains(3));
  EXPECT_TRUE(range.Contains(4));
}

TEST(TextRange, ContainsEndPosition) {
  TextRange range(2, 6);
  EXPECT_TRUE(range.Contains(6));
}

TEST(TextRange, ContainsPostEndPosition) {
  TextRange range(2, 6);
  EXPECT_FALSE(range.Contains(7));
}

TEST(TextRange, ContainsPreStartPositionReversed) {
  TextRange range(6, 2);
  EXPECT_FALSE(range.Contains(1));
}

TEST(TextRange, ContainsStartPositionReversed) {
  TextRange range(6, 2);
  EXPECT_TRUE(range.Contains(2));
}

TEST(TextRange, ContainsMiddlePositionReversed) {
  TextRange range(6, 2);
  EXPECT_TRUE(range.Contains(3));
  EXPECT_TRUE(range.Contains(4));
}

TEST(TextRange, ContainsEndPositionReversed) {
  TextRange range(6, 2);
  EXPECT_TRUE(range.Contains(6));
}

TEST(TextRange, ContainsPostEndPositionReversed) {
  TextRange range(6, 2);
  EXPECT_FALSE(range.Contains(7));
}

TEST(TextRange, ContainsRangePreStartPosition) {
  TextRange range(2, 6);
  EXPECT_FALSE(range.Contains(TextRange(0, 1)));
}

TEST(TextRange, ContainsRangeSpanningStartPosition) {
  TextRange range(2, 6);
  EXPECT_FALSE(range.Contains(TextRange(1, 3)));
}

TEST(TextRange, ContainsRangeStartPosition) {
  TextRange range(2, 6);
  EXPECT_TRUE(range.Contains(TextRange(2)));
}

TEST(TextRange, ContainsRangeMiddlePosition) {
  TextRange range(2, 6);
  EXPECT_TRUE(range.Contains(TextRange(3, 4)));
  EXPECT_TRUE(range.Contains(TextRange(4, 5)));
}

TEST(TextRange, ContainsRangeEndPosition) {
  TextRange range(2, 6);
  EXPECT_TRUE(range.Contains(TextRange(6)));
}

TEST(TextRange, ContainsRangeSpanningEndPosition) {
  TextRange range(2, 6);
  EXPECT_FALSE(range.Contains(TextRange(5, 7)));
}

TEST(TextRange, ContainsRangePostEndPosition) {
  TextRange range(2, 6);
  EXPECT_FALSE(range.Contains(TextRange(6, 7)));
}

TEST(TextRange, ContainsRangePreStartPositionReversed) {
  TextRange range(6, 2);
  EXPECT_FALSE(range.Contains(TextRange(0, 1)));
}

TEST(TextRange, ContainsRangeSpanningStartPositionReversed) {
  TextRange range(6, 2);
  EXPECT_FALSE(range.Contains(TextRange(1, 3)));
}

TEST(TextRange, ContainsRangeStartPositionReversed) {
  TextRange range(6, 2);
  EXPECT_TRUE(range.Contains(TextRange(2)));
}

TEST(TextRange, ContainsRangeMiddlePositionReversed) {
  TextRange range(6, 2);
  EXPECT_TRUE(range.Contains(TextRange(3, 4)));
  EXPECT_TRUE(range.Contains(TextRange(4, 5)));
}

TEST(TextRange, ContainsRangeSpanningEndPositionReversed) {
  TextRange range(6, 2);
  EXPECT_FALSE(range.Contains(TextRange(5, 7)));
}

TEST(TextRange, ContainsRangeEndPositionReversed) {
  TextRange range(6, 2);
  EXPECT_TRUE(range.Contains(TextRange(5)));
}

TEST(TextRange, ContainsRangePostEndPositionReversed) {
  TextRange range(6, 2);
  EXPECT_FALSE(range.Contains(TextRange(6, 7)));
}

TEST(TextRange, ReversedForwardRange) {
  TextRange range(2, 6);
  EXPECT_FALSE(range.reversed());
}

TEST(TextRange, ReversedCollapsedRange) {
  TextRange range(2, 2);
  EXPECT_FALSE(range.reversed());
}

TEST(TextRange, ReversedReversedRange) {
  TextRange range(6, 2);
  EXPECT_TRUE(range.reversed());
}

}  // namespace flutter
