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 std::vector<size_t> results = rtree.Search(gfx::Rect(x, y, 1, 1)); | |
104 VerifySorted(results); | |
vmpstr
2017/05/15 20:46:33
Done here as well.
| |
105 results = rtree.Search(gfx::Rect(x, y, 50, 1)); | |
106 VerifySorted(results); | |
107 results = rtree.Search(gfx::Rect(x, y, 1, 50)); | |
108 VerifySorted(results); | |
109 } | |
110 } | |
111 } | |
112 | |
84 TEST(RTreeTest, GetBoundsEmpty) { | 113 TEST(RTreeTest, GetBoundsEmpty) { |
85 RTree rtree; | 114 RTree rtree; |
86 ASSERT_EQ(gfx::Rect(), rtree.GetBounds()); | 115 ASSERT_EQ(gfx::Rect(), rtree.GetBounds()); |
87 } | 116 } |
88 | 117 |
89 TEST(RTreeTest, GetBoundsNonOverlapping) { | 118 TEST(RTreeTest, GetBoundsNonOverlapping) { |
90 std::vector<gfx::Rect> rects; | 119 std::vector<gfx::Rect> rects; |
91 rects.push_back(gfx::Rect(5, 6, 7, 8)); | 120 rects.push_back(gfx::Rect(5, 6, 7, 8)); |
92 rects.push_back(gfx::Rect(11, 12, 13, 14)); | 121 rects.push_back(gfx::Rect(11, 12, 13, 14)); |
93 | 122 |
94 RTree rtree; | 123 RTree rtree; |
95 rtree.Build(rects); | 124 rtree.Build(rects); |
96 | 125 |
97 ASSERT_EQ(gfx::Rect(5, 6, 19, 20), rtree.GetBounds()); | 126 ASSERT_EQ(gfx::Rect(5, 6, 19, 20), rtree.GetBounds()); |
98 } | 127 } |
99 | 128 |
100 TEST(RTreeTest, GetBoundsOverlapping) { | 129 TEST(RTreeTest, GetBoundsOverlapping) { |
101 std::vector<gfx::Rect> rects; | 130 std::vector<gfx::Rect> rects; |
102 rects.push_back(gfx::Rect(0, 0, 10, 10)); | 131 rects.push_back(gfx::Rect(0, 0, 10, 10)); |
103 rects.push_back(gfx::Rect(5, 5, 5, 5)); | 132 rects.push_back(gfx::Rect(5, 5, 5, 5)); |
104 | 133 |
105 RTree rtree; | 134 RTree rtree; |
106 rtree.Build(rects); | 135 rtree.Build(rects); |
107 | 136 |
108 ASSERT_EQ(gfx::Rect(0, 0, 10, 10), rtree.GetBounds()); | 137 ASSERT_EQ(gfx::Rect(0, 0, 10, 10), rtree.GetBounds()); |
109 } | 138 } |
110 | 139 |
111 } // namespace cc | 140 } // namespace cc |
OLD | NEW |