5 #import <OCMock/OCMock.h>
6 #import <XCTest/XCTest.h>
22 fml::WeakPtrFactory<flutter::AccessibilityBridgeIos> factory(
24 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
26 XCTAssertNotNil(
object);
29 - (void)testSetChildren {
30 fml::WeakPtrFactory<flutter::AccessibilityBridgeIos> factory(
32 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
36 XCTAssertEqual(parent, child.
parent);
38 XCTAssertNil(child.
parent);
41 - (void)testAccessibilityHitTestFocusAtLeaf {
42 fml::WeakPtrFactory<flutter::AccessibilityBridgeIos> factory(
44 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
51 object1.
children = @[ object2, object3 ];
54 flutter::SemanticsNode node0;
56 node0.rect = SkRect::MakeXYWH(0, 0, 200, 200);
60 flutter::SemanticsNode node1;
62 node1.rect = SkRect::MakeXYWH(0, 0, 200, 200);
66 flutter::SemanticsNode node2;
68 node2.rect = SkRect::MakeXYWH(0, 0, 100, 100);
72 flutter::SemanticsNode node3;
74 node3.rect = SkRect::MakeXYWH(0, 0, 200, 200);
78 CGPoint point = CGPointMake(10, 10);
82 XCTAssertEqual(hitTestResult, object2);
85 - (void)testAccessibilityHitTestNoFocusableItem {
86 fml::WeakPtrFactory<flutter::AccessibilityBridgeIos> factory(
88 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
95 object1.
children = @[ object2, object3 ];
98 flutter::SemanticsNode node0;
100 node0.rect = SkRect::MakeXYWH(0, 0, 200, 200);
103 flutter::SemanticsNode node1;
105 node1.rect = SkRect::MakeXYWH(0, 0, 200, 200);
108 flutter::SemanticsNode node2;
110 node2.rect = SkRect::MakeXYWH(0, 0, 100, 100);
113 flutter::SemanticsNode node3;
115 node3.rect = SkRect::MakeXYWH(0, 0, 200, 200);
118 CGPoint point = CGPointMake(10, 10);
121 XCTAssertNil(hitTestResult);
124 - (void)testAccessibilityScrollToVisible {
125 fml::WeakPtrFactory<flutter::testing::MockAccessibilityBridge> factory(
127 fml::WeakPtr<flutter::testing::MockAccessibilityBridge> bridge = factory.GetWeakPtr();
130 flutter::SemanticsNode node3;
132 node3.rect = SkRect::MakeXYWH(0, 0, 200, 200);
137 XCTAssertTrue(bridge->observations.size() == 1);
138 XCTAssertTrue(bridge->observations[0].id == 3);
139 XCTAssertTrue(bridge->observations[0].action == flutter::SemanticsAction::kShowOnScreen);
142 - (void)testAccessibilityScrollToVisibleWithChild {
143 fml::WeakPtrFactory<flutter::testing::MockAccessibilityBridge> factory(
145 fml::WeakPtr<flutter::testing::MockAccessibilityBridge> bridge = factory.GetWeakPtr();
148 flutter::SemanticsNode node3;
150 node3.rect = SkRect::MakeXYWH(0, 0, 200, 200);
155 XCTAssertTrue(bridge->observations.size() == 1);
156 XCTAssertTrue(bridge->observations[0].id == 3);
157 XCTAssertTrue(bridge->observations[0].action == flutter::SemanticsAction::kShowOnScreen);
160 - (void)testAccessibilityHitTestOutOfRect {
161 fml::WeakPtrFactory<flutter::AccessibilityBridgeIos> factory(
163 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
170 object1.
children = @[ object2, object3 ];
173 flutter::SemanticsNode node0;
175 node0.rect = SkRect::MakeXYWH(0, 0, 200, 200);
179 flutter::SemanticsNode node1;
181 node1.rect = SkRect::MakeXYWH(0, 0, 200, 200);
185 flutter::SemanticsNode node2;
187 node2.rect = SkRect::MakeXYWH(0, 0, 100, 100);
191 flutter::SemanticsNode node3;
193 node3.rect = SkRect::MakeXYWH(0, 0, 200, 200);
197 CGPoint point = CGPointMake(300, 300);
200 XCTAssertNil(hitTestResult);
203 - (void)testReplaceChildAtIndex {
204 fml::WeakPtrFactory<flutter::AccessibilityBridgeIos> factory(
206 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
212 XCTAssertNil(child1.
parent);
213 XCTAssertEqual(parent, child2.
parent);
214 XCTAssertEqualObjects(parent.
children, @[ child2 ]);
217 - (void)testPlainSemanticsObjectWithLabelHasStaticTextTrait {
218 fml::WeakPtrFactory<flutter::AccessibilityBridgeIos> factory(
220 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
221 flutter::SemanticsNode node;
225 XCTAssertEqual([
object accessibilityTraits], UIAccessibilityTraitStaticText);
228 - (void)testNodeWithImplicitScrollIsAnAccessibilityElementWhenItisHidden {
229 fml::WeakPtrFactory<flutter::AccessibilityBridgeIos> factory(
231 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
232 flutter::SemanticsNode node;
233 node.flags =
static_cast<int32_t
>(flutter::SemanticsFlags::kHasImplicitScrolling) |
234 static_cast<int32_t
>(flutter::SemanticsFlags::kIsHidden);
237 XCTAssertEqual(
object.isAccessibilityElement, YES);
240 - (void)testNodeWithImplicitScrollIsNotAnAccessibilityElementWhenItisNotHidden {
241 fml::WeakPtrFactory<flutter::AccessibilityBridgeIos> factory(
243 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
244 flutter::SemanticsNode node;
245 node.flags =
static_cast<int32_t
>(flutter::SemanticsFlags::kHasImplicitScrolling);
248 XCTAssertEqual(
object.isAccessibilityElement, NO);
251 - (void)testIntresetingSemanticsObjectWithLabelHasStaticTextTrait {
252 fml::WeakPtrFactory<flutter::AccessibilityBridgeIos> factory(
254 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
255 flutter::SemanticsNode node;
261 XCTAssertEqual([
object accessibilityTraits], UIAccessibilityTraitNone);
264 - (void)testIntresetingSemanticsObjectWithLabelHasStaticTextTrait1 {
265 fml::WeakPtrFactory<flutter::AccessibilityBridgeIos> factory(
267 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
268 flutter::SemanticsNode node;
270 node.flags =
static_cast<int32_t
>(flutter::SemanticsFlags::kIsTextField);
273 XCTAssertEqual([
object accessibilityTraits], UIAccessibilityTraitNone);
276 - (void)testIntresetingSemanticsObjectWithLabelHasStaticTextTrait2 {
277 fml::WeakPtrFactory<flutter::AccessibilityBridgeIos> factory(
279 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
280 flutter::SemanticsNode node;
282 node.flags =
static_cast<int32_t
>(flutter::SemanticsFlags::kIsButton);
285 XCTAssertEqual([
object accessibilityTraits], UIAccessibilityTraitButton);
288 - (void)testVerticalFlutterScrollableSemanticsObject {
289 fml::WeakPtrFactory<flutter::AccessibilityBridgeIos> factory(
291 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
293 float transformScale = 0.5f;
294 float screenScale = [[bridge->view() window] screen].scale;
295 float effectivelyScale = transformScale / screenScale;
300 float scrollExtentMax = 500.0;
301 float scrollPosition = 150.0;
303 flutter::SemanticsNode node;
304 node.flags =
static_cast<int32_t
>(flutter::SemanticsFlags::kHasImplicitScrolling);
305 node.actions = flutter::kVerticalScrollSemanticsActions;
306 node.rect = SkRect::MakeXYWH(x, y, w, h);
307 node.scrollExtentMax = scrollExtentMax;
308 node.scrollPosition = scrollPosition;
310 transformScale, 0, 0, 0, 0, transformScale, 0, 0, 0, 0, transformScale, 0, 0, 0, 0, 1.0};
317 CGRectEqualToRect(scrollView.frame, CGRectMake(x * effectivelyScale, y * effectivelyScale,
318 w * effectivelyScale, h * effectivelyScale)));
319 XCTAssertTrue(CGSizeEqualToSize(
320 scrollView.contentSize,
321 CGSizeMake(w * effectivelyScale, (h + scrollExtentMax) * effectivelyScale)));
322 XCTAssertTrue(CGPointEqualToPoint(scrollView.contentOffset,
323 CGPointMake(0, scrollPosition * effectivelyScale)));
326 - (void)testVerticalFlutterScrollableSemanticsObjectNoWindowDoesNotCrash {
327 fml::WeakPtrFactory<flutter::AccessibilityBridgeIos> factory(
329 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
331 float transformScale = 0.5f;
336 float scrollExtentMax = 500.0;
337 float scrollPosition = 150.0;
339 flutter::SemanticsNode node;
340 node.flags =
static_cast<int32_t
>(flutter::SemanticsFlags::kHasImplicitScrolling);
341 node.actions = flutter::kVerticalScrollSemanticsActions;
342 node.rect = SkRect::MakeXYWH(x, y, w, h);
343 node.scrollExtentMax = scrollExtentMax;
344 node.scrollPosition = scrollPosition;
346 transformScale, 0, 0, 0, 0, transformScale, 0, 0, 0, 0, transformScale, 0, 0, 0, 0, 1.0};
351 XCTAssertNoThrow([scrollable accessibilityBridgeDidFinishUpdate]);
354 - (void)testHorizontalFlutterScrollableSemanticsObject {
355 fml::WeakPtrFactory<flutter::AccessibilityBridgeIos> factory(
357 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
359 float transformScale = 0.5f;
360 float screenScale = [[bridge->view() window] screen].scale;
361 float effectivelyScale = transformScale / screenScale;
366 float scrollExtentMax = 500.0;
367 float scrollPosition = 150.0;
369 flutter::SemanticsNode node;
370 node.flags =
static_cast<int32_t
>(flutter::SemanticsFlags::kHasImplicitScrolling);
371 node.actions = flutter::kHorizontalScrollSemanticsActions;
372 node.rect = SkRect::MakeXYWH(x, y, w, h);
373 node.scrollExtentMax = scrollExtentMax;
374 node.scrollPosition = scrollPosition;
376 transformScale, 0, 0, 0, 0, transformScale, 0, 0, 0, 0, transformScale, 0, 0, 0, 0, 1.0};
383 CGRectEqualToRect(scrollView.frame, CGRectMake(x * effectivelyScale, y * effectivelyScale,
384 w * effectivelyScale, h * effectivelyScale)));
385 XCTAssertTrue(CGSizeEqualToSize(
386 scrollView.contentSize,
387 CGSizeMake((w + scrollExtentMax) * effectivelyScale, h * effectivelyScale)));
388 XCTAssertTrue(CGPointEqualToPoint(scrollView.contentOffset,
389 CGPointMake(scrollPosition * effectivelyScale, 0)));
392 - (void)testCanHandleInfiniteScrollExtent {
393 fml::WeakPtrFactory<flutter::AccessibilityBridgeIos> factory(
395 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
397 float transformScale = 0.5f;
398 float screenScale = [[bridge->view() window] screen].scale;
399 float effectivelyScale = transformScale / screenScale;
404 float scrollExtentMax = INFINITY;
405 float scrollPosition = 150.0;
407 flutter::SemanticsNode node;
408 node.flags =
static_cast<int32_t
>(flutter::SemanticsFlags::kHasImplicitScrolling);
409 node.actions = flutter::kVerticalScrollSemanticsActions;
410 node.rect = SkRect::MakeXYWH(x, y, w, h);
411 node.scrollExtentMax = scrollExtentMax;
412 node.scrollPosition = scrollPosition;
414 transformScale, 0, 0, 0, 0, transformScale, 0, 0, 0, 0, transformScale, 0, 0, 0, 0, 1.0};
421 CGRectEqualToRect(scrollView.frame, CGRectMake(x * effectivelyScale, y * effectivelyScale,
422 w * effectivelyScale, h * effectivelyScale)));
423 XCTAssertTrue(CGSizeEqualToSize(
424 scrollView.contentSize,
425 CGSizeMake(w * effectivelyScale,
427 XCTAssertTrue(CGPointEqualToPoint(scrollView.contentOffset,
428 CGPointMake(0, scrollPosition * effectivelyScale)));
431 - (void)testCanHandleNaNScrollExtentAndScrollPoisition {
432 fml::WeakPtrFactory<flutter::AccessibilityBridgeIos> factory(
434 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
436 float transformScale = 0.5f;
437 float screenScale = [[bridge->view() window] screen].scale;
438 float effectivelyScale = transformScale / screenScale;
443 float scrollExtentMax = std::nan(
"");
444 float scrollPosition = std::nan(
"");
446 flutter::SemanticsNode node;
447 node.flags =
static_cast<int32_t
>(flutter::SemanticsFlags::kHasImplicitScrolling);
448 node.actions = flutter::kVerticalScrollSemanticsActions;
449 node.rect = SkRect::MakeXYWH(x, y, w, h);
450 node.scrollExtentMax = scrollExtentMax;
451 node.scrollPosition = scrollPosition;
453 transformScale, 0, 0, 0, 0, transformScale, 0, 0, 0, 0, transformScale, 0, 0, 0, 0, 1.0};
460 CGRectEqualToRect(scrollView.frame, CGRectMake(x * effectivelyScale, y * effectivelyScale,
461 w * effectivelyScale, h * effectivelyScale)));
463 XCTAssertTrue(CGSizeEqualToSize(scrollView.contentSize,
464 CGSizeMake(w * effectivelyScale, h * effectivelyScale)));
465 XCTAssertTrue(CGPointEqualToPoint(scrollView.contentOffset, CGPointMake(0, 0)));
468 - (void)testFlutterScrollableSemanticsObjectIsNotHittestable {
469 fml::WeakPtrFactory<flutter::AccessibilityBridgeIos> factory(
471 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
473 flutter::SemanticsNode node;
474 node.flags =
static_cast<int32_t
>(flutter::SemanticsFlags::kHasImplicitScrolling);
475 node.actions = flutter::kHorizontalScrollSemanticsActions;
476 node.rect = SkRect::MakeXYWH(0, 0, 100, 200);
477 node.scrollExtentMax = 100.0;
478 node.scrollPosition = 0.0;
485 XCTAssertEqual([scrollView hitTest:CGPointMake(10, 10) withEvent:nil], nil);
488 - (void)testFlutterScrollableSemanticsObjectIsHiddenWhenVoiceOverIsRunning {
491 fml::WeakPtrFactory<flutter::AccessibilityBridgeIos> factory(mock);
492 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
494 flutter::SemanticsNode node;
495 node.flags =
static_cast<int32_t
>(flutter::SemanticsFlags::kHasImplicitScrolling);
496 node.actions = flutter::kHorizontalScrollSemanticsActions;
497 node.rect = SkRect::MakeXYWH(0, 0, 100, 200);
498 node.scrollExtentMax = 100.0;
499 node.scrollPosition = 0.0;
506 XCTAssertTrue(scrollView.isAccessibilityElement);
508 XCTAssertFalse(scrollView.isAccessibilityElement);
511 - (void)testFlutterSemanticsObjectHasIdentifier {
514 fml::WeakPtrFactory<flutter::AccessibilityBridgeIos> factory(mock);
515 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
517 flutter::SemanticsNode node;
518 node.identifier =
"identifier";
522 XCTAssertTrue([
object.accessibilityIdentifier isEqualToString:
@"identifier"]);
525 - (void)testFlutterScrollableSemanticsObjectWithLabelValueHintIsNotHiddenWhenVoiceOverIsRunning {
528 fml::WeakPtrFactory<flutter::AccessibilityBridgeIos> factory(mock);
529 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
531 flutter::SemanticsNode node;
532 node.flags =
static_cast<int32_t
>(flutter::SemanticsFlags::kHasImplicitScrolling);
533 node.actions = flutter::kHorizontalScrollSemanticsActions;
534 node.rect = SkRect::MakeXYWH(0, 0, 100, 200);
535 node.label =
"label";
536 node.value =
"value";
538 node.scrollExtentMax = 100.0;
539 node.scrollPosition = 0.0;
546 XCTAssertTrue(scrollView.isAccessibilityElement);
548 [scrollView.accessibilityLabel isEqualToString:NSLocalizedString(
@"label",
@"test")]);
550 [scrollView.accessibilityValue isEqualToString:NSLocalizedString(
@"value",
@"test")]);
551 XCTAssertTrue([scrollView.accessibilityHint isEqualToString:NSLocalizedString(
@"hint",
@"test")]);
554 - (void)testFlutterSemanticsObjectMergeTooltipToLabel {
557 fml::WeakPtrFactory<flutter::AccessibilityBridgeIos> factory(mock);
558 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
560 flutter::SemanticsNode node;
561 node.rect = SkRect::MakeXYWH(0, 0, 100, 200);
562 node.label =
"label";
563 node.tooltip =
"tooltip";
566 XCTAssertTrue(
object.isAccessibilityElement);
567 XCTAssertTrue([
object.accessibilityLabel isEqualToString:
@"label\ntooltip"]);
570 - (void)testFlutterSemanticsObjectAttributedStringsDoNotCrashWhenEmpty {
573 fml::WeakPtrFactory<flutter::AccessibilityBridgeIos> factory(mock);
574 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
576 flutter::SemanticsNode node;
577 node.rect = SkRect::MakeXYWH(0, 0, 100, 200);
580 XCTAssertTrue(
object.accessibilityAttributedLabel == nil);
583 - (void)testFlutterScrollableSemanticsObjectReturnsParentContainerIfNoChildren {
586 fml::WeakPtrFactory<flutter::AccessibilityBridgeIos> factory(mock);
587 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
589 flutter::SemanticsNode parent;
591 parent.rect = SkRect::MakeXYWH(0, 0, 100, 200);
592 parent.label =
"label";
593 parent.value =
"value";
594 parent.hint =
"hint";
596 flutter::SemanticsNode node;
598 node.flags =
static_cast<int32_t
>(flutter::SemanticsFlags::kHasImplicitScrolling);
599 node.actions = flutter::kHorizontalScrollSemanticsActions;
600 node.rect = SkRect::MakeXYWH(0, 0, 100, 200);
601 node.label =
"label";
602 node.value =
"value";
604 node.scrollExtentMax = 100.0;
605 node.scrollPosition = 0.0;
606 parent.childrenInTraversalOrder.push_back(1);
617 parentObject.
children = @[ scrollable ];
620 XCTAssertTrue(scrollView.isAccessibilityElement);
626 - (void)testFlutterScrollableSemanticsObjectHidesScrollBar {
627 fml::WeakPtrFactory<flutter::AccessibilityBridgeIos> factory(
629 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
631 flutter::SemanticsNode node;
632 node.flags =
static_cast<int32_t
>(flutter::SemanticsFlags::kHasImplicitScrolling);
633 node.actions = flutter::kHorizontalScrollSemanticsActions;
634 node.rect = SkRect::MakeXYWH(0, 0, 100, 200);
635 node.scrollExtentMax = 100.0;
636 node.scrollPosition = 0.0;
644 XCTAssertFalse(scrollView.showsHorizontalScrollIndicator);
645 XCTAssertFalse(scrollView.showsVerticalScrollIndicator);
648 - (void)testSemanticsObjectBuildsAttributedString {
649 fml::WeakPtrFactory<flutter::AccessibilityBridgeIos> factory(
651 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
652 flutter::SemanticsNode node;
653 node.label =
"label";
654 std::shared_ptr<flutter::SpellOutStringAttribute> attribute =
655 std::make_shared<flutter::SpellOutStringAttribute>();
656 attribute->start = 1;
658 attribute->type = flutter::StringAttributeType::kSpellOut;
659 node.labelAttributes.push_back(attribute);
660 node.value =
"value";
661 attribute = std::make_shared<flutter::SpellOutStringAttribute>();
662 attribute->start = 2;
664 attribute->type = flutter::StringAttributeType::kSpellOut;
665 node.valueAttributes.push_back(attribute);
667 std::shared_ptr<flutter::LocaleStringAttribute> local_attribute =
668 std::make_shared<flutter::LocaleStringAttribute>();
669 local_attribute->start = 3;
670 local_attribute->end = 4;
671 local_attribute->type = flutter::StringAttributeType::kLocale;
672 local_attribute->locale =
"en-MX";
673 node.hintAttributes.push_back(local_attribute);
676 NSMutableAttributedString* expectedAttributedLabel =
677 [[NSMutableAttributedString alloc] initWithString:NSLocalizedString(@"label", @"test")];
678 NSDictionary* attributeDict = @{
679 UIAccessibilitySpeechAttributeSpellOut : @YES,
681 [expectedAttributedLabel setAttributes:attributeDict range:NSMakeRange(1, 1)];
683 [
object.accessibilityAttributedLabel isEqualToAttributedString:expectedAttributedLabel]);
685 NSMutableAttributedString* expectedAttributedValue =
686 [[NSMutableAttributedString alloc] initWithString:NSLocalizedString(@"value", @"test")];
688 UIAccessibilitySpeechAttributeSpellOut : @YES,
690 [expectedAttributedValue setAttributes:attributeDict range:NSMakeRange(2, 1)];
692 [
object.accessibilityAttributedValue isEqualToAttributedString:expectedAttributedValue]);
694 NSMutableAttributedString* expectedAttributedHint =
695 [[NSMutableAttributedString alloc] initWithString:NSLocalizedString(@"hint", @"test")];
697 UIAccessibilitySpeechAttributeLanguage :
@"en-MX",
699 [expectedAttributedHint setAttributes:attributeDict range:NSMakeRange(3, 1)];
701 [
object.accessibilityAttributedHint isEqualToAttributedString:expectedAttributedHint]);
704 - (void)testShouldTriggerAnnouncement {
705 fml::WeakPtrFactory<flutter::AccessibilityBridgeIos> factory(
707 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
711 XCTAssertFalse([
object nodeShouldTriggerAnnouncement:nil]);
714 flutter::SemanticsNode node;
715 node.flags =
static_cast<int32_t
>(flutter::SemanticsFlags::kIsLiveRegion);
717 XCTAssertTrue([
object nodeShouldTriggerAnnouncement:&node]);
721 XCTAssertFalse([
object nodeShouldTriggerAnnouncement:nil]);
724 XCTAssertFalse([
object nodeShouldTriggerAnnouncement:&node]);
727 flutter::SemanticsNode updatedNode;
728 updatedNode.flags =
static_cast<int32_t
>(flutter::SemanticsFlags::kIsLiveRegion);
729 updatedNode.label =
"bar";
730 XCTAssertTrue([
object nodeShouldTriggerAnnouncement:&updatedNode]);
733 updatedNode.flags = 0;
734 XCTAssertFalse([
object nodeShouldTriggerAnnouncement:&updatedNode]);
737 updatedNode.label =
"foo";
739 XCTAssertTrue([
object nodeShouldTriggerAnnouncement:&node]);
742 - (void)testShouldDispatchShowOnScreenActionForHeader {
743 fml::WeakPtrFactory<flutter::testing::MockAccessibilityBridge> factory(
745 fml::WeakPtr<flutter::testing::MockAccessibilityBridge> bridge = factory.GetWeakPtr();
749 flutter::SemanticsNode node;
750 node.flags =
static_cast<int32_t
>(flutter::SemanticsFlags::kIsHeader);
756 [object accessibilityElementDidBecomeFocused];
758 XCTAssertTrue(bridge->observations.size() == 1);
759 XCTAssertTrue(bridge->observations[0].id == 1);
760 XCTAssertTrue(bridge->observations[0].action == flutter::SemanticsAction::kShowOnScreen);
763 - (void)testShouldDispatchShowOnScreenActionForHidden {
764 fml::WeakPtrFactory<flutter::testing::MockAccessibilityBridge> factory(
766 fml::WeakPtr<flutter::testing::MockAccessibilityBridge> bridge = factory.GetWeakPtr();
770 flutter::SemanticsNode node;
771 node.flags =
static_cast<int32_t
>(flutter::SemanticsFlags::kIsHidden);
777 [object accessibilityElementDidBecomeFocused];
779 XCTAssertTrue(bridge->observations.size() == 1);
780 XCTAssertTrue(bridge->observations[0].id == 1);
781 XCTAssertTrue(bridge->observations[0].action == flutter::SemanticsAction::kShowOnScreen);
784 - (void)testFlutterSwitchSemanticsObjectMatchesUISwitch {
785 fml::WeakPtrFactory<flutter::testing::MockAccessibilityBridge> factory(
787 fml::WeakPtr<flutter::testing::MockAccessibilityBridge> bridge = factory.GetWeakPtr();
792 flutter::SemanticsNode node;
793 node.flags =
static_cast<int32_t
>(flutter::SemanticsFlags::kHasToggledState) |
794 static_cast<int32_t
>(flutter::SemanticsFlags::kIsToggled) |
795 static_cast<int32_t
>(flutter::SemanticsFlags::kIsEnabled);
799 UISwitch* nativeSwitch = [[UISwitch alloc] init];
800 nativeSwitch.on = YES;
802 XCTAssertEqual(
object.accessibilityTraits, nativeSwitch.accessibilityTraits);
803 XCTAssertEqualObjects(
object.accessibilityValue, nativeSwitch.accessibilityValue);
806 flutter::SemanticsNode update;
807 update.flags =
static_cast<int32_t
>(flutter::SemanticsFlags::kHasToggledState) |
808 static_cast<int32_t
>(flutter::SemanticsFlags::kIsEnabled);
809 update.label =
"foo";
812 nativeSwitch.on = NO;
814 XCTAssertEqual(
object.accessibilityTraits, nativeSwitch.accessibilityTraits);
815 XCTAssertEqualObjects(
object.accessibilityValue, nativeSwitch.accessibilityValue);
818 - (void)testFlutterSemanticsObjectOfRadioButton {
819 fml::WeakPtrFactory<flutter::testing::MockAccessibilityBridge> factory(
821 fml::WeakPtr<flutter::testing::MockAccessibilityBridge> bridge = factory.GetWeakPtr();
825 flutter::SemanticsNode node;
826 node.flags =
static_cast<int32_t
>(flutter::SemanticsFlags::kIsInMutuallyExclusiveGroup) |
827 static_cast<int32_t
>(flutter::SemanticsFlags::kHasCheckedState) |
828 static_cast<int32_t
>(flutter::SemanticsFlags::kHasEnabledState) |
829 static_cast<int32_t
>(flutter::SemanticsFlags::kIsEnabled);
832 XCTAssertTrue((
object.accessibilityTraits & UIAccessibilityTraitButton) > 0);
833 XCTAssertNil(
object.accessibilityValue);
836 - (void)testFlutterSwitchSemanticsObjectMatchesUISwitchDisabled {
837 fml::WeakPtrFactory<flutter::testing::MockAccessibilityBridge> factory(
839 fml::WeakPtr<flutter::testing::MockAccessibilityBridge> bridge = factory.GetWeakPtr();
844 flutter::SemanticsNode node;
845 node.flags =
static_cast<int32_t
>(flutter::SemanticsFlags::kHasToggledState) |
846 static_cast<int32_t
>(flutter::SemanticsFlags::kIsToggled);
850 UISwitch* nativeSwitch = [[UISwitch alloc] init];
851 nativeSwitch.on = YES;
852 nativeSwitch.enabled = NO;
854 XCTAssertEqual(
object.accessibilityTraits, nativeSwitch.accessibilityTraits);
855 XCTAssertEqualObjects(
object.accessibilityValue, nativeSwitch.accessibilityValue);
858 - (void)testSemanticsObjectDeallocated {
859 fml::WeakPtrFactory<flutter::AccessibilityBridgeIos> factory(
861 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
869 XCTAssertNil(weakObject);
872 - (void)testFlutterSemanticsObjectReturnsNilContainerWhenBridgeIsNotAlive {
877 flutter::SemanticsNode parent;
879 parent.rect = SkRect::MakeXYWH(0, 0, 100, 200);
880 parent.label =
"label";
881 parent.value =
"value";
882 parent.hint =
"hint";
884 flutter::SemanticsNode node;
886 node.flags =
static_cast<int32_t
>(flutter::SemanticsFlags::kHasImplicitScrolling);
887 node.actions = flutter::kHorizontalScrollSemanticsActions;
888 node.rect = SkRect::MakeXYWH(0, 0, 100, 200);
889 node.label =
"label";
890 node.value =
"value";
892 node.scrollExtentMax = 100.0;
893 node.scrollPosition = 0.0;
894 parent.childrenInTraversalOrder.push_back(1);
896 flutter::SemanticsNode node2;
898 node2.rect = SkRect::MakeXYWH(0, 0, 100, 200);
899 node2.label =
"label";
900 node2.value =
"value";
902 node2.scrollExtentMax = 100.0;
903 node2.scrollPosition = 0.0;
904 parent.childrenInTraversalOrder.push_back(2);
910 fml::WeakPtrFactory<flutter::AccessibilityBridgeIos> factory(mock);
911 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
923 parentObject.
children = @[ scrollable, object2 ];
938 XCTAssertNil(scrollable.accessibilityContainer);
939 XCTAssertNil(object2.accessibilityContainer);
942 - (void)testAccessibilityHitTestSearchCanReturnPlatformView {
943 fml::WeakPtrFactory<flutter::AccessibilityBridgeIos> factory(
945 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
954 platformView:platformView];
958 object1.
children = @[ platformViewSemanticsContainer, object3 ];
961 flutter::SemanticsNode node0;
963 node0.rect = SkRect::MakeXYWH(0, 0, 200, 200);
967 flutter::SemanticsNode node1;
969 node1.rect = SkRect::MakeXYWH(0, 0, 200, 200);
973 flutter::SemanticsNode node2;
975 node2.rect = SkRect::MakeXYWH(0, 0, 100, 100);
979 flutter::SemanticsNode node3;
981 node3.rect = SkRect::MakeXYWH(0, 0, 200, 200);
985 CGPoint point = CGPointMake(10, 10);
988 XCTAssertEqual(hitTestResult, platformView);
991 - (void)testFlutterPlatformViewSemanticsContainer {
992 fml::WeakPtrFactory<flutter::testing::MockAccessibilityBridge> factory(
994 fml::WeakPtr<flutter::testing::MockAccessibilityBridge> bridge = factory.GetWeakPtr();
998 weakPlatformView = platformView;
1002 platformView:platformView];
1004 XCTAssertNotNil(weakPlatformView);
1008 XCTAssertNil(weakPlatformView);