Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(94)

Side by Side Diff: ui/accessibility/ax_tree_serializer_unittest.cc

Issue 90853002: Make tree serialization more robust and add more unit tests. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright 2013 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.
4
5 #include "base/memory/scoped_ptr.h"
6 #include "base/strings/string_number_conversions.h"
7 #include "testing/gtest/include/gtest/gtest.h"
8 #include "ui/accessibility/ax_node.h"
9 #include "ui/accessibility/ax_serializable_tree.h"
10 #include "ui/accessibility/ax_tree.h"
11 #include "ui/accessibility/ax_tree_serializer.h"
12
13 namespace ui {
14
15 // The framework for these tests is that each test sets up |treedata1_|
aboxhall 2013/12/02 17:18:08 treedata0_ and treedata1_
dmazzoni 2013/12/03 08:35:04 Done.
16 // and |treedata2_| and then calls GetTreeSerializer, which creates a
17 // serializer for a tree that's initially in state |treedata1_|, but then
18 // changes to state |treedata2_|. This allows each test to check the
19 // updates created by AXTreeSerializer or unit-test its private
20 // member functions.
21 class AXTreeSerializerTest : public testing::Test {
22 public:
23 AXTreeSerializerTest() {}
24 virtual ~AXTreeSerializerTest() {}
25
26 protected:
27 void CreateTreeSerializer();
28
29 AXTreeUpdate treedata0_;
30 AXTreeUpdate treedata1_;
31 scoped_ptr<AXSerializableTree> tree0_;
32 scoped_ptr<AXSerializableTree> tree1_;
33 scoped_ptr<AXTreeSource<AXNode> > tree0_source_;
34 scoped_ptr<AXTreeSource<AXNode> > tree1_source_;
35 scoped_ptr<AXTreeSerializer<AXNode> > serializer_;
36
37 private:
38 DISALLOW_COPY_AND_ASSIGN(AXTreeSerializerTest);
39 };
40
41 void AXTreeSerializerTest::CreateTreeSerializer() {
42 if (serializer_)
43 return;
44
45 tree0_.reset(new AXSerializableTree(treedata0_));
46 tree1_.reset(new AXSerializableTree(treedata1_));
47
48 // Serialize tree0.
aboxhall 2013/12/02 17:18:08 This comment might need a bit more information - i
dmazzoni 2013/12/03 08:35:04 Yes, I tried to clarify that.
49 tree0_source_.reset(tree0_->CreateTreeSource());
50 serializer_.reset(new AXTreeSerializer<AXNode>(tree0_source_.get()));
51 AXTreeUpdate update0;
52 serializer_->SerializeChanges(tree0_->GetRoot(), &update0);
53
54 // Pretend that tree0_ turned into tree1_.
55 tree1_source_.reset(tree1_->CreateTreeSource());
56 serializer_->ChangeTreeSourceForTesting(tree1_source_.get());
57 }
58
59 // In this test, one child is added to the root. Only the root and
60 // new child should be added.
61 TEST_F(AXTreeSerializerTest, UpdateContainsOnlyChangedNodes) {
62 // (1 (2 3))
63 treedata0_.nodes.resize(3);
64 treedata0_.nodes[0].id = 1;
65 treedata0_.nodes[0].role = AX_ROLE_ROOT_WEB_AREA;
66 treedata0_.nodes[0].child_ids.push_back(2);
67 treedata0_.nodes[0].child_ids.push_back(3);
68 treedata0_.nodes[1].id = 2;
69 treedata0_.nodes[2].id = 3;
70
71 // (1 (4 2 3))
72 treedata1_.nodes.resize(4);
73 treedata1_.nodes[0].id = 1;
74 treedata1_.nodes[0].role = AX_ROLE_ROOT_WEB_AREA;
75 treedata1_.nodes[0].child_ids.push_back(4);
76 treedata1_.nodes[0].child_ids.push_back(2);
77 treedata1_.nodes[0].child_ids.push_back(3);
78 treedata1_.nodes[1].id = 2;
79 treedata1_.nodes[2].id = 3;
80 treedata1_.nodes[3].id = 4;
81
82 CreateTreeSerializer();
83 AXTreeUpdate update;
84 serializer_->SerializeChanges(tree1_->GetFromId(1), &update);
85
86 // The update should only touch nodes 1 and 4 - nodes 2 and 3 are unchanged
87 // and shouldn't be affected.
88 EXPECT_EQ(0, update.node_id_to_clear);
89 ASSERT_EQ(static_cast<size_t>(2), update.nodes.size());
90 EXPECT_EQ(1, update.nodes[0].id);
91 EXPECT_EQ(4, update.nodes[1].id);
92 }
93
94 // When the root changes, the whole tree is updated, even if some of it
95 // is unaffected.
96 TEST_F(AXTreeSerializerTest, NewRootUpdatesEntireTree) {
97 // (1 (2 (3 (4))))
98 treedata0_.nodes.resize(4);
99 treedata0_.nodes[0].id = 1;
100 treedata0_.nodes[0].role = AX_ROLE_ROOT_WEB_AREA;
101 treedata0_.nodes[0].child_ids.push_back(2);
102 treedata0_.nodes[1].id = 2;
103 treedata0_.nodes[1].child_ids.push_back(3);
104 treedata0_.nodes[2].id = 3;
105 treedata0_.nodes[2].child_ids.push_back(4);
106 treedata0_.nodes[3].id = 4;
107
108 // (5 (2 (3 (4))))
109 treedata1_.nodes.resize(4);
110 treedata1_.nodes[0].id = 5;
111 treedata1_.nodes[0].role = AX_ROLE_ROOT_WEB_AREA;
112 treedata1_.nodes[0].child_ids.push_back(2);
113 treedata1_.nodes[1].id = 2;
114 treedata1_.nodes[1].child_ids.push_back(3);
115 treedata1_.nodes[2].id = 3;
116 treedata1_.nodes[2].child_ids.push_back(4);
117 treedata1_.nodes[3].id = 4;
118
119 CreateTreeSerializer();
120 AXTreeUpdate update;
121 serializer_->SerializeChanges(tree1_->GetFromId(4), &update);
122
123 // The update should delete the subtree rooted at node id=1, and
124 // then include all four nodes in the update, even though the
125 // subtree rooted at id=2 didn't actually change.
126 EXPECT_EQ(1, update.node_id_to_clear);
127 ASSERT_EQ(static_cast<size_t>(4), update.nodes.size());
128 EXPECT_EQ(5, update.nodes[0].id);
129 EXPECT_EQ(2, update.nodes[1].id);
130 EXPECT_EQ(3, update.nodes[2].id);
131 EXPECT_EQ(4, update.nodes[3].id);
132 }
133
134 // When a node is reparented, the subtree including both the old parent
135 // and new parent of the reparented node must be deleted and recreated.
136 TEST_F(AXTreeSerializerTest, ReparentingUpdatesSubtree) {
137 // (1 (2 (3 (4) 5)))
138 treedata0_.nodes.resize(5);
139 treedata0_.nodes[0].id = 1;
140 treedata0_.nodes[0].role = AX_ROLE_ROOT_WEB_AREA;
141 treedata0_.nodes[0].child_ids.push_back(2);
142 treedata0_.nodes[1].id = 2;
143 treedata0_.nodes[1].child_ids.push_back(3);
144 treedata0_.nodes[1].child_ids.push_back(5);
145 treedata0_.nodes[2].id = 3;
146 treedata0_.nodes[2].child_ids.push_back(4);
147 treedata0_.nodes[3].id = 4;
148 treedata0_.nodes[4].id = 5;
149
150 // (1 (2 (3 (4 (5)))))
aboxhall 2013/12/02 17:18:08 Perhaps explicitly comment which node has been rep
dmazzoni 2013/12/03 08:35:04 Done.
151 treedata1_.nodes.resize(5);
152 treedata1_.nodes[0].id = 1;
153 treedata1_.nodes[0].role = AX_ROLE_ROOT_WEB_AREA;
154 treedata1_.nodes[0].child_ids.push_back(2);
155 treedata1_.nodes[1].id = 2;
156 treedata1_.nodes[1].child_ids.push_back(3);
157 treedata1_.nodes[2].id = 3;
158 treedata1_.nodes[2].child_ids.push_back(4);
159 treedata1_.nodes[3].id = 4;
160 treedata1_.nodes[3].child_ids.push_back(5);
161 treedata1_.nodes[4].id = 5;
162
163 CreateTreeSerializer();
164 AXTreeUpdate update;
165 serializer_->SerializeChanges(tree1_->GetFromId(4), &update);
166
167 // The update should delete the subtree rooted at node id=2, and
168 // then include nodes 2...5.
169 EXPECT_EQ(2, update.node_id_to_clear);
170 ASSERT_EQ(static_cast<size_t>(4), update.nodes.size());
171 EXPECT_EQ(2, update.nodes[0].id);
172 EXPECT_EQ(3, update.nodes[1].id);
173 EXPECT_EQ(4, update.nodes[2].id);
174 EXPECT_EQ(5, update.nodes[3].id);
175 }
176
177 } // namespace ui
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698