Chromium Code Reviews| 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 |