/*
 * Copyright (C) 2010 Google Inc. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1.  Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 * 2.  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.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS 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 APPLE OR ITS 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.
 */

// Tests for the interval tree class.

#include "platform/PODIntervalTree.h"

#include "platform/testing/TreeTestHelpers.h"
#include "platform/wtf/Vector.h"
#include "platform/wtf/text/WTFString.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace blink {

using TreeTestHelpers::InitRandom;
using TreeTestHelpers::NextRandom;

#ifndef NDEBUG
template <>
struct ValueToString<float> {
  static String ToString(const float& value) { return String::Number(value); }
};

template <>
struct ValueToString<void*> {
  static String ToString(void* const& value) {
    return String::Format("0x%p", value);
  }
};
#endif

TEST(PODIntervalTreeTest, TestInsertion) {
  PODIntervalTree<float> tree;
  tree.Add(PODInterval<float>(2, 4));
  ASSERT_TRUE(tree.CheckInvariants());
}

TEST(PODIntervalTreeTest, TestInsertionAndQuery) {
  PODIntervalTree<float> tree;
  tree.Add(PODInterval<float>(2, 4));
  ASSERT_TRUE(tree.CheckInvariants());
  Vector<PODInterval<float>> result =
      tree.AllOverlaps(PODInterval<float>(1, 3));
  EXPECT_EQ(1U, result.size());
  EXPECT_EQ(2, result[0].Low());
  EXPECT_EQ(4, result[0].High());
}

TEST(PODIntervalTreeTest, TestQueryAgainstZeroSizeInterval) {
  PODIntervalTree<float> tree;
  tree.Add(PODInterval<float>(1, 2.5));
  tree.Add(PODInterval<float>(3.5, 5));
  tree.Add(PODInterval<float>(2, 4));
  ASSERT_TRUE(tree.CheckInvariants());
  Vector<PODInterval<float>> result =
      tree.AllOverlaps(PODInterval<float>(3, 3));
  EXPECT_EQ(1U, result.size());
  EXPECT_EQ(2, result[0].Low());
  EXPECT_EQ(4, result[0].High());
}

#ifndef NDEBUG
template <>
struct ValueToString<int*> {
  static String ToString(int* const& value) {
    return String::Format("0x%p", value);
  }
};
#endif

TEST(PODIntervalTreeTest, TestDuplicateElementInsertion) {
  PODIntervalTree<float, int*> tree;
  int tmp1 = 1;
  int tmp2 = 2;
  typedef PODIntervalTree<float, int*>::IntervalType IntervalType;
  IntervalType interval1(1, 3, &tmp1);
  IntervalType interval2(1, 3, &tmp2);
  tree.Add(interval1);
  tree.Add(interval2);
  ASSERT_TRUE(tree.CheckInvariants());
  EXPECT_TRUE(tree.Contains(interval1));
  EXPECT_TRUE(tree.Contains(interval2));
  EXPECT_TRUE(tree.Remove(interval1));
  EXPECT_TRUE(tree.Contains(interval2));
  EXPECT_FALSE(tree.Contains(interval1));
  EXPECT_TRUE(tree.Remove(interval2));
  EXPECT_EQ(0, tree.size());
}

namespace {

struct UserData1 {
 public:
  UserData1() : a(0), b(1) {}

  float a;
  int b;
};

}  // anonymous namespace

#ifndef NDEBUG
template <>
struct ValueToString<UserData1> {
  static String ToString(const UserData1& value) {
    return String("[UserData1 a=") + String::Number(value.a) +
           " b=" + String::Number(value.b) + "]";
  }
};
#endif

TEST(PODIntervalTreeTest, TestInsertionOfComplexUserData) {
  PODIntervalTree<float, UserData1> tree;
  UserData1 data1;
  data1.a = 5;
  data1.b = 6;
  tree.Add(tree.CreateInterval(2, 4, data1));
  ASSERT_TRUE(tree.CheckInvariants());
}

TEST(PODIntervalTreeTest, TestQueryingOfComplexUserData) {
  PODIntervalTree<float, UserData1> tree;
  UserData1 data1;
  data1.a = 5;
  data1.b = 6;
  tree.Add(tree.CreateInterval(2, 4, data1));
  ASSERT_TRUE(tree.CheckInvariants());
  Vector<PODInterval<float, UserData1>> overlaps =
      tree.AllOverlaps(tree.CreateInterval(3, 5, data1));
  EXPECT_EQ(1U, overlaps.size());
  EXPECT_EQ(5, overlaps[0].Data().a);
  EXPECT_EQ(6, overlaps[0].Data().b);
}

namespace {

class EndpointType1 {
 public:
  explicit EndpointType1(int value) : value_(value) {}

  int Value() const { return value_; }

  bool operator<(const EndpointType1& other) const {
    return value_ < other.value_;
  }
  bool operator==(const EndpointType1& other) const {
    return value_ == other.value_;
  }

 private:
  int value_;
  // These operators should not be called by the interval tree.
  bool operator>(const EndpointType1& other);
  bool operator<=(const EndpointType1& other);
  bool operator>=(const EndpointType1& other);
  bool operator!=(const EndpointType1& other);
};

}  // anonymous namespace

#ifndef NDEBUG
template <>
struct ValueToString<EndpointType1> {
  static String ToString(const EndpointType1& value) {
    return String("[EndpointType1 value=") + String::Number(value.Value()) +
           "]";
  }
};
#endif

TEST(PODIntervalTreeTest, TestTreeDoesNotRequireMostOperators) {
  PODIntervalTree<EndpointType1> tree;
  tree.Add(tree.CreateInterval(EndpointType1(1), EndpointType1(2)));
  ASSERT_TRUE(tree.CheckInvariants());
}

// Uncomment to debug a failure of the insertion and deletion test. Won't work
// in release builds.
// #define DEBUG_INSERTION_AND_DELETION_TEST

#ifndef NDEBUG
template <>
struct ValueToString<int> {
  static String ToString(const int& value) { return String::Number(value); }
};
#endif

namespace {

void InsertionAndDeletionTest(int32_t seed, int tree_size) {
  InitRandom(seed);
  int maximum_value = tree_size;
  // Build the tree
  PODIntervalTree<int> tree;
  Vector<PODInterval<int>> added_elements;
  Vector<PODInterval<int>> removed_elements;
  for (int i = 0; i < tree_size; i++) {
    int left = NextRandom(maximum_value);
    int length = NextRandom(maximum_value);
    PODInterval<int> interval(left, left + length);
    tree.Add(interval);
#ifdef DEBUG_INSERTION_AND_DELETION_TEST
    DLOG(ERROR) << "*** Adding element "
                << ValueToString<PODInterval<int>>::string(interval);
#endif
    added_elements.push_back(interval);
  }
  // Churn the tree's contents.
  // First remove half of the elements in random order.
  for (int i = 0; i < tree_size / 2; i++) {
    int index = NextRandom(added_elements.size());
#ifdef DEBUG_INSERTION_AND_DELETION_TEST
    DLOG(ERROR) << "*** Removing element "
                << ValueToString<PODInterval<int>>::string(
                       addedElements[index]);
#endif
    ASSERT_TRUE(tree.Contains(added_elements[index]))
        << "Test failed for seed " << seed;
    tree.Remove(added_elements[index]);
    removed_elements.push_back(added_elements[index]);
    added_elements.erase(index);
    ASSERT_TRUE(tree.CheckInvariants()) << "Test failed for seed " << seed;
  }
  // Now randomly add or remove elements.
  for (int i = 0; i < 2 * tree_size; i++) {
    bool add = false;
    if (!added_elements.size())
      add = true;
    else if (!removed_elements.size())
      add = false;
    else
      add = (NextRandom(2) == 1);
    if (add) {
      int index = NextRandom(removed_elements.size());
#ifdef DEBUG_INSERTION_AND_DELETION_TEST
      DLOG(ERROR) << "*** Adding element "
                  << ValueToString<PODInterval<int>>::string(
                         removedElements[index]);
#endif
      tree.Add(removed_elements[index]);
      added_elements.push_back(removed_elements[index]);
      removed_elements.erase(index);
    } else {
      int index = NextRandom(added_elements.size());
#ifdef DEBUG_INSERTION_AND_DELETION_TEST
      DLOG(ERROR) << "*** Removing element "
                  << ValueToString<PODInterval<int>>::string(
                         addedElements[index]);
#endif
      ASSERT_TRUE(tree.Contains(added_elements[index]))
          << "Test failed for seed " << seed;
      ASSERT_TRUE(tree.Remove(added_elements[index]))
          << "Test failed for seed " << seed;
      removed_elements.push_back(added_elements[index]);
      added_elements.erase(index);
    }
    ASSERT_TRUE(tree.CheckInvariants()) << "Test failed for seed " << seed;
  }
}

}  // anonymous namespace

TEST(PODIntervalTreeTest, RandomDeletionAndInsertionRegressionTest1) {
  InsertionAndDeletionTest(13972, 100);
}

TEST(PODIntervalTreeTest, RandomDeletionAndInsertionRegressionTest2) {
  InsertionAndDeletionTest(1283382113, 10);
}

TEST(PODIntervalTreeTest, RandomDeletionAndInsertionRegressionTest3) {
  // This is the sequence of insertions and deletions that triggered
  // the failure in RandomDeletionAndInsertionRegressionTest2.
  PODIntervalTree<int> tree;
  tree.Add(tree.CreateInterval(0, 5));
  ASSERT_TRUE(tree.CheckInvariants());
  tree.Add(tree.CreateInterval(4, 5));
  ASSERT_TRUE(tree.CheckInvariants());
  tree.Add(tree.CreateInterval(8, 9));
  ASSERT_TRUE(tree.CheckInvariants());
  tree.Add(tree.CreateInterval(1, 4));
  ASSERT_TRUE(tree.CheckInvariants());
  tree.Add(tree.CreateInterval(3, 5));
  ASSERT_TRUE(tree.CheckInvariants());
  tree.Add(tree.CreateInterval(4, 12));
  ASSERT_TRUE(tree.CheckInvariants());
  tree.Add(tree.CreateInterval(0, 2));
  ASSERT_TRUE(tree.CheckInvariants());
  tree.Add(tree.CreateInterval(0, 2));
  ASSERT_TRUE(tree.CheckInvariants());
  tree.Add(tree.CreateInterval(9, 13));
  ASSERT_TRUE(tree.CheckInvariants());
  tree.Add(tree.CreateInterval(0, 1));
  ASSERT_TRUE(tree.CheckInvariants());
  tree.Remove(tree.CreateInterval(0, 2));
  ASSERT_TRUE(tree.CheckInvariants());
  tree.Remove(tree.CreateInterval(9, 13));
  ASSERT_TRUE(tree.CheckInvariants());
  tree.Remove(tree.CreateInterval(0, 2));
  ASSERT_TRUE(tree.CheckInvariants());
  tree.Remove(tree.CreateInterval(0, 1));
  ASSERT_TRUE(tree.CheckInvariants());
  tree.Remove(tree.CreateInterval(4, 5));
  ASSERT_TRUE(tree.CheckInvariants());
  tree.Remove(tree.CreateInterval(4, 12));
  ASSERT_TRUE(tree.CheckInvariants());
}

TEST(PODIntervalTreeTest, RandomDeletionAndInsertionRegressionTest4) {
  // Even further reduced test case for
  // RandomDeletionAndInsertionRegressionTest3.
  PODIntervalTree<int> tree;
  tree.Add(tree.CreateInterval(0, 5));
  ASSERT_TRUE(tree.CheckInvariants());
  tree.Add(tree.CreateInterval(8, 9));
  ASSERT_TRUE(tree.CheckInvariants());
  tree.Add(tree.CreateInterval(1, 4));
  ASSERT_TRUE(tree.CheckInvariants());
  tree.Add(tree.CreateInterval(3, 5));
  ASSERT_TRUE(tree.CheckInvariants());
  tree.Add(tree.CreateInterval(4, 12));
  ASSERT_TRUE(tree.CheckInvariants());
  tree.Remove(tree.CreateInterval(4, 12));
  ASSERT_TRUE(tree.CheckInvariants());
}

}  // namespace blink
