1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "mojo/services/public/cpp/view_manager/view_tree_node.h"
7 #include "base/logging.h"
8 #include "mojo/services/public/cpp/view_manager/lib/view_tree_node_private.h"
9 #include "mojo/services/public/cpp/view_manager/view_tree_node_observer.h"
10 #include "testing/gtest/include/gtest/gtest.h"
14 namespace view_manager {
16 // ViewTreeNode ----------------------------------------------------------------
18 typedef testing::Test ViewTreeNodeTest;
20 // Subclass with public ctor/dtor.
21 class TestViewTreeNode : public ViewTreeNode {
24 ~TestViewTreeNode() {}
27 DISALLOW_COPY_AND_ASSIGN(TestViewTreeNode);
30 TEST_F(ViewTreeNodeTest, AddChild) {
34 EXPECT_EQ(1U, v1.children().size());
37 TEST_F(ViewTreeNodeTest, RemoveChild) {
41 EXPECT_EQ(1U, v1.children().size());
43 EXPECT_EQ(0U, v1.children().size());
46 TEST_F(ViewTreeNodeTest, Reparent) {
51 EXPECT_EQ(1U, v1.children().size());
53 EXPECT_EQ(1U, v2.children().size());
54 EXPECT_EQ(0U, v1.children().size());
57 TEST_F(ViewTreeNodeTest, Contains) {
63 EXPECT_TRUE(v1.Contains(&v11));
65 // Indirect descendant.
66 TestViewTreeNode v111;
68 EXPECT_TRUE(v1.Contains(&v111));
71 TEST_F(ViewTreeNodeTest, GetChildById) {
73 ViewTreeNodePrivate(&v1).set_id(1);
75 ViewTreeNodePrivate(&v11).set_id(11);
77 TestViewTreeNode v111;
78 ViewTreeNodePrivate(&v111).set_id(111);
81 // Find direct & indirect descendents.
82 EXPECT_EQ(&v11, v1.GetChildById(v11.id()));
83 EXPECT_EQ(&v111, v1.GetChildById(v111.id()));
86 // ViewTreeNodeObserver --------------------------------------------------------
88 typedef testing::Test ViewTreeNodeObserverTest;
90 bool TreeChangeParamsMatch(const ViewTreeNodeObserver::TreeChangeParams& lhs,
91 const ViewTreeNodeObserver::TreeChangeParams& rhs) {
92 return lhs.target == rhs.target && lhs.old_parent == rhs.old_parent &&
93 lhs.new_parent == rhs.new_parent && lhs.receiver == rhs.receiver &&
94 lhs.phase == rhs.phase;
97 class TreeChangeObserver : public ViewTreeNodeObserver {
99 explicit TreeChangeObserver(ViewTreeNode* observee) : observee_(observee) {
100 observee_->AddObserver(this);
102 virtual ~TreeChangeObserver() {
103 observee_->RemoveObserver(this);
107 received_params_.clear();
110 const std::vector<TreeChangeParams>& received_params() {
111 return received_params_;
115 // Overridden from ViewTreeNodeObserver:
116 virtual void OnTreeChange(const TreeChangeParams& params) OVERRIDE {
117 received_params_.push_back(params);
120 ViewTreeNode* observee_;
121 std::vector<TreeChangeParams> received_params_;
123 DISALLOW_COPY_AND_ASSIGN(TreeChangeObserver);
126 // Adds/Removes v11 to v1.
127 TEST_F(ViewTreeNodeObserverTest, TreeChange_SimpleAddRemove) {
129 TreeChangeObserver o1(&v1);
130 EXPECT_TRUE(o1.received_params().empty());
132 TestViewTreeNode v11;
133 TreeChangeObserver o11(&v11);
134 EXPECT_TRUE(o11.received_params().empty());
140 EXPECT_EQ(1U, o1.received_params().size());
141 ViewTreeNodeObserver::TreeChangeParams p1;
144 p1.old_parent = NULL;
146 p1.phase = ViewTreeNodeObserver::DISPOSITION_CHANGED;
147 EXPECT_TRUE(TreeChangeParamsMatch(p1, o1.received_params().back()));
149 EXPECT_EQ(2U, o11.received_params().size());
150 ViewTreeNodeObserver::TreeChangeParams p11 = p1;
152 p11.phase = ViewTreeNodeObserver::DISPOSITION_CHANGING;
153 EXPECT_TRUE(TreeChangeParamsMatch(p11, o11.received_params().front()));
154 p11.phase = ViewTreeNodeObserver::DISPOSITION_CHANGED;
155 EXPECT_TRUE(TreeChangeParamsMatch(p11, o11.received_params().back()));
159 EXPECT_TRUE(o1.received_params().empty());
160 EXPECT_TRUE(o11.received_params().empty());
164 v1.RemoveChild(&v11);
166 EXPECT_EQ(1U, o1.received_params().size());
170 p1.new_parent = NULL;
171 p1.phase = ViewTreeNodeObserver::DISPOSITION_CHANGING;
172 EXPECT_TRUE(TreeChangeParamsMatch(p1, o1.received_params().back()));
174 EXPECT_EQ(2U, o11.received_params().size());
177 EXPECT_TRUE(TreeChangeParamsMatch(p11, o11.received_params().front()));
178 p11.phase = ViewTreeNodeObserver::DISPOSITION_CHANGED;
179 EXPECT_TRUE(TreeChangeParamsMatch(p11, o11.received_params().back()));
182 // Creates these two trees:
188 // Then adds/removes v111 from v11.
189 TEST_F(ViewTreeNodeObserverTest, TreeChange_NestedAddRemove) {
190 TestViewTreeNode v1, v11, v111, v1111, v1112;
195 // Tree to be attached.
196 v111.AddChild(&v1111);
197 v111.AddChild(&v1112);
199 TreeChangeObserver o1(&v1), o11(&v11), o111(&v111), o1111(&v1111),
201 ViewTreeNodeObserver::TreeChangeParams p1, p11, p111, p1111, p1112;
207 EXPECT_EQ(1U, o1.received_params().size());
210 p1.old_parent = NULL;
211 p1.new_parent = &v11;
212 p1.phase = ViewTreeNodeObserver::DISPOSITION_CHANGED;
213 EXPECT_TRUE(TreeChangeParamsMatch(p1, o1.received_params().back()));
215 EXPECT_EQ(1U, o11.received_params().size());
218 EXPECT_TRUE(TreeChangeParamsMatch(p11, o11.received_params().back()));
220 EXPECT_EQ(2U, o111.received_params().size());
222 p111.receiver = &v111;
223 p111.phase = ViewTreeNodeObserver::DISPOSITION_CHANGING;
224 EXPECT_TRUE(TreeChangeParamsMatch(p111, o111.received_params().front()));
225 p111.phase = ViewTreeNodeObserver::DISPOSITION_CHANGED;
226 EXPECT_TRUE(TreeChangeParamsMatch(p111, o111.received_params().back()));
228 EXPECT_EQ(2U, o1111.received_params().size());
230 p1111.receiver = &v1111;
231 p1111.phase = ViewTreeNodeObserver::DISPOSITION_CHANGING;
232 EXPECT_TRUE(TreeChangeParamsMatch(p1111, o1111.received_params().front()));
233 p1111.phase = ViewTreeNodeObserver::DISPOSITION_CHANGED;
234 EXPECT_TRUE(TreeChangeParamsMatch(p1111, o1111.received_params().back()));
236 EXPECT_EQ(2U, o1112.received_params().size());
238 p1112.receiver = &v1112;
239 p1112.phase = ViewTreeNodeObserver::DISPOSITION_CHANGING;
240 EXPECT_TRUE(TreeChangeParamsMatch(p1112, o1112.received_params().front()));
241 p1112.phase = ViewTreeNodeObserver::DISPOSITION_CHANGED;
242 EXPECT_TRUE(TreeChangeParamsMatch(p1112, o1112.received_params().back()));
250 EXPECT_TRUE(o1.received_params().empty());
251 EXPECT_TRUE(o11.received_params().empty());
252 EXPECT_TRUE(o111.received_params().empty());
253 EXPECT_TRUE(o1111.received_params().empty());
254 EXPECT_TRUE(o1112.received_params().empty());
256 v11.RemoveChild(&v111);
258 EXPECT_EQ(1U, o1.received_params().size());
261 p1.old_parent = &v11;
262 p1.new_parent = NULL;
263 p1.phase = ViewTreeNodeObserver::DISPOSITION_CHANGING;
264 EXPECT_TRUE(TreeChangeParamsMatch(p1, o1.received_params().back()));
266 EXPECT_EQ(1U, o11.received_params().size());
269 EXPECT_TRUE(TreeChangeParamsMatch(p11, o11.received_params().back()));
271 EXPECT_EQ(2U, o111.received_params().size());
273 p111.receiver = &v111;
274 p111.phase = ViewTreeNodeObserver::DISPOSITION_CHANGING;
275 EXPECT_TRUE(TreeChangeParamsMatch(p111, o111.received_params().front()));
276 p111.phase = ViewTreeNodeObserver::DISPOSITION_CHANGED;
277 EXPECT_TRUE(TreeChangeParamsMatch(p111, o111.received_params().back()));
279 EXPECT_EQ(2U, o1111.received_params().size());
281 p1111.receiver = &v1111;
282 p1111.phase = ViewTreeNodeObserver::DISPOSITION_CHANGING;
283 EXPECT_TRUE(TreeChangeParamsMatch(p1111, o1111.received_params().front()));
284 p1111.phase = ViewTreeNodeObserver::DISPOSITION_CHANGED;
285 EXPECT_TRUE(TreeChangeParamsMatch(p1111, o1111.received_params().back()));
287 EXPECT_EQ(2U, o1112.received_params().size());
289 p1112.receiver = &v1112;
290 p1112.phase = ViewTreeNodeObserver::DISPOSITION_CHANGING;
291 EXPECT_TRUE(TreeChangeParamsMatch(p1112, o1112.received_params().front()));
292 p1112.phase = ViewTreeNodeObserver::DISPOSITION_CHANGED;
293 EXPECT_TRUE(TreeChangeParamsMatch(p1112, o1112.received_params().back()));
296 TEST_F(ViewTreeNodeObserverTest, TreeChange_Reparent) {
297 TestViewTreeNode v1, v11, v12, v111;
302 TreeChangeObserver o1(&v1), o11(&v11), o12(&v12), o111(&v111);
307 // v1 (root) should see both changing and changed notifications.
308 EXPECT_EQ(2U, o1.received_params().size());
309 ViewTreeNodeObserver::TreeChangeParams p1;
312 p1.old_parent = &v11;
313 p1.new_parent = &v12;
314 p1.phase = ViewTreeNodeObserver::DISPOSITION_CHANGING;
315 EXPECT_TRUE(TreeChangeParamsMatch(p1, o1.received_params().front()));
316 p1.phase = ViewTreeNodeObserver::DISPOSITION_CHANGED;
317 EXPECT_TRUE(TreeChangeParamsMatch(p1, o1.received_params().back()));
319 // v11 should see changing notifications.
320 EXPECT_EQ(1U, o11.received_params().size());
321 ViewTreeNodeObserver::TreeChangeParams p11;
324 p11.phase = ViewTreeNodeObserver::DISPOSITION_CHANGING;
325 EXPECT_TRUE(TreeChangeParamsMatch(p11, o11.received_params().back()));
327 // v12 should see changed notifications.
328 EXPECT_EQ(1U, o12.received_params().size());
329 ViewTreeNodeObserver::TreeChangeParams p12;
332 p12.phase = ViewTreeNodeObserver::DISPOSITION_CHANGED;
333 EXPECT_TRUE(TreeChangeParamsMatch(p12, o12.received_params().back()));
335 // v111 should see both changing and changed notifications.
336 EXPECT_EQ(2U, o111.received_params().size());
337 ViewTreeNodeObserver::TreeChangeParams p111;
339 p111.receiver = &v111;
340 p111.phase = ViewTreeNodeObserver::DISPOSITION_CHANGING;
341 EXPECT_TRUE(TreeChangeParamsMatch(p111, o111.received_params().front()));
342 p111.phase = ViewTreeNodeObserver::DISPOSITION_CHANGED;
343 EXPECT_TRUE(TreeChangeParamsMatch(p111, o111.received_params().back()));
346 } // namespace view_manager
347 } // namespace services