|
19 | 19 |
|
20 | 20 | namespace flutter_runner_test { |
21 | 21 |
|
| 22 | +namespace { |
| 23 | + |
| 24 | +void ExpectNodeHasRole( |
| 25 | + const fuchsia::accessibility::semantics::Node& node, |
| 26 | + const std::unordered_map<uint32_t, fuchsia::accessibility::semantics::Role> |
| 27 | + roles_by_node_id) { |
| 28 | + ASSERT_TRUE(node.has_node_id()); |
| 29 | + ASSERT_NE(roles_by_node_id.find(node.node_id()), roles_by_node_id.end()); |
| 30 | + EXPECT_TRUE(node.has_role()); |
| 31 | + EXPECT_EQ(node.role(), roles_by_node_id.at(node.node_id())); |
| 32 | +} |
| 33 | + |
| 34 | +} // namespace |
| 35 | + |
22 | 36 | class AccessibilityBridgeTestDelegate |
23 | 37 | : public flutter_runner::AccessibilityBridge::Delegate { |
24 | 38 | public: |
@@ -89,6 +103,67 @@ TEST_F(AccessibilityBridgeTest, EnableDisable) { |
89 | 103 | EXPECT_TRUE(accessibility_delegate_.enabled()); |
90 | 104 | } |
91 | 105 |
|
| 106 | +TEST_F(AccessibilityBridgeTest, UpdatesNodeRoles) { |
| 107 | + flutter::SemanticsNodeUpdates updates; |
| 108 | + |
| 109 | + flutter::SemanticsNode node0; |
| 110 | + node0.id = 0; |
| 111 | + node0.flags |= static_cast<int>(flutter::SemanticsFlags::kIsButton); |
| 112 | + node0.childrenInTraversalOrder = {1, 2, 3, 4}; |
| 113 | + node0.childrenInHitTestOrder = {1, 2, 3, 4}; |
| 114 | + updates.emplace(0, node0); |
| 115 | + |
| 116 | + flutter::SemanticsNode node1; |
| 117 | + node1.id = 1; |
| 118 | + node1.flags |= static_cast<int>(flutter::SemanticsFlags::kIsHeader); |
| 119 | + node1.childrenInTraversalOrder = {}; |
| 120 | + node1.childrenInHitTestOrder = {}; |
| 121 | + updates.emplace(1, node1); |
| 122 | + |
| 123 | + flutter::SemanticsNode node2; |
| 124 | + node2.id = 2; |
| 125 | + node2.flags |= static_cast<int>(flutter::SemanticsFlags::kIsImage); |
| 126 | + node2.childrenInTraversalOrder = {}; |
| 127 | + node2.childrenInHitTestOrder = {}; |
| 128 | + updates.emplace(2, node2); |
| 129 | + |
| 130 | + flutter::SemanticsNode node3; |
| 131 | + node3.id = 3; |
| 132 | + node3.flags |= static_cast<int>(flutter::SemanticsFlags::kIsTextField); |
| 133 | + node3.childrenInTraversalOrder = {}; |
| 134 | + node3.childrenInHitTestOrder = {}; |
| 135 | + updates.emplace(3, node3); |
| 136 | + |
| 137 | + flutter::SemanticsNode node4; |
| 138 | + node4.childrenInTraversalOrder = {}; |
| 139 | + node4.childrenInHitTestOrder = {}; |
| 140 | + node4.id = 4; |
| 141 | + node4.flags |= static_cast<int>(flutter::SemanticsFlags::kIsSlider); |
| 142 | + updates.emplace(4, node4); |
| 143 | + |
| 144 | + accessibility_bridge_->AddSemanticsNodeUpdate(std::move(updates)); |
| 145 | + RunLoopUntilIdle(); |
| 146 | + |
| 147 | + std::unordered_map<uint32_t, fuchsia::accessibility::semantics::Role> |
| 148 | + roles_by_node_id = { |
| 149 | + {0u, fuchsia::accessibility::semantics::Role::BUTTON}, |
| 150 | + {1u, fuchsia::accessibility::semantics::Role::HEADER}, |
| 151 | + {2u, fuchsia::accessibility::semantics::Role::IMAGE}, |
| 152 | + {3u, fuchsia::accessibility::semantics::Role::TEXT_FIELD}, |
| 153 | + {4u, fuchsia::accessibility::semantics::Role::SLIDER}}; |
| 154 | + |
| 155 | + EXPECT_EQ(0, semantics_manager_.DeleteCount()); |
| 156 | + EXPECT_EQ(1, semantics_manager_.UpdateCount()); |
| 157 | + EXPECT_EQ(1, semantics_manager_.CommitCount()); |
| 158 | + EXPECT_EQ(5U, semantics_manager_.LastUpdatedNodes().size()); |
| 159 | + for (const auto& node : semantics_manager_.LastUpdatedNodes()) { |
| 160 | + ExpectNodeHasRole(node, roles_by_node_id); |
| 161 | + } |
| 162 | + |
| 163 | + EXPECT_FALSE(semantics_manager_.DeleteOverflowed()); |
| 164 | + EXPECT_FALSE(semantics_manager_.UpdateOverflowed()); |
| 165 | +} |
| 166 | + |
92 | 167 | TEST_F(AccessibilityBridgeTest, DeletesChildrenTransitively) { |
93 | 168 | // Test that when a node is deleted, so are its transitive children. |
94 | 169 | flutter::SemanticsNode node2; |
|
0 commit comments