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

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

Issue 2271893002: Creates AXPosition to uniquely identify a position in the accessibility tree (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Added a number of unit tests. Created 4 years, 2 months 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
OLDNEW
(Empty)
1 // Copyright 2016 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 <stdint.h>
6
7 #include <memory>
8 #include <vector>
9
10 #include "testing/gtest/include/gtest/gtest.h"
11 #include "ui/accessibility/ax_enums.h"
12 #include "ui/accessibility/ax_node.h"
13 #include "ui/accessibility/ax_node_data.h"
14 #include "ui/accessibility/ax_node_position.h"
15 #include "ui/accessibility/ax_serializable_tree.h"
16 #include "ui/accessibility/ax_tree_serializer.h"
17 #include "ui/accessibility/ax_tree_update.h"
18
19 namespace ui {
20
21 namespace {
22
23 class AXTreeTest : public testing::Test {
24 public:
25 const char* TEXT_VALUE = "Line 1\nLine 2";
26
27 AXTreeTest();
28 ~AXTreeTest() override;
29
30 protected:
31 void SetUp() override;
32 void TearDown() override;
33
34 AXNodeData root_;
35 AXNodeData button_;
36 AXNodeData check_box_;
37 AXNodeData text_field_;
38 AXNodeData static_text1_;
39 AXNodeData line_break_;
40 AXNodeData static_text2_;
41 AXNodeData inline_box1_;
42 AXNodeData inline_box2_;
43
44 AXTree tree_;
45 DISALLOW_COPY_AND_ASSIGN(AXTreeTest);
46 };
47
48 AXTreeTest::AXTreeTest() {}
49
50 AXTreeTest::~AXTreeTest() {}
51
52 void AXTreeTest::SetUp() {
53 std::vector<int32_t> line_start_offsets{0, 6};
54 std::vector<int32_t> word_starts{0, 5};
55 std::vector<int32_t> word_ends{3, 6};
56
57 root_.id = 1;
58 root_.role = AX_ROLE_DIALOG;
59 root_.state = 1 << AX_STATE_FOCUSABLE;
60 root_.location = gfx::RectF(0, 0, 800, 600);
61
62 button_.id = 2;
63 button_.role = AX_ROLE_BUTTON;
64 button_.state = 1 << AX_STATE_HASPOPUP;
65 button_.SetName("Sample button_");
66 button_.location = gfx::RectF(20, 20, 200, 30);
67 root_.child_ids.push_back(button_.id);
68
69 check_box_.id = 3;
70 check_box_.role = AX_ROLE_CHECK_BOX;
71 check_box_.state = 1 << AX_STATE_CHECKED;
72 check_box_.SetName("Sample check box");
73 check_box_.location = gfx::RectF(20, 50, 200, 30);
74 root_.child_ids.push_back(check_box_.id);
75
76 text_field_.id = 4;
77 text_field_.role = AX_ROLE_TEXT_FIELD;
78 text_field_.state = 1 << AX_STATE_EDITABLE;
79 text_field_.SetValue(TEXT_VALUE);
80 text_field_.AddIntListAttribute(AX_ATTR_CACHED_LINE_STARTS,
81 line_start_offsets);
82 text_field_.child_ids.push_back(static_text1_.id);
83 text_field_.child_ids.push_back(line_break_.id);
84 text_field_.child_ids.push_back(static_text2_.id);
85 root_.child_ids.push_back(text_field_.id);
86
87 static_text1_.id = 5;
88 static_text1_.role = AX_ROLE_STATIC_TEXT;
89 static_text1_.state = 1 << AX_STATE_EDITABLE;
90 static_text1_.SetName("Line 1");
91 static_text1_.child_ids.push_back(inline_box1_.id);
92
93 inline_box1_.id = 6;
94 inline_box1_.role = AX_ROLE_INLINE_TEXT_BOX;
95 inline_box1_.state = 1 << AX_STATE_EDITABLE;
96 inline_box1_.SetName("Line 1");
97 inline_box1_.AddIntListAttribute(AX_ATTR_WORD_STARTS, word_starts);
98 inline_box1_.AddIntListAttribute(AX_ATTR_WORD_ENDS, word_ends);
99
100 line_break_.id = 7;
101 line_break_.role = AX_ROLE_LINE_BREAK;
102 line_break_.state = 1 << AX_STATE_EDITABLE;
103 line_break_.SetName("\n");
104
105 static_text2_.id = 8;
106 static_text2_.role = AX_ROLE_STATIC_TEXT;
107 static_text2_.state = 1 << AX_STATE_EDITABLE;
108 static_text2_.SetName("Line 2");
109 static_text2_.child_ids.push_back(inline_box2_.id);
110
111 inline_box2_.id = 9;
112 inline_box2_.role = AX_ROLE_INLINE_TEXT_BOX;
113 inline_box2_.state = 1 << AX_STATE_EDITABLE;
114 inline_box2_.SetName("Line 2");
115 inline_box2_.AddIntListAttribute(AX_ATTR_WORD_STARTS, word_starts);
116 inline_box2_.AddIntListAttribute(AX_ATTR_WORD_ENDS, word_ends);
117
118 AXTreeUpdate initial_state;
119 initial_state.root_id = 1;
120 initial_state.nodes.push_back(root_);
121 initial_state.nodes.push_back(button_);
122 initial_state.nodes.push_back(check_box_);
123 initial_state.nodes.push_back(text_field_);
124 initial_state.nodes.push_back(static_text1_);
125 initial_state.nodes.push_back(inline_box1_);
126 initial_state.nodes.push_back(line_break_);
127 initial_state.nodes.push_back(static_text2_);
128 initial_state.nodes.push_back(inline_box2_);
129 initial_state.has_tree_data = true;
130 initial_state.tree_data.tree_id = 0;
131 initial_state.tree_data.title = "Dialog title";
132 AXSerializableTree src_tree(initial_state);
133
134 std::unique_ptr<AXTreeSource<const AXNode*, AXNodeData, AXTreeData>>
135 tree_source(src_tree.CreateTreeSource());
136 AXTreeSerializer<const AXNode*, AXNodeData, AXTreeData> serializer(
137 tree_source.get());
138 AXTreeUpdate update;
139 serializer.SerializeChanges(src_tree.root(), &update);
140 ASSERT_TRUE(tree_.Unserialize(update));
141 AXNodePosition::SetTreeForTesting(&tree_);
142 }
143
144 void AXTreeTest::TearDown() {
145 AXNodePosition::SetTreeForTesting(nullptr);
146 }
147
148 } // namespace
149
150 TEST_F(AXTreeTest, AtStartOfAnchorWithNullPosition) {
151 std::unique_ptr<AXPosition<AXNodePosition, AXNode>> null_position(
dmazzoni 2016/10/12 20:45:41 How about a typedef for AXPosition<AXNodePosition,
152 AXNodePosition::CreateNullPosition());
153 ASSERT_NE(nullptr, null_position);
154 EXPECT_FALSE(null_position->AtStartOfAnchor());
155 }
156
157 TEST_F(AXTreeTest, AtStartOfAnchorWithTreePosition) {
158 std::unique_ptr<AXPosition<AXNodePosition, AXNode>> tree_position(
159 AXNodePosition::CreateTreePosition(tree_.data().tree_id, root_.id,
160 0 /* child_index */));
161 ASSERT_NE(nullptr, tree_position);
162 EXPECT_TRUE(tree_position->AtStartOfAnchor());
163
164 tree_position.reset(AXNodePosition::CreateTreePosition(
165 tree_.data().tree_id, root_.id, 1 /* child_index */));
166 ASSERT_NE(nullptr, tree_position);
167 EXPECT_FALSE(tree_position->AtStartOfAnchor());
168 }
169
170 TEST_F(AXTreeTest, AtStartOfAnchorWithTextPosition) {
171 std::unique_ptr<AXPosition<AXNodePosition, AXNode>> text_position(
172 AXNodePosition::CreateTextPosition(tree_.data().tree_id, inline_box1_.id,
173 0 /* text_offset */));
174 ASSERT_NE(nullptr, text_position);
175 EXPECT_TRUE(text_position->AtStartOfAnchor());
176
177 text_position.reset(AXNodePosition::CreateTextPosition(
178 tree_.data().tree_id, inline_box1_.id, 1 /* text_offset */));
179 ASSERT_NE(nullptr, text_position);
180 EXPECT_FALSE(text_position->AtStartOfAnchor());
181 }
182
183 TEST_F(AXTreeTest, AtEndOfAnchorWithNullPosition) {
184 std::unique_ptr<AXPosition<AXNodePosition, AXNode>> null_position(
185 AXNodePosition::CreateNullPosition());
186 ASSERT_NE(nullptr, null_position);
187 EXPECT_FALSE(null_position->AtEndOfAnchor());
188 }
189
190 TEST_F(AXTreeTest, AtEndOfAnchorWithTreePosition) {
191 std::unique_ptr<AXPosition<AXNodePosition, AXNode>> tree_position(
192 AXNodePosition::CreateTreePosition(tree_.data().tree_id, root_.id,
193 2 /* child_index */));
194 ASSERT_NE(nullptr, tree_position);
195 EXPECT_TRUE(tree_position->AtEndOfAnchor());
196
197 tree_position.reset(AXNodePosition::CreateTreePosition(
198 tree_.data().tree_id, root_.id, 1 /* child_index */));
199 ASSERT_NE(nullptr, tree_position);
200 EXPECT_FALSE(tree_position->AtEndOfAnchor());
201 }
202
203 TEST_F(AXTreeTest, AtEndOfAnchorWithTextPosition) {
204 std::unique_ptr<AXPosition<AXNodePosition, AXNode>> text_position(
205 AXNodePosition::CreateTextPosition(tree_.data().tree_id, inline_box1_.id,
206 6 /* text_offset */));
207 ASSERT_NE(nullptr, text_position);
208 EXPECT_TRUE(text_position->AtEndOfAnchor());
209
210 text_position.reset(AXNodePosition::CreateTextPosition(
211 tree_.data().tree_id, inline_box1_.id, 5 /* text_offset */));
212 ASSERT_NE(nullptr, text_position);
213 EXPECT_FALSE(text_position->AtEndOfAnchor());
214 }
215
216 TEST_F(AXTreeTest, CommonAncestor) {
217 std::unique_ptr<const AXPosition<AXNodePosition, AXNode>> button_position(
218 AXNodePosition::CreateTreePosition(tree_.data().tree_id, root_.id,
219 0 /* child_index */));
220 ASSERT_NE(nullptr, button_position);
221 std::unique_ptr<const AXPosition<AXNodePosition, AXNode>> text_field_position(
222 AXNodePosition::CreateTreePosition(tree_.data().tree_id, root_.id,
223 2 /* child_index */));
224 ASSERT_NE(nullptr, text_field_position);
225 std::unique_ptr<const AXPosition<AXNodePosition, AXNode>>
226 static_text1_position(AXNodePosition::CreateTreePosition(
227 tree_.data().tree_id, text_field_.id, 0 /* child_index */));
228 ASSERT_NE(nullptr, static_text1_position);
229 std::unique_ptr<const AXPosition<AXNodePosition, AXNode>>
230 static_text2_position(AXNodePosition::CreateTreePosition(
231 tree_.data().tree_id, text_field_.id, 2 /* child_index */));
232 ASSERT_NE(nullptr, static_text2_position);
233 std::unique_ptr<const AXPosition<AXNodePosition, AXNode>>
234 inline_box1_position(AXNodePosition::CreateTextPosition(
235 tree_.data().tree_id, inline_box1_.id, 0 /* text_offset */));
236 ASSERT_NE(nullptr, inline_box1_position);
237 std::unique_ptr<const AXPosition<AXNodePosition, AXNode>>
238 inline_box2_position(AXNodePosition::CreateTextPosition(
239 tree_.data().tree_id, inline_box2_.id, 0 /* text_offset */));
240 ASSERT_NE(nullptr, inline_box2_position);
241
242 std::unique_ptr<const AXPosition<AXNodePosition, AXNode>> test_position(
243 button_position->CommonAncestor(*text_field_position));
244 EXPECT_NE(nullptr, test_position);
245 EXPECT_EQ(root_.id, test_position->get_anchor_id());
246
247 test_position.reset(
248 static_text2_position->CommonAncestor(*static_text1_position));
249 EXPECT_NE(nullptr, test_position);
250 EXPECT_EQ(text_field_.id, test_position->get_anchor_id());
251
252 test_position.reset(
253 static_text1_position->CommonAncestor(*text_field_position));
254 EXPECT_NE(nullptr, test_position);
255 EXPECT_EQ(text_field_.id, test_position->get_anchor_id());
256
257 test_position.reset(
258 inline_box1_position->CommonAncestor(*inline_box2_position));
259 EXPECT_NE(nullptr, test_position);
260 EXPECT_EQ(text_field_.id, test_position->get_anchor_id());
261 }
262
263 TEST_F(AXTreeTest, GetPositionAtStartOfAnchorWithNullPosition) {
264 std::unique_ptr<AXPosition<AXNodePosition, AXNode>> null_position(
265 AXNodePosition::CreateNullPosition());
266 ASSERT_NE(nullptr, null_position);
267 std::unique_ptr<AXPosition<AXNodePosition, AXNode>> test_position(
268 null_position->GetPositionAtStartOfAnchor());
269 EXPECT_NE(nullptr, test_position);
270 EXPECT_TRUE(test_position->IsNullPosition());
271 }
272
273 TEST_F(AXTreeTest, GetPositionAtStartOfAnchorWithTreePosition) {
274 std::unique_ptr<AXPosition<AXNodePosition, AXNode>> tree_position(
275 AXNodePosition::CreateTreePosition(tree_.data().tree_id, root_.id,
276 0 /* child_index */));
277 ASSERT_NE(nullptr, tree_position);
278 std::unique_ptr<AXPosition<AXNodePosition, AXNode>> test_position(
279 tree_position->GetPositionAtStartOfAnchor());
280 EXPECT_NE(nullptr, test_position);
281 EXPECT_EQ(root_.id, test_position->get_anchor_id());
282 EXPECT_EQ(0, test_position->get_child_index());
283
284 tree_position.reset(AXNodePosition::CreateTreePosition(
285 tree_.data().tree_id, root_.id, 1 /* child_index */));
286 ASSERT_NE(nullptr, tree_position);
287 test_position.reset(tree_position->GetPositionAtStartOfAnchor());
288 EXPECT_NE(nullptr, test_position);
289 EXPECT_EQ(root_.id, test_position->get_anchor_id());
290 EXPECT_EQ(0, test_position->get_child_index());
291 }
292
293 TEST_F(AXTreeTest, GetPositionAtStartOfAnchorWithTextPosition) {
294 std::unique_ptr<AXPosition<AXNodePosition, AXNode>> text_position(
295 AXNodePosition::CreateTextPosition(tree_.data().tree_id, inline_box1_.id,
296 0 /* text_offset */));
297 ASSERT_NE(nullptr, text_position);
298 std::unique_ptr<AXPosition<AXNodePosition, AXNode>> test_position(
299 text_position->GetPositionAtStartOfAnchor());
300 EXPECT_NE(nullptr, test_position);
301 EXPECT_EQ(inline_box1_.id, test_position->get_anchor_id());
302 EXPECT_EQ(0, test_position->get_text_offset());
303
304 text_position.reset(AXNodePosition::CreateTextPosition(
305 tree_.data().tree_id, inline_box1_.id, 1 /* text_offset */));
306 ASSERT_NE(nullptr, text_position);
307 test_position.reset(text_position->GetPositionAtStartOfAnchor());
308 EXPECT_NE(nullptr, test_position);
309 EXPECT_EQ(inline_box1_.id, test_position->get_anchor_id());
310 EXPECT_EQ(0, test_position->get_text_offset());
311 }
312
313 TEST_F(AXTreeTest, GetPositionAtEndOfAnchorWithNullPosition) {
314 std::unique_ptr<AXPosition<AXNodePosition, AXNode>> null_position(
315 AXNodePosition::CreateNullPosition());
316 ASSERT_NE(nullptr, null_position);
317 std::unique_ptr<AXPosition<AXNodePosition, AXNode>> test_position(
318 null_position->GetPositionAtEndOfAnchor());
319 EXPECT_NE(nullptr, test_position);
320 EXPECT_TRUE(test_position->IsNullPosition());
321 }
322
323 TEST_F(AXTreeTest, GetPositionAtEndOfAnchorWithTreePosition) {
324 std::unique_ptr<AXPosition<AXNodePosition, AXNode>> tree_position(
325 AXNodePosition::CreateTreePosition(tree_.data().tree_id, root_.id,
326 2 /* child_index */));
327 ASSERT_NE(nullptr, tree_position);
328 std::unique_ptr<AXPosition<AXNodePosition, AXNode>> test_position(
329 tree_position->GetPositionAtEndOfAnchor());
330 EXPECT_NE(nullptr, test_position);
331 EXPECT_EQ(root_.id, test_position->get_anchor_id());
332 EXPECT_EQ(2, test_position->get_child_index());
333
334 tree_position.reset(AXNodePosition::CreateTreePosition(
335 tree_.data().tree_id, root_.id, 1 /* child_index */));
336 ASSERT_NE(nullptr, tree_position);
337 test_position.reset(tree_position->GetPositionAtEndOfAnchor());
338 EXPECT_NE(nullptr, test_position);
339 EXPECT_EQ(root_.id, test_position->get_anchor_id());
340 EXPECT_EQ(2, test_position->get_child_index());
341 }
342
343 TEST_F(AXTreeTest, GetPositionAtEndOfAnchorWithTextPosition) {
344 std::unique_ptr<AXPosition<AXNodePosition, AXNode>> text_position(
345 AXNodePosition::CreateTextPosition(tree_.data().tree_id, inline_box1_.id,
346 6 /* text_offset */));
347 ASSERT_NE(nullptr, text_position);
348 std::unique_ptr<AXPosition<AXNodePosition, AXNode>> test_position(
349 text_position->GetPositionAtEndOfAnchor());
350 EXPECT_NE(nullptr, test_position);
351 EXPECT_EQ(inline_box1_.id, test_position->get_anchor_id());
352 EXPECT_EQ(6, test_position->get_text_offset());
353
354 text_position.reset(AXNodePosition::CreateTextPosition(
355 tree_.data().tree_id, inline_box1_.id, 5 /* text_offset */));
356 ASSERT_NE(nullptr, text_position);
357 test_position.reset(text_position->GetPositionAtEndOfAnchor());
358 EXPECT_NE(nullptr, test_position);
359 EXPECT_EQ(inline_box1_.id, test_position->get_anchor_id());
360 EXPECT_EQ(6, test_position->get_text_offset());
361 }
362
363 TEST_F(AXTreeTest, GetNextCharacterPositionWithNullPosition) {
364 std::unique_ptr<AXPosition<AXNodePosition, AXNode>> null_position(
365 AXNodePosition::CreateNullPosition());
366 ASSERT_NE(nullptr, null_position);
367 std::unique_ptr<AXPosition<AXNodePosition, AXNode>> test_position(
368 null_position->GetNextCharacterPosition());
369 EXPECT_NE(nullptr, test_position);
370 EXPECT_TRUE(test_position->IsNullPosition());
371 }
372
373 TEST_F(AXTreeTest, GetNextCharacterPositionWithTextPosition) {
374 std::unique_ptr<AXPosition<AXNodePosition, AXNode>> text_position(
375 AXNodePosition::CreateTextPosition(tree_.data().tree_id, inline_box1_.id,
376 4 /* text_offset */));
377 ASSERT_NE(nullptr, text_position);
378 std::unique_ptr<AXPosition<AXNodePosition, AXNode>> test_position(
379 text_position->GetNextCharacterPosition());
380 EXPECT_NE(nullptr, test_position);
381 EXPECT_EQ(inline_box1_.id, test_position->get_anchor_id());
382 EXPECT_EQ(5, test_position->get_text_offset());
383
384 text_position.reset(AXNodePosition::CreateTextPosition(
385 tree_.data().tree_id, inline_box1_.id, 5 /* text_offset */));
386 ASSERT_NE(nullptr, text_position);
387 test_position.reset(text_position->GetNextCharacterPosition());
388 EXPECT_NE(nullptr, test_position);
389 EXPECT_EQ(line_break_.id, test_position->get_anchor_id());
390 EXPECT_EQ(0, test_position->get_text_offset());
391 }
392
393 TEST_F(AXTreeTest, GetPreviousCharacterPositionWithNullPosition) {
394 std::unique_ptr<AXPosition<AXNodePosition, AXNode>> null_position(
395 AXNodePosition::CreateNullPosition());
396 ASSERT_NE(nullptr, null_position);
397 std::unique_ptr<AXPosition<AXNodePosition, AXNode>> test_position(
398 null_position->GetPreviousCharacterPosition());
399 EXPECT_NE(nullptr, test_position);
400 EXPECT_TRUE(test_position->IsNullPosition());
401 }
402
403 TEST_F(AXTreeTest, GetPreviousCharacterPositionWithTextPosition) {
404 std::unique_ptr<AXPosition<AXNodePosition, AXNode>> text_position(
405 AXNodePosition::CreateTextPosition(tree_.data().tree_id, inline_box2_.id,
406 5 /* text_offset */));
407 ASSERT_NE(nullptr, text_position);
408 std::unique_ptr<AXPosition<AXNodePosition, AXNode>> test_position(
409 text_position->GetPreviousCharacterPosition());
410 EXPECT_NE(nullptr, test_position);
411 EXPECT_EQ(inline_box2_.id, test_position->get_anchor_id());
412 EXPECT_EQ(4, test_position->get_text_offset());
413
414 text_position.reset(AXNodePosition::CreateTextPosition(
415 tree_.data().tree_id, inline_box2_.id, 0 /* text_offset */));
416 ASSERT_NE(nullptr, text_position);
417 test_position.reset(text_position->GetPreviousCharacterPosition());
418 EXPECT_NE(nullptr, test_position);
419 EXPECT_EQ(line_break_.id, test_position->get_anchor_id());
420 EXPECT_EQ(0, test_position->get_text_offset());
421 }
422
423 } // namespace ui
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698