OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "cc/base/rtree.h" | 5 #include "cc/base/rtree.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include "testing/gtest/include/gtest/gtest.h" | 9 #include "testing/gtest/include/gtest/gtest.h" |
10 | 10 |
(...skipping 17 matching lines...) Expand all Loading... |
28 std::vector<gfx::Rect> rects; | 28 std::vector<gfx::Rect> rects; |
29 for (int y = 0; y < 50; ++y) { | 29 for (int y = 0; y < 50; ++y) { |
30 for (int x = 0; x < 50; ++x) { | 30 for (int x = 0; x < 50; ++x) { |
31 rects.push_back(gfx::Rect(x, y, 1, 1)); | 31 rects.push_back(gfx::Rect(x, y, 1, 1)); |
32 } | 32 } |
33 } | 33 } |
34 | 34 |
35 RTree rtree; | 35 RTree rtree; |
36 rtree.Build(rects); | 36 rtree.Build(rects); |
37 | 37 |
38 std::vector<size_t> results; | 38 std::vector<size_t> results = rtree.Search(gfx::Rect(0, 0, 50, 50)); |
39 rtree.Search(gfx::Rect(0, 0, 50, 50), &results); | |
40 ASSERT_EQ(2500u, results.size()); | 39 ASSERT_EQ(2500u, results.size()); |
| 40 // Note that the results have to be sorted. |
41 for (size_t i = 0; i < 2500; ++i) { | 41 for (size_t i = 0; i < 2500; ++i) { |
42 ASSERT_EQ(results[i], i); | 42 ASSERT_EQ(results[i], i); |
43 } | 43 } |
44 | 44 |
45 results.clear(); | 45 results = rtree.Search(gfx::Rect(0, 0, 50, 49)); |
46 rtree.Search(gfx::Rect(0, 0, 50, 49), &results); | |
47 ASSERT_EQ(2450u, results.size()); | 46 ASSERT_EQ(2450u, results.size()); |
48 for (size_t i = 0; i < 2450; ++i) { | 47 for (size_t i = 0; i < 2450; ++i) { |
49 ASSERT_EQ(results[i], i); | 48 ASSERT_EQ(results[i], i); |
50 } | 49 } |
51 | 50 |
52 results.clear(); | 51 results = rtree.Search(gfx::Rect(5, 6, 1, 1)); |
53 rtree.Search(gfx::Rect(5, 6, 1, 1), &results); | |
54 ASSERT_EQ(1u, results.size()); | 52 ASSERT_EQ(1u, results.size()); |
55 EXPECT_EQ(6u * 50 + 5u, results[0]); | 53 EXPECT_EQ(6u * 50 + 5u, results[0]); |
56 } | 54 } |
57 | 55 |
58 TEST(RTreeTest, Overlap) { | 56 TEST(RTreeTest, Overlap) { |
59 std::vector<gfx::Rect> rects; | 57 std::vector<gfx::Rect> rects; |
60 for (int h = 1; h <= 50; ++h) { | 58 for (int h = 1; h <= 50; ++h) { |
61 for (int w = 1; w <= 50; ++w) { | 59 for (int w = 1; w <= 50; ++w) { |
62 rects.push_back(gfx::Rect(0, 0, w, h)); | 60 rects.push_back(gfx::Rect(0, 0, w, h)); |
63 } | 61 } |
64 } | 62 } |
65 | 63 |
66 RTree rtree; | 64 RTree rtree; |
67 rtree.Build(rects); | 65 rtree.Build(rects); |
68 | 66 |
69 std::vector<size_t> results; | 67 std::vector<size_t> results = rtree.Search(gfx::Rect(0, 0, 1, 1)); |
70 rtree.Search(gfx::Rect(0, 0, 1, 1), &results); | |
71 ASSERT_EQ(2500u, results.size()); | 68 ASSERT_EQ(2500u, results.size()); |
| 69 // Both the checks for the elements assume elements are sorted. |
72 for (size_t i = 0; i < 2500; ++i) { | 70 for (size_t i = 0; i < 2500; ++i) { |
73 ASSERT_EQ(results[i], i); | 71 ASSERT_EQ(results[i], i); |
74 } | 72 } |
75 | 73 |
76 results.clear(); | 74 results = rtree.Search(gfx::Rect(0, 49, 1, 1)); |
77 rtree.Search(gfx::Rect(0, 49, 1, 1), &results); | |
78 ASSERT_EQ(50u, results.size()); | 75 ASSERT_EQ(50u, results.size()); |
79 for (size_t i = 0; i < 50; ++i) { | 76 for (size_t i = 0; i < 50; ++i) { |
80 EXPECT_EQ(results[i], 2450u + i); | 77 EXPECT_EQ(results[i], 2450u + i); |
81 } | 78 } |
82 } | 79 } |
83 | 80 |
| 81 static void VerifySorted(const std::vector<size_t>& results) { |
| 82 for (size_t i = 1; i < results.size(); ++i) { |
| 83 ASSERT_LT(results[i - 1], results[i]); |
| 84 } |
| 85 } |
| 86 |
| 87 TEST(RTreeTest, SortedResults) { |
| 88 // This test verifies that all queries return sorted elements. |
| 89 std::vector<gfx::Rect> rects; |
| 90 for (int y = 0; y < 50; ++y) { |
| 91 for (int x = 0; x < 50; ++x) { |
| 92 rects.push_back(gfx::Rect(x, y, 1, 1)); |
| 93 rects.push_back(gfx::Rect(x, y, 2, 2)); |
| 94 rects.push_back(gfx::Rect(x, y, 3, 3)); |
| 95 } |
| 96 } |
| 97 |
| 98 RTree rtree; |
| 99 rtree.Build(rects); |
| 100 |
| 101 for (int y = 0; y < 50; ++y) { |
| 102 for (int x = 0; x < 50; ++x) { |
| 103 VerifySorted(rtree.Search(gfx::Rect(x, y, 1, 1))); |
| 104 VerifySorted(rtree.Search(gfx::Rect(x, y, 50, 1))); |
| 105 VerifySorted(rtree.Search(gfx::Rect(x, y, 1, 50))); |
| 106 } |
| 107 } |
| 108 } |
| 109 |
84 TEST(RTreeTest, GetBoundsEmpty) { | 110 TEST(RTreeTest, GetBoundsEmpty) { |
85 RTree rtree; | 111 RTree rtree; |
86 ASSERT_EQ(gfx::Rect(), rtree.GetBounds()); | 112 ASSERT_EQ(gfx::Rect(), rtree.GetBounds()); |
87 } | 113 } |
88 | 114 |
89 TEST(RTreeTest, GetBoundsNonOverlapping) { | 115 TEST(RTreeTest, GetBoundsNonOverlapping) { |
90 std::vector<gfx::Rect> rects; | 116 std::vector<gfx::Rect> rects; |
91 rects.push_back(gfx::Rect(5, 6, 7, 8)); | 117 rects.push_back(gfx::Rect(5, 6, 7, 8)); |
92 rects.push_back(gfx::Rect(11, 12, 13, 14)); | 118 rects.push_back(gfx::Rect(11, 12, 13, 14)); |
93 | 119 |
94 RTree rtree; | 120 RTree rtree; |
95 rtree.Build(rects); | 121 rtree.Build(rects); |
96 | 122 |
97 ASSERT_EQ(gfx::Rect(5, 6, 19, 20), rtree.GetBounds()); | 123 ASSERT_EQ(gfx::Rect(5, 6, 19, 20), rtree.GetBounds()); |
98 } | 124 } |
99 | 125 |
100 TEST(RTreeTest, GetBoundsOverlapping) { | 126 TEST(RTreeTest, GetBoundsOverlapping) { |
101 std::vector<gfx::Rect> rects; | 127 std::vector<gfx::Rect> rects; |
102 rects.push_back(gfx::Rect(0, 0, 10, 10)); | 128 rects.push_back(gfx::Rect(0, 0, 10, 10)); |
103 rects.push_back(gfx::Rect(5, 5, 5, 5)); | 129 rects.push_back(gfx::Rect(5, 5, 5, 5)); |
104 | 130 |
105 RTree rtree; | 131 RTree rtree; |
106 rtree.Build(rects); | 132 rtree.Build(rects); |
107 | 133 |
108 ASSERT_EQ(gfx::Rect(0, 0, 10, 10), rtree.GetBounds()); | 134 ASSERT_EQ(gfx::Rect(0, 0, 10, 10), rtree.GetBounds()); |
109 } | 135 } |
110 | 136 |
111 } // namespace cc | 137 } // namespace cc |
OLD | NEW |