@@ -294,4 +294,62 @@ TEST_F(AccessibilityBridgeTest, BatchesLargeMessages) {
294294 EXPECT_FALSE (semantics_manager_.DeleteOverflowed ());
295295 EXPECT_FALSE (semantics_manager_.UpdateOverflowed ());
296296}
297+
298+ TEST_F (AccessibilityBridgeTest, HitTest) {
299+ flutter::SemanticsNode node0;
300+ node0.id = 0 ;
301+ node0.rect .setLTRB (0 , 0 , 100 , 100 );
302+
303+ flutter::SemanticsNode node1;
304+ node1.id = 1 ;
305+ node1.rect .setLTRB (10 , 10 , 20 , 20 );
306+
307+ flutter::SemanticsNode node2;
308+ node2.id = 2 ;
309+ node2.rect .setLTRB (25 , 10 , 45 , 20 );
310+
311+ flutter::SemanticsNode node3;
312+ node3.id = 3 ;
313+ node3.rect .setLTRB (10 , 25 , 20 , 45 );
314+
315+ flutter::SemanticsNode node4;
316+ node4.id = 4 ;
317+ node4.rect .setLTRB (10 , 10 , 20 , 20 );
318+ node4.transform .setTranslate (20 , 20 , 0 );
319+
320+ node0.childrenInTraversalOrder = {1 , 2 , 3 , 4 };
321+ node0.childrenInHitTestOrder = {1 , 2 , 3 , 4 };
322+
323+ accessibility_bridge_->AddSemanticsNodeUpdate ({
324+ {0 , node0},
325+ {1 , node1},
326+ {2 , node2},
327+ {3 , node3},
328+ {4 , node4},
329+ });
330+ RunLoopUntilIdle ();
331+
332+ uint32_t hit_node_id;
333+ auto callback = [&hit_node_id](fuchsia::accessibility::semantics::Hit hit) {
334+ EXPECT_TRUE (hit.has_node_id ());
335+ hit_node_id = hit.node_id ();
336+ }
337+
338+ // Nodes are:
339+ // ----------
340+ // | 1 2 |
341+ // | 3 4 |
342+ // ----------
343+
344+ accessibility_bridge_.HitTest ({1 , 1 }, callback);
345+ EXPECT_EQ (hit_node_id, 0 );
346+ accessibility_bridge_.HitTest ({15 , 15 }, callback);
347+ EXPECT_EQ (hit_node_id, 1 );
348+ accessibility_bridge_.HitTest ({30 , 15 }, callback);
349+ EXPECT_EQ (hit_node_id, 2 );
350+ accessibility_bridge_.HitTest ({15 , 30 }, callback);
351+ EXPECT_EQ (hit_node_id, 3 );
352+ accessibility_bridge_.HitTest ({30 , 30 }, callback);
353+ EXPECT_EQ (hit_node_id, 4 );
354+ }
297355} // namespace flutter_runner_test
0 commit comments