[SCM] WebKit Debian packaging branch, debian/experimental, updated. upstream/1.3.3-9427-gc2be6fc

kbr at google.com kbr at google.com
Wed Dec 22 13:02:14 UTC 2010


The following commit has been merged in the debian/experimental branch:
commit 4503628e3dedd7fb4b6e02fe5e6aa612aea6d449
Author: kbr at google.com <kbr at google.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Mon Sep 6 04:53:44 2010 +0000

    2010-09-05  Kenneth Russell  <kbr at google.com>
    
            Reviewed by Darin Fisher.
    
            Add unit tests for interval tree
            https://bugs.webkit.org/show_bug.cgi?id=45161
    
            * WebKit.gyp:
            * tests/PODIntervalTreeTest.cpp: Added.
            (WebCore::valueToString):
            (WebCore::TEST):
            (WebCore::UserData1::valueToString):
            (WebCore::EndpointType1::valueToString):
    
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@66809 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/WebKit/chromium/ChangeLog b/WebKit/chromium/ChangeLog
index 044f46c..2ba5866 100644
--- a/WebKit/chromium/ChangeLog
+++ b/WebKit/chromium/ChangeLog
@@ -2,6 +2,20 @@
 
         Reviewed by Darin Fisher.
 
+        Add unit tests for interval tree
+        https://bugs.webkit.org/show_bug.cgi?id=45161
+
+        * WebKit.gyp:
+        * tests/PODIntervalTreeTest.cpp: Added.
+        (WebCore::valueToString):
+        (WebCore::TEST):
+        (WebCore::UserData1::valueToString):
+        (WebCore::EndpointType1::valueToString):
+
+2010-09-05  Kenneth Russell  <kbr at google.com>
+
+        Reviewed by Darin Fisher.
+
         Add unit tests for red-black tree and (POD) arena
         https://bugs.webkit.org/show_bug.cgi?id=45060
 
diff --git a/WebKit/chromium/WebKit.gyp b/WebKit/chromium/WebKit.gyp
index 916764d..e4b3dfe 100644
--- a/WebKit/chromium/WebKit.gyp
+++ b/WebKit/chromium/WebKit.gyp
@@ -739,6 +739,7 @@
                         'tests/KeyboardTest.cpp',
                         'tests/KURLTest.cpp',
                         'tests/PODArenaTest.cpp',
+                        'tests/PODIntervalTreeTest.cpp',
                         'tests/PODRedBlackTreeTest.cpp',
                         'tests/RunAllTests.cpp',
                         'tests/TilingDataTest.cpp',
diff --git a/WebKit/chromium/tests/PODIntervalTreeTest.cpp b/WebKit/chromium/tests/PODIntervalTreeTest.cpp
new file mode 100644
index 0000000..3a8a245
--- /dev/null
+++ b/WebKit/chromium/tests/PODIntervalTreeTest.cpp
@@ -0,0 +1,323 @@
+/*
+ * 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 "PODIntervalTree.h"
+
+#include "Logging.h"
+#include "TreeTestHelpers.h"
+#include <gtest/gtest.h>
+#include <wtf/Vector.h>
+#include <wtf/text/WTFString.h>
+
+namespace WebCore {
+
+using TreeTestHelpers::generateSeed;
+using TreeTestHelpers::initRandom;
+using TreeTestHelpers::nextRandom;
+
+inline String valueToString(const float& value)
+{
+    return String::number(value);
+}
+
+inline String valueToString(void* const& value)
+{
+    return String::format("0x%p", value);
+}
+
+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());
+}
+
+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;
+};
+
+inline String valueToString(const UserData1& value)
+{
+    return String("[UserData1 a=") + String::number(value.a) + " b=" + String::number(value.b) + "]";
+}
+
+} // anonymous namespace
+
+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);
+};
+
+inline String valueToString(const EndpointType1& value)
+{
+    return String("[EndpointType1 value=") + String::number(value.value()) + "]";
+}
+
+} // anonymous namespace
+
+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.
+// #define DEBUG_INSERTION_AND_DELETION_TEST
+
+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(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(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(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(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

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list