OLD | NEW |
---|---|
(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 | |
OLD | NEW |