5 #import <OCMock/OCMock.h>
6 #import <XCTest/XCTest.h>
20 fml::WeakPtrFactory<flutter::AccessibilityBridgeIos> factory(
21 new flutter::MockAccessibilityBridge());
22 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
24 XCTAssertNotNil(
object);
27 - (void)testSetChildren {
28 fml::WeakPtrFactory<flutter::AccessibilityBridgeIos> factory(
29 new flutter::MockAccessibilityBridge());
30 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
34 XCTAssertEqual(parent, child.
parent);
36 XCTAssertNil(child.
parent);
39 - (void)testAccessibilityHitTestFocusAtLeaf {
40 fml::WeakPtrFactory<flutter::AccessibilityBridgeIos> factory(
41 new flutter::MockAccessibilityBridge());
42 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
49 object1.
children = @[ object2, object3 ];
52 flutter::SemanticsNode node0;
54 node0.rect = SkRect::MakeXYWH(0, 0, 200, 200);
58 flutter::SemanticsNode node1;
60 node1.rect = SkRect::MakeXYWH(0, 0, 200, 200);
64 flutter::SemanticsNode node2;
66 node2.rect = SkRect::MakeXYWH(0, 0, 100, 100);
70 flutter::SemanticsNode node3;
72 node3.rect = SkRect::MakeXYWH(0, 0, 200, 200);
76 CGPoint point = CGPointMake(10, 10);
80 XCTAssertEqual(hitTestResult, object2);
83 - (void)testAccessibilityHitTestNoFocusableItem {
84 fml::WeakPtrFactory<flutter::AccessibilityBridgeIos> factory(
85 new flutter::MockAccessibilityBridge());
86 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
93 object1.
children = @[ object2, object3 ];
96 flutter::SemanticsNode node0;
98 node0.rect = SkRect::MakeXYWH(0, 0, 200, 200);
101 flutter::SemanticsNode node1;
103 node1.rect = SkRect::MakeXYWH(0, 0, 200, 200);
106 flutter::SemanticsNode node2;
108 node2.rect = SkRect::MakeXYWH(0, 0, 100, 100);
111 flutter::SemanticsNode node3;
113 node3.rect = SkRect::MakeXYWH(0, 0, 200, 200);
116 CGPoint point = CGPointMake(10, 10);
119 XCTAssertNil(hitTestResult);
122 - (void)testAccessibilityScrollToVisible {
123 fml::WeakPtrFactory<flutter::MockAccessibilityBridge> factory(
124 new flutter::MockAccessibilityBridge());
125 fml::WeakPtr<flutter::MockAccessibilityBridge> bridge = factory.GetWeakPtr();
128 flutter::SemanticsNode node3;
130 node3.rect = SkRect::MakeXYWH(0, 0, 200, 200);
135 XCTAssertTrue(bridge->observations.size() == 1);
136 XCTAssertTrue(bridge->observations[0].id == 3);
137 XCTAssertTrue(bridge->observations[0].action == flutter::SemanticsAction::kShowOnScreen);
140 - (void)testAccessibilityScrollToVisibleWithChild {
141 fml::WeakPtrFactory<flutter::MockAccessibilityBridge> factory(
142 new flutter::MockAccessibilityBridge());
143 fml::WeakPtr<flutter::MockAccessibilityBridge> bridge = factory.GetWeakPtr();
146 flutter::SemanticsNode node3;
148 node3.rect = SkRect::MakeXYWH(0, 0, 200, 200);
153 XCTAssertTrue(bridge->observations.size() == 1);
154 XCTAssertTrue(bridge->observations[0].id == 3);
155 XCTAssertTrue(bridge->observations[0].action == flutter::SemanticsAction::kShowOnScreen);
158 - (void)testAccessibilityHitTestOutOfRect {
159 fml::WeakPtrFactory<flutter::AccessibilityBridgeIos> factory(
160 new flutter::MockAccessibilityBridge());
161 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
168 object1.
children = @[ object2, object3 ];
171 flutter::SemanticsNode node0;
173 node0.rect = SkRect::MakeXYWH(0, 0, 200, 200);
177 flutter::SemanticsNode node1;
179 node1.rect = SkRect::MakeXYWH(0, 0, 200, 200);
183 flutter::SemanticsNode node2;
185 node2.rect = SkRect::MakeXYWH(0, 0, 100, 100);
189 flutter::SemanticsNode node3;
191 node3.rect = SkRect::MakeXYWH(0, 0, 200, 200);
195 CGPoint point = CGPointMake(300, 300);
198 XCTAssertNil(hitTestResult);
201 - (void)testReplaceChildAtIndex {
202 fml::WeakPtrFactory<flutter::AccessibilityBridgeIos> factory(
203 new flutter::MockAccessibilityBridge());
204 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
210 XCTAssertNil(child1.
parent);
211 XCTAssertEqual(parent, child2.
parent);
212 XCTAssertEqualObjects(parent.
children, @[ child2 ]);
215 - (void)testPlainSemanticsObjectWithLabelHasStaticTextTrait {
216 fml::WeakPtrFactory<flutter::AccessibilityBridgeIos> factory(
217 new flutter::MockAccessibilityBridge());
218 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
219 flutter::SemanticsNode node;
223 XCTAssertEqual([
object accessibilityTraits], UIAccessibilityTraitStaticText);
226 - (void)testNodeWithImplicitScrollIsAnAccessibilityElementWhenItisHidden {
227 fml::WeakPtrFactory<flutter::AccessibilityBridgeIos> factory(
228 new flutter::MockAccessibilityBridge());
229 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
230 flutter::SemanticsNode node;
231 node.flags =
static_cast<int32_t
>(flutter::SemanticsFlags::kHasImplicitScrolling) |
232 static_cast<int32_t
>(flutter::SemanticsFlags::kIsHidden);
235 XCTAssertEqual(
object.isAccessibilityElement, YES);
238 - (void)testNodeWithImplicitScrollIsNotAnAccessibilityElementWhenItisNotHidden {
239 fml::WeakPtrFactory<flutter::AccessibilityBridgeIos> factory(
240 new flutter::MockAccessibilityBridge());
241 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
242 flutter::SemanticsNode node;
243 node.flags =
static_cast<int32_t
>(flutter::SemanticsFlags::kHasImplicitScrolling);
246 XCTAssertEqual(
object.isAccessibilityElement, NO);
249 - (void)testIntresetingSemanticsObjectWithLabelHasStaticTextTrait {
250 fml::WeakPtrFactory<flutter::AccessibilityBridgeIos> factory(
251 new flutter::MockAccessibilityBridge());
252 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
253 flutter::SemanticsNode node;
259 XCTAssertEqual([
object accessibilityTraits], UIAccessibilityTraitNone);
262 - (void)testIntresetingSemanticsObjectWithLabelHasStaticTextTrait1 {
263 fml::WeakPtrFactory<flutter::AccessibilityBridgeIos> factory(
264 new flutter::MockAccessibilityBridge());
265 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
266 flutter::SemanticsNode node;
268 node.flags =
static_cast<int32_t
>(flutter::SemanticsFlags::kIsTextField);
271 XCTAssertEqual([
object accessibilityTraits], UIAccessibilityTraitNone);
274 - (void)testIntresetingSemanticsObjectWithLabelHasStaticTextTrait2 {
275 fml::WeakPtrFactory<flutter::AccessibilityBridgeIos> factory(
276 new flutter::MockAccessibilityBridge());
277 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
278 flutter::SemanticsNode node;
280 node.flags =
static_cast<int32_t
>(flutter::SemanticsFlags::kIsButton);
283 XCTAssertEqual([
object accessibilityTraits], UIAccessibilityTraitButton);
286 - (void)testVerticalFlutterScrollableSemanticsObject {
287 fml::WeakPtrFactory<flutter::AccessibilityBridgeIos> factory(
288 new flutter::MockAccessibilityBridge());
289 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
291 float transformScale = 0.5f;
292 float screenScale = [[bridge->view() window] screen].scale;
293 float effectivelyScale = transformScale / screenScale;
298 float scrollExtentMax = 500.0;
299 float scrollPosition = 150.0;
301 flutter::SemanticsNode node;
302 node.flags =
static_cast<int32_t
>(flutter::SemanticsFlags::kHasImplicitScrolling);
303 node.actions = flutter::kVerticalScrollSemanticsActions;
304 node.rect = SkRect::MakeXYWH(x, y, w, h);
305 node.scrollExtentMax = scrollExtentMax;
306 node.scrollPosition = scrollPosition;
308 transformScale, 0, 0, 0, 0, transformScale, 0, 0, 0, 0, transformScale, 0, 0, 0, 0, 1.0};
315 CGRectEqualToRect(scrollView.frame, CGRectMake(x * effectivelyScale, y * effectivelyScale,
316 w * effectivelyScale, h * effectivelyScale)));
317 XCTAssertTrue(CGSizeEqualToSize(
318 scrollView.contentSize,
319 CGSizeMake(w * effectivelyScale, (h + scrollExtentMax) * effectivelyScale)));
320 XCTAssertTrue(CGPointEqualToPoint(scrollView.contentOffset,
321 CGPointMake(0, scrollPosition * effectivelyScale)));
324 - (void)testVerticalFlutterScrollableSemanticsObjectNoWindowDoesNotCrash {
325 fml::WeakPtrFactory<flutter::AccessibilityBridgeIos> factory(
326 new flutter::MockAccessibilityBridgeNoWindow());
327 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
329 float transformScale = 0.5f;
334 float scrollExtentMax = 500.0;
335 float scrollPosition = 150.0;
337 flutter::SemanticsNode node;
338 node.flags =
static_cast<int32_t
>(flutter::SemanticsFlags::kHasImplicitScrolling);
339 node.actions = flutter::kVerticalScrollSemanticsActions;
340 node.rect = SkRect::MakeXYWH(x, y, w, h);
341 node.scrollExtentMax = scrollExtentMax;
342 node.scrollPosition = scrollPosition;
344 transformScale, 0, 0, 0, 0, transformScale, 0, 0, 0, 0, transformScale, 0, 0, 0, 0, 1.0};
349 XCTAssertNoThrow([scrollable accessibilityBridgeDidFinishUpdate]);
352 - (void)testHorizontalFlutterScrollableSemanticsObject {
353 fml::WeakPtrFactory<flutter::AccessibilityBridgeIos> factory(
354 new flutter::MockAccessibilityBridge());
355 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
357 float transformScale = 0.5f;
358 float screenScale = [[bridge->view() window] screen].scale;
359 float effectivelyScale = transformScale / screenScale;
364 float scrollExtentMax = 500.0;
365 float scrollPosition = 150.0;
367 flutter::SemanticsNode node;
368 node.flags =
static_cast<int32_t
>(flutter::SemanticsFlags::kHasImplicitScrolling);
369 node.actions = flutter::kHorizontalScrollSemanticsActions;
370 node.rect = SkRect::MakeXYWH(x, y, w, h);
371 node.scrollExtentMax = scrollExtentMax;
372 node.scrollPosition = scrollPosition;
374 transformScale, 0, 0, 0, 0, transformScale, 0, 0, 0, 0, transformScale, 0, 0, 0, 0, 1.0};
381 CGRectEqualToRect(scrollView.frame, CGRectMake(x * effectivelyScale, y * effectivelyScale,
382 w * effectivelyScale, h * effectivelyScale)));
383 XCTAssertTrue(CGSizeEqualToSize(
384 scrollView.contentSize,
385 CGSizeMake((w + scrollExtentMax) * effectivelyScale, h * effectivelyScale)));
386 XCTAssertTrue(CGPointEqualToPoint(scrollView.contentOffset,
387 CGPointMake(scrollPosition * effectivelyScale, 0)));
390 - (void)testCanHandleInfiniteScrollExtent {
391 fml::WeakPtrFactory<flutter::AccessibilityBridgeIos> factory(
392 new flutter::MockAccessibilityBridge());
393 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
395 float transformScale = 0.5f;
396 float screenScale = [[bridge->view() window] screen].scale;
397 float effectivelyScale = transformScale / screenScale;
402 float scrollExtentMax = INFINITY;
403 float scrollPosition = 150.0;
405 flutter::SemanticsNode node;
406 node.flags =
static_cast<int32_t
>(flutter::SemanticsFlags::kHasImplicitScrolling);
407 node.actions = flutter::kVerticalScrollSemanticsActions;
408 node.rect = SkRect::MakeXYWH(x, y, w, h);
409 node.scrollExtentMax = scrollExtentMax;
410 node.scrollPosition = scrollPosition;
412 transformScale, 0, 0, 0, 0, transformScale, 0, 0, 0, 0, transformScale, 0, 0, 0, 0, 1.0};
419 CGRectEqualToRect(scrollView.frame, CGRectMake(x * effectivelyScale, y * effectivelyScale,
420 w * effectivelyScale, h * effectivelyScale)));
421 XCTAssertTrue(CGSizeEqualToSize(
422 scrollView.contentSize,
423 CGSizeMake(w * effectivelyScale,
425 XCTAssertTrue(CGPointEqualToPoint(scrollView.contentOffset,
426 CGPointMake(0, scrollPosition * effectivelyScale)));
429 - (void)testCanHandleNaNScrollExtentAndScrollPoisition {
430 fml::WeakPtrFactory<flutter::AccessibilityBridgeIos> factory(
431 new flutter::MockAccessibilityBridge());
432 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
434 float transformScale = 0.5f;
435 float screenScale = [[bridge->view() window] screen].scale;
436 float effectivelyScale = transformScale / screenScale;
441 float scrollExtentMax = std::nan(
"");
442 float scrollPosition = std::nan(
"");
444 flutter::SemanticsNode node;
445 node.flags =
static_cast<int32_t
>(flutter::SemanticsFlags::kHasImplicitScrolling);
446 node.actions = flutter::kVerticalScrollSemanticsActions;
447 node.rect = SkRect::MakeXYWH(x, y, w, h);
448 node.scrollExtentMax = scrollExtentMax;
449 node.scrollPosition = scrollPosition;
451 transformScale, 0, 0, 0, 0, transformScale, 0, 0, 0, 0, transformScale, 0, 0, 0, 0, 1.0};
458 CGRectEqualToRect(scrollView.frame, CGRectMake(x * effectivelyScale, y * effectivelyScale,
459 w * effectivelyScale, h * effectivelyScale)));
461 XCTAssertTrue(CGSizeEqualToSize(scrollView.contentSize,
462 CGSizeMake(w * effectivelyScale, h * effectivelyScale)));
463 XCTAssertTrue(CGPointEqualToPoint(scrollView.contentOffset, CGPointMake(0, 0)));
466 - (void)testFlutterScrollableSemanticsObjectIsNotHittestable {
467 fml::WeakPtrFactory<flutter::AccessibilityBridgeIos> factory(
468 new flutter::MockAccessibilityBridge());
469 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
471 flutter::SemanticsNode node;
472 node.flags =
static_cast<int32_t
>(flutter::SemanticsFlags::kHasImplicitScrolling);
473 node.actions = flutter::kHorizontalScrollSemanticsActions;
474 node.rect = SkRect::MakeXYWH(0, 0, 100, 200);
475 node.scrollExtentMax = 100.0;
476 node.scrollPosition = 0.0;
483 XCTAssertEqual([scrollView hitTest:CGPointMake(10, 10) withEvent:nil], nil);
486 - (void)testFlutterScrollableSemanticsObjectIsHiddenWhenVoiceOverIsRunning {
487 flutter::MockAccessibilityBridge* mock =
new flutter::MockAccessibilityBridge();
488 mock->isVoiceOverRunningValue =
false;
489 fml::WeakPtrFactory<flutter::AccessibilityBridgeIos> factory(mock);
490 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
492 flutter::SemanticsNode node;
493 node.flags =
static_cast<int32_t
>(flutter::SemanticsFlags::kHasImplicitScrolling);
494 node.actions = flutter::kHorizontalScrollSemanticsActions;
495 node.rect = SkRect::MakeXYWH(0, 0, 100, 200);
496 node.scrollExtentMax = 100.0;
497 node.scrollPosition = 0.0;
504 XCTAssertTrue(scrollView.isAccessibilityElement);
505 mock->isVoiceOverRunningValue =
true;
506 XCTAssertFalse(scrollView.isAccessibilityElement);
509 - (void)testFlutterScrollableSemanticsObjectWithLabelValueHintIsNotHiddenWhenVoiceOverIsRunning {
510 flutter::MockAccessibilityBridge* mock =
new flutter::MockAccessibilityBridge();
511 mock->isVoiceOverRunningValue =
true;
512 fml::WeakPtrFactory<flutter::AccessibilityBridgeIos> factory(mock);
513 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
515 flutter::SemanticsNode node;
516 node.flags =
static_cast<int32_t
>(flutter::SemanticsFlags::kHasImplicitScrolling);
517 node.actions = flutter::kHorizontalScrollSemanticsActions;
518 node.rect = SkRect::MakeXYWH(0, 0, 100, 200);
519 node.label =
"label";
520 node.value =
"value";
522 node.scrollExtentMax = 100.0;
523 node.scrollPosition = 0.0;
530 XCTAssertTrue(scrollView.isAccessibilityElement);
532 [scrollView.accessibilityLabel isEqualToString:NSLocalizedString(
@"label",
@"test")]);
534 [scrollView.accessibilityValue isEqualToString:NSLocalizedString(
@"value",
@"test")]);
535 XCTAssertTrue([scrollView.accessibilityHint isEqualToString:NSLocalizedString(
@"hint",
@"test")]);
538 - (void)testFlutterSemanticsObjectMergeTooltipToLabel {
539 flutter::MockAccessibilityBridge* mock =
new flutter::MockAccessibilityBridge();
540 mock->isVoiceOverRunningValue =
true;
541 fml::WeakPtrFactory<flutter::AccessibilityBridgeIos> factory(mock);
542 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
544 flutter::SemanticsNode node;
545 node.rect = SkRect::MakeXYWH(0, 0, 100, 200);
546 node.label =
"label";
547 node.tooltip =
"tooltip";
550 XCTAssertTrue(
object.isAccessibilityElement);
551 XCTAssertTrue([
object.accessibilityLabel isEqualToString:
@"label\ntooltip"]);
554 - (void)testFlutterSemanticsObjectAttributedStringsDoNotCrashWhenEmpty {
555 flutter::MockAccessibilityBridge* mock =
new flutter::MockAccessibilityBridge();
556 mock->isVoiceOverRunningValue =
true;
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);
564 XCTAssertTrue(
object.accessibilityAttributedLabel == nil);
567 - (void)testFlutterScrollableSemanticsObjectReturnsParentContainerIfNoChildren {
568 flutter::MockAccessibilityBridge* mock =
new flutter::MockAccessibilityBridge();
569 mock->isVoiceOverRunningValue =
true;
570 fml::WeakPtrFactory<flutter::AccessibilityBridgeIos> factory(mock);
571 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
573 flutter::SemanticsNode parent;
575 parent.rect = SkRect::MakeXYWH(0, 0, 100, 200);
576 parent.label =
"label";
577 parent.value =
"value";
578 parent.hint =
"hint";
580 flutter::SemanticsNode node;
582 node.flags =
static_cast<int32_t
>(flutter::SemanticsFlags::kHasImplicitScrolling);
583 node.actions = flutter::kHorizontalScrollSemanticsActions;
584 node.rect = SkRect::MakeXYWH(0, 0, 100, 200);
585 node.label =
"label";
586 node.value =
"value";
588 node.scrollExtentMax = 100.0;
589 node.scrollPosition = 0.0;
590 parent.childrenInTraversalOrder.push_back(1);
601 parentObject.
children = @[ scrollable ];
604 XCTAssertTrue(scrollView.isAccessibilityElement);
610 - (void)testFlutterScrollableSemanticsObjectHidesScrollBar {
611 fml::WeakPtrFactory<flutter::AccessibilityBridgeIos> factory(
612 new flutter::MockAccessibilityBridge());
613 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
615 flutter::SemanticsNode node;
616 node.flags =
static_cast<int32_t
>(flutter::SemanticsFlags::kHasImplicitScrolling);
617 node.actions = flutter::kHorizontalScrollSemanticsActions;
618 node.rect = SkRect::MakeXYWH(0, 0, 100, 200);
619 node.scrollExtentMax = 100.0;
620 node.scrollPosition = 0.0;
628 XCTAssertFalse(scrollView.showsHorizontalScrollIndicator);
629 XCTAssertFalse(scrollView.showsVerticalScrollIndicator);
632 - (void)testSemanticsObjectBuildsAttributedString {
633 fml::WeakPtrFactory<flutter::AccessibilityBridgeIos> factory(
634 new flutter::MockAccessibilityBridge());
635 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
636 flutter::SemanticsNode node;
637 node.label =
"label";
638 std::shared_ptr<flutter::SpellOutStringAttribute> attribute =
639 std::make_shared<flutter::SpellOutStringAttribute>();
640 attribute->start = 1;
642 attribute->type = flutter::StringAttributeType::kSpellOut;
643 node.labelAttributes.push_back(attribute);
644 node.value =
"value";
645 attribute = std::make_shared<flutter::SpellOutStringAttribute>();
646 attribute->start = 2;
648 attribute->type = flutter::StringAttributeType::kSpellOut;
649 node.valueAttributes.push_back(attribute);
651 std::shared_ptr<flutter::LocaleStringAttribute> local_attribute =
652 std::make_shared<flutter::LocaleStringAttribute>();
653 local_attribute->start = 3;
654 local_attribute->end = 4;
655 local_attribute->type = flutter::StringAttributeType::kLocale;
656 local_attribute->locale =
"en-MX";
657 node.hintAttributes.push_back(local_attribute);
660 NSMutableAttributedString* expectedAttributedLabel =
661 [[NSMutableAttributedString alloc] initWithString:NSLocalizedString(@"label", @"test")];
662 NSDictionary* attributeDict = @{
663 UIAccessibilitySpeechAttributeSpellOut : @YES,
665 [expectedAttributedLabel setAttributes:attributeDict range:NSMakeRange(1, 1)];
667 [
object.accessibilityAttributedLabel isEqualToAttributedString:expectedAttributedLabel]);
669 NSMutableAttributedString* expectedAttributedValue =
670 [[NSMutableAttributedString alloc] initWithString:NSLocalizedString(@"value", @"test")];
672 UIAccessibilitySpeechAttributeSpellOut : @YES,
674 [expectedAttributedValue setAttributes:attributeDict range:NSMakeRange(2, 1)];
676 [
object.accessibilityAttributedValue isEqualToAttributedString:expectedAttributedValue]);
678 NSMutableAttributedString* expectedAttributedHint =
679 [[NSMutableAttributedString alloc] initWithString:NSLocalizedString(@"hint", @"test")];
681 UIAccessibilitySpeechAttributeLanguage :
@"en-MX",
683 [expectedAttributedHint setAttributes:attributeDict range:NSMakeRange(3, 1)];
685 [
object.accessibilityAttributedHint isEqualToAttributedString:expectedAttributedHint]);
688 - (void)testShouldTriggerAnnouncement {
689 fml::WeakPtrFactory<flutter::AccessibilityBridgeIos> factory(
690 new flutter::MockAccessibilityBridge());
691 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
695 XCTAssertFalse([
object nodeShouldTriggerAnnouncement:nil]);
698 flutter::SemanticsNode node;
699 node.flags =
static_cast<int32_t
>(flutter::SemanticsFlags::kIsLiveRegion);
701 XCTAssertTrue([
object nodeShouldTriggerAnnouncement:&node]);
705 XCTAssertFalse([
object nodeShouldTriggerAnnouncement:nil]);
708 XCTAssertFalse([
object nodeShouldTriggerAnnouncement:&node]);
711 flutter::SemanticsNode updatedNode;
712 updatedNode.flags =
static_cast<int32_t
>(flutter::SemanticsFlags::kIsLiveRegion);
713 updatedNode.label =
"bar";
714 XCTAssertTrue([
object nodeShouldTriggerAnnouncement:&updatedNode]);
717 updatedNode.flags = 0;
718 XCTAssertFalse([
object nodeShouldTriggerAnnouncement:&updatedNode]);
721 updatedNode.label =
"foo";
723 XCTAssertTrue([
object nodeShouldTriggerAnnouncement:&node]);
726 - (void)testShouldDispatchShowOnScreenActionForHeader {
727 fml::WeakPtrFactory<flutter::MockAccessibilityBridge> factory(
728 new flutter::MockAccessibilityBridge());
729 fml::WeakPtr<flutter::MockAccessibilityBridge> bridge = factory.GetWeakPtr();
733 flutter::SemanticsNode node;
734 node.flags =
static_cast<int32_t
>(flutter::SemanticsFlags::kIsHeader);
740 [object accessibilityElementDidBecomeFocused];
742 XCTAssertTrue(bridge->observations.size() == 1);
743 XCTAssertTrue(bridge->observations[0].id == 1);
744 XCTAssertTrue(bridge->observations[0].action == flutter::SemanticsAction::kShowOnScreen);
747 - (void)testShouldDispatchShowOnScreenActionForHidden {
748 fml::WeakPtrFactory<flutter::MockAccessibilityBridge> factory(
749 new flutter::MockAccessibilityBridge());
750 fml::WeakPtr<flutter::MockAccessibilityBridge> bridge = factory.GetWeakPtr();
754 flutter::SemanticsNode node;
755 node.flags =
static_cast<int32_t
>(flutter::SemanticsFlags::kIsHidden);
761 [object accessibilityElementDidBecomeFocused];
763 XCTAssertTrue(bridge->observations.size() == 1);
764 XCTAssertTrue(bridge->observations[0].id == 1);
765 XCTAssertTrue(bridge->observations[0].action == flutter::SemanticsAction::kShowOnScreen);
768 - (void)testFlutterSwitchSemanticsObjectMatchesUISwitch {
769 fml::WeakPtrFactory<flutter::MockAccessibilityBridge> factory(
770 new flutter::MockAccessibilityBridge());
771 fml::WeakPtr<flutter::MockAccessibilityBridge> bridge = factory.GetWeakPtr();
776 flutter::SemanticsNode node;
777 node.flags =
static_cast<int32_t
>(flutter::SemanticsFlags::kHasToggledState) |
778 static_cast<int32_t
>(flutter::SemanticsFlags::kIsToggled) |
779 static_cast<int32_t
>(flutter::SemanticsFlags::kIsEnabled);
783 UISwitch* nativeSwitch = [[UISwitch alloc] init];
784 nativeSwitch.on = YES;
786 XCTAssertEqual(
object.accessibilityTraits, nativeSwitch.accessibilityTraits);
787 XCTAssertEqualObjects(
object.accessibilityValue, nativeSwitch.accessibilityValue);
790 flutter::SemanticsNode update;
791 update.flags =
static_cast<int32_t
>(flutter::SemanticsFlags::kHasToggledState) |
792 static_cast<int32_t
>(flutter::SemanticsFlags::kIsEnabled);
793 update.label =
"foo";
796 nativeSwitch.on = NO;
798 XCTAssertEqual(
object.accessibilityTraits, nativeSwitch.accessibilityTraits);
799 XCTAssertEqualObjects(
object.accessibilityValue, nativeSwitch.accessibilityValue);
802 - (void)testFlutterSemanticsObjectOfRadioButton {
803 fml::WeakPtrFactory<flutter::MockAccessibilityBridge> factory(
804 new flutter::MockAccessibilityBridge());
805 fml::WeakPtr<flutter::MockAccessibilityBridge> bridge = factory.GetWeakPtr();
809 flutter::SemanticsNode node;
810 node.flags =
static_cast<int32_t
>(flutter::SemanticsFlags::kIsInMutuallyExclusiveGroup) |
811 static_cast<int32_t
>(flutter::SemanticsFlags::kHasCheckedState) |
812 static_cast<int32_t
>(flutter::SemanticsFlags::kHasEnabledState) |
813 static_cast<int32_t
>(flutter::SemanticsFlags::kIsEnabled);
816 XCTAssertTrue((
object.accessibilityTraits & UIAccessibilityTraitButton) > 0);
817 XCTAssertNil(
object.accessibilityValue);
820 - (void)testFlutterSwitchSemanticsObjectMatchesUISwitchDisabled {
821 fml::WeakPtrFactory<flutter::MockAccessibilityBridge> factory(
822 new flutter::MockAccessibilityBridge());
823 fml::WeakPtr<flutter::MockAccessibilityBridge> bridge = factory.GetWeakPtr();
828 flutter::SemanticsNode node;
829 node.flags =
static_cast<int32_t
>(flutter::SemanticsFlags::kHasToggledState) |
830 static_cast<int32_t
>(flutter::SemanticsFlags::kIsToggled);
834 UISwitch* nativeSwitch = [[UISwitch alloc] init];
835 nativeSwitch.on = YES;
836 nativeSwitch.enabled = NO;
838 XCTAssertEqual(
object.accessibilityTraits, nativeSwitch.accessibilityTraits);
839 XCTAssertEqualObjects(
object.accessibilityValue, nativeSwitch.accessibilityValue);
842 - (void)testSemanticsObjectDeallocated {
843 fml::WeakPtrFactory<flutter::AccessibilityBridgeIos> factory(
844 new flutter::MockAccessibilityBridge());
845 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
853 XCTAssertNil(weakObject);
856 - (void)testFlutterSemanticsObjectReturnsNilContainerWhenBridgeIsNotAlive {
861 flutter::SemanticsNode parent;
863 parent.rect = SkRect::MakeXYWH(0, 0, 100, 200);
864 parent.label =
"label";
865 parent.value =
"value";
866 parent.hint =
"hint";
868 flutter::SemanticsNode node;
870 node.flags =
static_cast<int32_t
>(flutter::SemanticsFlags::kHasImplicitScrolling);
871 node.actions = flutter::kHorizontalScrollSemanticsActions;
872 node.rect = SkRect::MakeXYWH(0, 0, 100, 200);
873 node.label =
"label";
874 node.value =
"value";
876 node.scrollExtentMax = 100.0;
877 node.scrollPosition = 0.0;
878 parent.childrenInTraversalOrder.push_back(1);
880 flutter::SemanticsNode node2;
882 node2.rect = SkRect::MakeXYWH(0, 0, 100, 200);
883 node2.label =
"label";
884 node2.value =
"value";
886 node2.scrollExtentMax = 100.0;
887 node2.scrollPosition = 0.0;
888 parent.childrenInTraversalOrder.push_back(2);
891 flutter::MockAccessibilityBridge* mock =
new flutter::MockAccessibilityBridge();
892 mock->isVoiceOverRunningValue =
true;
893 fml::WeakPtrFactory<flutter::AccessibilityBridgeIos> factory(mock);
894 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
906 parentObject.
children = @[ scrollable, object2 ];
921 XCTAssertNil(scrollable.accessibilityContainer);
922 XCTAssertNil(object2.accessibilityContainer);