summaryrefslogtreecommitdiff
path: root/Source/web/tests/PODIntervalTreeTest.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/web/tests/PODIntervalTreeTest.cpp')
-rw-r--r--Source/web/tests/PODIntervalTreeTest.cpp356
1 files changed, 0 insertions, 356 deletions
diff --git a/Source/web/tests/PODIntervalTreeTest.cpp b/Source/web/tests/PODIntervalTreeTest.cpp
deleted file mode 100644
index c241e1cd8..000000000
--- a/Source/web/tests/PODIntervalTreeTest.cpp
+++ /dev/null
@@ -1,356 +0,0 @@
-/*
- * 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 "config.h"
-
-#include "core/platform/PODIntervalTree.h"
-
-#include <gtest/gtest.h>
-#include "TreeTestHelpers.h"
-#include "core/platform/Logging.h"
-#include "wtf/text/WTFString.h"
-#include "wtf/Vector.h"
-
-namespace WebCore {
-
-using TreeTestHelpers::generateSeed;
-using TreeTestHelpers::initRandom;
-using TreeTestHelpers::nextRandom;
-
-#ifndef NDEBUG
-template<>
-struct ValueToString<float> {
- static String string(const float& value) { return String::number(value); }
-};
-
-template<>
-struct ValueToString<void*> {
- static String string(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 string(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 string(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)
- : m_value(value) { }
-
- int value() const { return m_value; }
-
- bool operator<(const EndpointType1& other) const { return m_value < other.m_value; }
- bool operator==(const EndpointType1& other) const { return m_value == other.m_value; }
-
-private:
- int m_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 string(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 string(const int& value) { return String::number(value); }
-};
-#endif
-
-namespace {
-
-void InsertionAndDeletionTest(int32_t seed, int treeSize)
-{
- initRandom(seed);
- int maximumValue = treeSize;
- // Build the tree
- PODIntervalTree<int> tree;
- Vector<PODInterval<int> > addedElements;
- Vector<PODInterval<int> > removedElements;
- for (int i = 0; i < treeSize; i++) {
- int left = nextRandom(maximumValue);
- int length = nextRandom(maximumValue);
- PODInterval<int> interval(left, left + length);
- tree.add(interval);
-#ifdef DEBUG_INSERTION_AND_DELETION_TEST
- LOG_ERROR("*** Adding element %s", ValueToString<PODInterval<int> >::string(interval).ascii().data());
-#endif
- addedElements.append(interval);
- }
- // Churn the tree's contents.
- // First remove half of the elements in random order.
- for (int i = 0; i < treeSize / 2; i++) {
- int index = nextRandom(addedElements.size());
-#ifdef DEBUG_INSERTION_AND_DELETION_TEST
- LOG_ERROR("*** Removing element %s", ValueToString<PODInterval<int> >::string(addedElements[index]).ascii().data());
-#endif
- ASSERT_TRUE(tree.contains(addedElements[index])) << "Test failed for seed " << seed;
- tree.remove(addedElements[index]);
- removedElements.append(addedElements[index]);
- addedElements.remove(index);
- ASSERT_TRUE(tree.checkInvariants()) << "Test failed for seed " << seed;
- }
- // Now randomly add or remove elements.
- for (int i = 0; i < 2 * treeSize; i++) {
- bool add = false;
- if (!addedElements.size())
- add = true;
- else if (!removedElements.size())
- add = false;
- else
- add = (nextRandom(2) == 1);
- if (add) {
- int index = nextRandom(removedElements.size());
-#ifdef DEBUG_INSERTION_AND_DELETION_TEST
- LOG_ERROR("*** Adding element %s", ValueToString<PODInterval<int> >::string(removedElements[index]).ascii().data());
-#endif
- tree.add(removedElements[index]);
- addedElements.append(removedElements[index]);
- removedElements.remove(index);
- } else {
- int index = nextRandom(addedElements.size());
-#ifdef DEBUG_INSERTION_AND_DELETION_TEST
- LOG_ERROR("*** Removing element %s", ValueToString<PODInterval<int> >::string(addedElements[index]).ascii().data());
-#endif
- ASSERT_TRUE(tree.contains(addedElements[index])) << "Test failed for seed " << seed;
- ASSERT_TRUE(tree.remove(addedElements[index])) << "Test failed for seed " << seed;
- removedElements.append(addedElements[index]);
- addedElements.remove(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());
-}
-
-TEST(PODIntervalTreeTest, TestRandomDeletionAndInsertion)
-{
- InsertionAndDeletionTest(generateSeed(), 1000);
-}
-
-} // namespace WebCore