Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
Instance Methods | List of all members
SemanticsObjectTest Class Reference
Inheritance diagram for SemanticsObjectTest:

Instance Methods

(void) - testCreate [implementation]
 
(void) - testSetChildren [implementation]
 
(void) - testAccessibilityHitTestFocusAtLeaf [implementation]
 
(void) - testAccessibilityHitTestNoFocusableItem [implementation]
 
(void) - testAccessibilityScrollToVisible [implementation]
 
(void) - testAccessibilityScrollToVisibleWithChild [implementation]
 
(void) - testAccessibilityHitTestOutOfRect [implementation]
 
(void) - testReplaceChildAtIndex [implementation]
 
(void) - testPlainSemanticsObjectWithLabelHasStaticTextTrait [implementation]
 
(void) - testNodeWithImplicitScrollIsAnAccessibilityElementWhenItisHidden [implementation]
 
(void) - testNodeWithImplicitScrollIsNotAnAccessibilityElementWhenItisNotHidden [implementation]
 
(void) - testIntresetingSemanticsObjectWithLabelHasStaticTextTrait [implementation]
 
(void) - testIntresetingSemanticsObjectWithLabelHasStaticTextTrait1 [implementation]
 
(void) - testIntresetingSemanticsObjectWithLabelHasStaticTextTrait2 [implementation]
 
(void) - testVerticalFlutterScrollableSemanticsObject [implementation]
 
(void) - testVerticalFlutterScrollableSemanticsObjectNoWindowDoesNotCrash [implementation]
 
(void) - testHorizontalFlutterScrollableSemanticsObject [implementation]
 
(void) - testCanHandleInfiniteScrollExtent [implementation]
 
(void) - testCanHandleNaNScrollExtentAndScrollPoisition [implementation]
 
(void) - testFlutterScrollableSemanticsObjectIsNotHittestable [implementation]
 
(void) - testFlutterScrollableSemanticsObjectIsHiddenWhenVoiceOverIsRunning [implementation]
 
(void) - testFlutterSemanticsObjectHasIdentifier [implementation]
 
(void) - testFlutterScrollableSemanticsObjectWithLabelValueHintIsNotHiddenWhenVoiceOverIsRunning [implementation]
 
(void) - testFlutterSemanticsObjectMergeTooltipToLabel [implementation]
 
(void) - testFlutterSemanticsObjectAttributedStringsDoNotCrashWhenEmpty [implementation]
 
(void) - testFlutterScrollableSemanticsObjectReturnsParentContainerIfNoChildren [implementation]
 
(void) - testFlutterScrollableSemanticsObjectHidesScrollBar [implementation]
 
(void) - testSemanticsObjectBuildsAttributedString [implementation]
 
(void) - testShouldTriggerAnnouncement [implementation]
 
(void) - testShouldDispatchShowOnScreenActionForHeader [implementation]
 
(void) - testShouldDispatchShowOnScreenActionForHidden [implementation]
 
(void) - testFlutterSwitchSemanticsObjectMatchesUISwitch [implementation]
 
(void) - testFlutterSemanticsObjectOfRadioButton [implementation]
 
(void) - testFlutterSwitchSemanticsObjectMatchesUISwitchDisabled [implementation]
 
(void) - testSemanticsObjectDeallocated [implementation]
 
(void) - testFlutterSemanticsObjectReturnsNilContainerWhenBridgeIsNotAlive [implementation]
 
(void) - testAccessibilityHitTestSearchCanReturnPlatformView [implementation]
 
(void) - testFlutterPlatformViewSemanticsContainer [implementation]
 
(void) - testTextInputSemanticsObject [implementation]
 

Detailed Description

Definition at line 17 of file SemanticsObjectTest.mm.

Method Documentation

◆ testAccessibilityHitTestFocusAtLeaf

- (void) testAccessibilityHitTestFocusAtLeaf
implementation

Definition at line 15 of file SemanticsObjectTest.mm.

42 {
45 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
46 SemanticsObject* object0 = [[SemanticsObject alloc] initWithBridge:bridge uid:0];
47 SemanticsObject* object1 = [[SemanticsObject alloc] initWithBridge:bridge uid:1];
48 SemanticsObject* object2 = [[SemanticsObject alloc] initWithBridge:bridge uid:2];
49 SemanticsObject* object3 = [[SemanticsObject alloc] initWithBridge:bridge uid:3];
50 object0.children = @[ object1 ];
51 object0.childrenInHitTestOrder = @[ object1 ];
52 object1.children = @[ object2, object3 ];
53 object1.childrenInHitTestOrder = @[ object2, object3 ];
54
56 node0.id = 0;
57 node0.rect = SkRect::MakeXYWH(0, 0, 200, 200);
58 node0.label = "0";
59 [object0 setSemanticsNode:&node0];
60
62 node1.id = 1;
63 node1.rect = SkRect::MakeXYWH(0, 0, 200, 200);
64 node1.label = "1";
65 [object1 setSemanticsNode:&node1];
66
68 node2.id = 2;
69 node2.rect = SkRect::MakeXYWH(0, 0, 100, 100);
70 node2.label = "2";
71 [object2 setSemanticsNode:&node2];
72
74 node3.id = 3;
75 node3.rect = SkRect::MakeXYWH(0, 0, 200, 200);
76 node3.label = "3";
77 [object3 setSemanticsNode:&node3];
78
79 CGPoint point = CGPointMake(10, 10);
80 id hitTestResult = [object0 _accessibilityHitTest:point withEvent:nil];
81
82 // Focus to object2 because it's the first object in hit test order
83 XCTAssertEqual(hitTestResult, object2);
84}
id _accessibilityHitTest:withEvent:(CGPoint point, [withEvent] UIEvent *event)
NSArray< SemanticsObject * > * childrenInHitTestOrder
NSArray< SemanticsObject * > * children
void setSemanticsNode:(const flutter::SemanticsNode *NS_REQUIRES_SUPER)
static constexpr SkRect MakeXYWH(float x, float y, float w, float h)
Definition SkRect.h:659

◆ testAccessibilityHitTestNoFocusableItem

- (void) testAccessibilityHitTestNoFocusableItem
implementation

Definition at line 15 of file SemanticsObjectTest.mm.

86 {
89 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
90 SemanticsObject* object0 = [[SemanticsObject alloc] initWithBridge:bridge uid:0];
91 SemanticsObject* object1 = [[SemanticsObject alloc] initWithBridge:bridge uid:1];
92 SemanticsObject* object2 = [[SemanticsObject alloc] initWithBridge:bridge uid:2];
93 SemanticsObject* object3 = [[SemanticsObject alloc] initWithBridge:bridge uid:3];
94 object0.children = @[ object1 ];
95 object0.childrenInHitTestOrder = @[ object1 ];
96 object1.children = @[ object2, object3 ];
97 object1.childrenInHitTestOrder = @[ object2, object3 ];
98
100 node0.id = 0;
101 node0.rect = SkRect::MakeXYWH(0, 0, 200, 200);
102 [object0 setSemanticsNode:&node0];
103
105 node1.id = 1;
106 node1.rect = SkRect::MakeXYWH(0, 0, 200, 200);
107 [object1 setSemanticsNode:&node1];
108
110 node2.id = 2;
111 node2.rect = SkRect::MakeXYWH(0, 0, 100, 100);
112 [object2 setSemanticsNode:&node2];
113
115 node3.id = 3;
116 node3.rect = SkRect::MakeXYWH(0, 0, 200, 200);
117 [object3 setSemanticsNode:&node3];
118
119 CGPoint point = CGPointMake(10, 10);
120 id hitTestResult = [object0 _accessibilityHitTest:point withEvent:nil];
121
122 XCTAssertNil(hitTestResult);
123}

◆ testAccessibilityHitTestOutOfRect

- (void) testAccessibilityHitTestOutOfRect
implementation

Definition at line 15 of file SemanticsObjectTest.mm.

161 {
164 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
165 SemanticsObject* object0 = [[SemanticsObject alloc] initWithBridge:bridge uid:0];
166 SemanticsObject* object1 = [[SemanticsObject alloc] initWithBridge:bridge uid:1];
167 SemanticsObject* object2 = [[SemanticsObject alloc] initWithBridge:bridge uid:2];
168 SemanticsObject* object3 = [[SemanticsObject alloc] initWithBridge:bridge uid:3];
169 object0.children = @[ object1 ];
170 object0.childrenInHitTestOrder = @[ object1 ];
171 object1.children = @[ object2, object3 ];
172 object1.childrenInHitTestOrder = @[ object2, object3 ];
173
175 node0.id = 0;
176 node0.rect = SkRect::MakeXYWH(0, 0, 200, 200);
177 node0.label = "0";
178 [object0 setSemanticsNode:&node0];
179
181 node1.id = 1;
182 node1.rect = SkRect::MakeXYWH(0, 0, 200, 200);
183 node1.label = "1";
184 [object1 setSemanticsNode:&node1];
185
187 node2.id = 2;
188 node2.rect = SkRect::MakeXYWH(0, 0, 100, 100);
189 node2.label = "2";
190 [object2 setSemanticsNode:&node2];
191
193 node3.id = 3;
194 node3.rect = SkRect::MakeXYWH(0, 0, 200, 200);
195 node3.label = "3";
196 [object3 setSemanticsNode:&node3];
197
198 CGPoint point = CGPointMake(300, 300);
199 id hitTestResult = [object0 _accessibilityHitTest:point withEvent:nil];
200
201 XCTAssertNil(hitTestResult);
202}

◆ testAccessibilityHitTestSearchCanReturnPlatformView

- (void) testAccessibilityHitTestSearchCanReturnPlatformView
implementation

Definition at line 15 of file SemanticsObjectTest.mm.

943 {
946 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
947 SemanticsObject* object0 = [[SemanticsObject alloc] initWithBridge:bridge uid:0];
948 SemanticsObject* object1 = [[SemanticsObject alloc] initWithBridge:bridge uid:1];
949 SemanticsObject* object3 = [[SemanticsObject alloc] initWithBridge:bridge uid:3];
950 FlutterTouchInterceptingView* platformView =
951 [[FlutterTouchInterceptingView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
952 FlutterPlatformViewSemanticsContainer* platformViewSemanticsContainer =
953 [[FlutterPlatformViewSemanticsContainer alloc] initWithBridge:bridge
954 uid:1
955 platformView:platformView];
956
957 object0.children = @[ object1 ];
958 object0.childrenInHitTestOrder = @[ object1 ];
959 object1.children = @[ platformViewSemanticsContainer, object3 ];
960 object1.childrenInHitTestOrder = @[ platformViewSemanticsContainer, object3 ];
961
963 node0.id = 0;
964 node0.rect = SkRect::MakeXYWH(0, 0, 200, 200);
965 node0.label = "0";
966 [object0 setSemanticsNode:&node0];
967
969 node1.id = 1;
970 node1.rect = SkRect::MakeXYWH(0, 0, 200, 200);
971 node1.label = "1";
972 [object1 setSemanticsNode:&node1];
973
975 node2.id = 2;
976 node2.rect = SkRect::MakeXYWH(0, 0, 100, 100);
977 node2.label = "2";
978 [platformViewSemanticsContainer setSemanticsNode:&node2];
979
981 node3.id = 3;
982 node3.rect = SkRect::MakeXYWH(0, 0, 200, 200);
983 node3.label = "3";
984 [object3 setSemanticsNode:&node3];
985
986 CGPoint point = CGPointMake(10, 10);
987 id hitTestResult = [object0 _accessibilityHitTest:point withEvent:nil];
988
989 XCTAssertEqual(hitTestResult, platformView);
990}

◆ testAccessibilityScrollToVisible

- (void) testAccessibilityScrollToVisible
implementation

Definition at line 15 of file SemanticsObjectTest.mm.

125 {
129 SemanticsObject* object3 = [[SemanticsObject alloc] initWithBridge:bridge uid:3];
130
132 node3.id = 3;
133 node3.rect = SkRect::MakeXYWH(0, 0, 200, 200);
134 [object3 setSemanticsNode:&node3];
135
137
138 XCTAssertTrue(bridge->observations.size() == 1);
139 XCTAssertTrue(bridge->observations[0].id == 3);
140 XCTAssertTrue(bridge->observations[0].action == flutter::SemanticsAction::kShowOnScreen);
141}
BOOL accessibilityScrollToVisible()

◆ testAccessibilityScrollToVisibleWithChild

- (void) testAccessibilityScrollToVisibleWithChild
implementation

Definition at line 15 of file SemanticsObjectTest.mm.

143 {
147 SemanticsObject* object3 = [[SemanticsObject alloc] initWithBridge:bridge uid:3];
148
150 node3.id = 3;
151 node3.rect = SkRect::MakeXYWH(0, 0, 200, 200);
152 [object3 setSemanticsNode:&node3];
153
155
156 XCTAssertTrue(bridge->observations.size() == 1);
157 XCTAssertTrue(bridge->observations[0].id == 3);
158 XCTAssertTrue(bridge->observations[0].action == flutter::SemanticsAction::kShowOnScreen);
159}
BOOL accessibilityScrollToVisibleWithChild:(id child)

◆ testCanHandleInfiniteScrollExtent

- (void) testCanHandleInfiniteScrollExtent
implementation

Definition at line 15 of file SemanticsObjectTest.mm.

393 {
396 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
397
398 float transformScale = 0.5f;
399 float screenScale = [[bridge->view() window] screen].scale;
400 float effectivelyScale = transformScale / screenScale;
401 float x = 10;
402 float y = 10;
403 float w = 100;
404 float h = 200;
405 float scrollExtentMax = INFINITY;
406 float scrollPosition = 150.0;
407
409 node.flags = static_cast<int32_t>(flutter::SemanticsFlags::kHasImplicitScrolling);
411 node.rect = SkRect::MakeXYWH(x, y, w, h);
412 node.scrollExtentMax = scrollExtentMax;
413 node.scrollPosition = scrollPosition;
414 node.transform = {
415 transformScale, 0, 0, 0, 0, transformScale, 0, 0, 0, 0, transformScale, 0, 0, 0, 0, 1.0};
417 [[FlutterScrollableSemanticsObject alloc] initWithBridge:bridge uid:0];
418 [scrollable setSemanticsNode:&node];
420 UIScrollView* scrollView = [scrollable nativeAccessibility];
421 XCTAssertTrue(
422 CGRectEqualToRect(scrollView.frame, CGRectMake(x * effectivelyScale, y * effectivelyScale,
423 w * effectivelyScale, h * effectivelyScale)));
424 XCTAssertTrue(CGSizeEqualToSize(
425 scrollView.contentSize,
426 CGSizeMake(w * effectivelyScale,
427 (h + kScrollExtentMaxForInf + scrollPosition) * effectivelyScale)));
428 XCTAssertTrue(CGPointEqualToPoint(scrollView.contentOffset,
429 CGPointMake(0, scrollPosition * effectivelyScale)));
430}
constexpr float kScrollExtentMaxForInf
double y
double x
const int kVerticalScrollSemanticsActions
SkScalar w
SkScalar h

◆ testCanHandleNaNScrollExtentAndScrollPoisition

- (void) testCanHandleNaNScrollExtentAndScrollPoisition
implementation

Definition at line 15 of file SemanticsObjectTest.mm.

432 {
435 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
436
437 float transformScale = 0.5f;
438 float screenScale = [[bridge->view() window] screen].scale;
439 float effectivelyScale = transformScale / screenScale;
440 float x = 10;
441 float y = 10;
442 float w = 100;
443 float h = 200;
444 float scrollExtentMax = std::nan("");
445 float scrollPosition = std::nan("");
446
448 node.flags = static_cast<int32_t>(flutter::SemanticsFlags::kHasImplicitScrolling);
450 node.rect = SkRect::MakeXYWH(x, y, w, h);
451 node.scrollExtentMax = scrollExtentMax;
452 node.scrollPosition = scrollPosition;
453 node.transform = {
454 transformScale, 0, 0, 0, 0, transformScale, 0, 0, 0, 0, transformScale, 0, 0, 0, 0, 1.0};
456 [[FlutterScrollableSemanticsObject alloc] initWithBridge:bridge uid:0];
457 [scrollable setSemanticsNode:&node];
459 UIScrollView* scrollView = [scrollable nativeAccessibility];
460 XCTAssertTrue(
461 CGRectEqualToRect(scrollView.frame, CGRectMake(x * effectivelyScale, y * effectivelyScale,
462 w * effectivelyScale, h * effectivelyScale)));
463 // Content size equal to the scrollable size.
464 XCTAssertTrue(CGSizeEqualToSize(scrollView.contentSize,
465 CGSizeMake(w * effectivelyScale, h * effectivelyScale)));
466 XCTAssertTrue(CGPointEqualToPoint(scrollView.contentOffset, CGPointMake(0, 0)));
467}

◆ testCreate

- (void) testCreate
implementation

Definition at line 15 of file SemanticsObjectTest.mm.

22 {
25 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
26 SemanticsObject* object = [[SemanticsObject alloc] initWithBridge:bridge uid:0];
27 XCTAssertNotNil(object);
28}

◆ testFlutterPlatformViewSemanticsContainer

- (void) testFlutterPlatformViewSemanticsContainer
implementation

Definition at line 15 of file SemanticsObjectTest.mm.

992 {
996 __weak FlutterTouchInterceptingView* weakPlatformView;
997 @autoreleasepool {
998 FlutterTouchInterceptingView* platformView = [[FlutterTouchInterceptingView alloc] init];
999 weakPlatformView = platformView;
1001 [[FlutterPlatformViewSemanticsContainer alloc] initWithBridge:bridge
1002 uid:1
1003 platformView:platformView];
1004 XCTAssertEqualObjects(platformView.accessibilityContainer, container);
1005 XCTAssertNotNil(weakPlatformView);
1006 }
1007 // Check if there's no more strong references to `platformView` after container and platformView
1008 // are released.
1009 XCTAssertNil(weakPlatformView);
1010}

◆ testFlutterScrollableSemanticsObjectHidesScrollBar

- (void) testFlutterScrollableSemanticsObjectHidesScrollBar
implementation

Definition at line 15 of file SemanticsObjectTest.mm.

627 {
630 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
631
633 node.flags = static_cast<int32_t>(flutter::SemanticsFlags::kHasImplicitScrolling);
635 node.rect = SkRect::MakeXYWH(0, 0, 100, 200);
636 node.scrollExtentMax = 100.0;
637 node.scrollPosition = 0.0;
638
640 [[FlutterScrollableSemanticsObject alloc] initWithBridge:bridge uid:0];
641 [scrollable setSemanticsNode:&node];
643 UIScrollView* scrollView = [scrollable nativeAccessibility];
644
645 XCTAssertFalse(scrollView.showsHorizontalScrollIndicator);
646 XCTAssertFalse(scrollView.showsVerticalScrollIndicator);
647}
const int kHorizontalScrollSemanticsActions

◆ testFlutterScrollableSemanticsObjectIsHiddenWhenVoiceOverIsRunning

- (void) testFlutterScrollableSemanticsObjectIsHiddenWhenVoiceOverIsRunning
implementation

Definition at line 15 of file SemanticsObjectTest.mm.

489 {
491 mock->isVoiceOverRunningValue = false;
493 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
494
496 node.flags = static_cast<int32_t>(flutter::SemanticsFlags::kHasImplicitScrolling);
498 node.rect = SkRect::MakeXYWH(0, 0, 100, 200);
499 node.scrollExtentMax = 100.0;
500 node.scrollPosition = 0.0;
501
503 [[FlutterScrollableSemanticsObject alloc] initWithBridge:bridge uid:0];
504 [scrollable setSemanticsNode:&node];
506 UIScrollView* scrollView = [scrollable nativeAccessibility];
507 XCTAssertTrue(scrollView.isAccessibilityElement);
508 mock->isVoiceOverRunningValue = true;
509 XCTAssertFalse(scrollView.isAccessibilityElement);
510}

◆ testFlutterScrollableSemanticsObjectIsNotHittestable

- (void) testFlutterScrollableSemanticsObjectIsNotHittestable
implementation

Definition at line 15 of file SemanticsObjectTest.mm.

469 {
472 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
473
475 node.flags = static_cast<int32_t>(flutter::SemanticsFlags::kHasImplicitScrolling);
477 node.rect = SkRect::MakeXYWH(0, 0, 100, 200);
478 node.scrollExtentMax = 100.0;
479 node.scrollPosition = 0.0;
480
482 [[FlutterScrollableSemanticsObject alloc] initWithBridge:bridge uid:0];
483 [scrollable setSemanticsNode:&node];
485 UIScrollView* scrollView = [scrollable nativeAccessibility];
486 XCTAssertEqual([scrollView hitTest:CGPointMake(10, 10) withEvent:nil], nil);
487}

◆ testFlutterScrollableSemanticsObjectReturnsParentContainerIfNoChildren

- (void) testFlutterScrollableSemanticsObjectReturnsParentContainerIfNoChildren
implementation

Definition at line 15 of file SemanticsObjectTest.mm.

584 {
586 mock->isVoiceOverRunningValue = true;
588 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
589
591 parent.id = 0;
592 parent.rect = SkRect::MakeXYWH(0, 0, 100, 200);
593 parent.label = "label";
594 parent.value = "value";
595 parent.hint = "hint";
596
598 node.id = 1;
599 node.flags = static_cast<int32_t>(flutter::SemanticsFlags::kHasImplicitScrolling);
601 node.rect = SkRect::MakeXYWH(0, 0, 100, 200);
602 node.label = "label";
603 node.value = "value";
604 node.hint = "hint";
605 node.scrollExtentMax = 100.0;
606 node.scrollPosition = 0.0;
607 parent.childrenInTraversalOrder.push_back(1);
608
609 FlutterSemanticsObject* parentObject = [[FlutterSemanticsObject alloc] initWithBridge:bridge
610 uid:0];
611 [parentObject setSemanticsNode:&parent];
612
614 [[FlutterScrollableSemanticsObject alloc] initWithBridge:bridge uid:1];
615 [scrollable setSemanticsNode:&node];
616 UIScrollView* scrollView = [scrollable nativeAccessibility];
617
618 parentObject.children = @[ scrollable ];
621 XCTAssertTrue(scrollView.isAccessibilityElement);
622 SemanticsObjectContainer* container =
623 static_cast<SemanticsObjectContainer*>(scrollable.accessibilityContainer);
624 XCTAssertEqual(container.semanticsObject, parentObject);
625}
SemanticsObject * semanticsObject
void accessibilityBridgeDidFinishUpdate()

◆ testFlutterScrollableSemanticsObjectWithLabelValueHintIsNotHiddenWhenVoiceOverIsRunning

- (void) testFlutterScrollableSemanticsObjectWithLabelValueHintIsNotHiddenWhenVoiceOverIsRunning
implementation

Definition at line 15 of file SemanticsObjectTest.mm.

526 {
528 mock->isVoiceOverRunningValue = true;
530 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
531
533 node.flags = static_cast<int32_t>(flutter::SemanticsFlags::kHasImplicitScrolling);
535 node.rect = SkRect::MakeXYWH(0, 0, 100, 200);
536 node.label = "label";
537 node.value = "value";
538 node.hint = "hint";
539 node.scrollExtentMax = 100.0;
540 node.scrollPosition = 0.0;
541
543 [[FlutterScrollableSemanticsObject alloc] initWithBridge:bridge uid:0];
544 [scrollable setSemanticsNode:&node];
546 UIScrollView* scrollView = [scrollable nativeAccessibility];
547 XCTAssertTrue(scrollView.isAccessibilityElement);
548 XCTAssertTrue(
549 [scrollView.accessibilityLabel isEqualToString:NSLocalizedString(@"label", @"test")]);
550 XCTAssertTrue(
551 [scrollView.accessibilityValue isEqualToString:NSLocalizedString(@"value", @"test")]);
552 XCTAssertTrue([scrollView.accessibilityHint isEqualToString:NSLocalizedString(@"hint", @"test")]);
553}

◆ testFlutterSemanticsObjectAttributedStringsDoNotCrashWhenEmpty

- (void) testFlutterSemanticsObjectAttributedStringsDoNotCrashWhenEmpty
implementation

Definition at line 15 of file SemanticsObjectTest.mm.

571 {
573 mock->isVoiceOverRunningValue = true;
575 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
576
578 node.rect = SkRect::MakeXYWH(0, 0, 100, 200);
579 FlutterSemanticsObject* object = [[FlutterSemanticsObject alloc] initWithBridge:bridge uid:0];
580 [object setSemanticsNode:&node];
581 XCTAssertTrue(object.accessibilityAttributedLabel == nil);
582}

◆ testFlutterSemanticsObjectHasIdentifier

- (void) testFlutterSemanticsObjectHasIdentifier
implementation

Definition at line 15 of file SemanticsObjectTest.mm.

512 {
514 mock->isVoiceOverRunningValue = true;
516 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
517
519 node.identifier = "identifier";
520
521 FlutterSemanticsObject* object = [[FlutterSemanticsObject alloc] initWithBridge:bridge uid:0];
522 [object setSemanticsNode:&node];
523 XCTAssertTrue([object.accessibilityIdentifier isEqualToString:@"identifier"]);
524}

◆ testFlutterSemanticsObjectMergeTooltipToLabel

- (void) testFlutterSemanticsObjectMergeTooltipToLabel
implementation

Definition at line 15 of file SemanticsObjectTest.mm.

555 {
557 mock->isVoiceOverRunningValue = true;
559 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
560
562 node.rect = SkRect::MakeXYWH(0, 0, 100, 200);
563 node.label = "label";
564 node.tooltip = "tooltip";
565 FlutterSemanticsObject* object = [[FlutterSemanticsObject alloc] initWithBridge:bridge uid:0];
566 [object setSemanticsNode:&node];
567 XCTAssertTrue(object.isAccessibilityElement);
568 XCTAssertTrue([object.accessibilityLabel isEqualToString:@"label\ntooltip"]);
569}

◆ testFlutterSemanticsObjectOfRadioButton

- (void) testFlutterSemanticsObjectOfRadioButton
implementation

Definition at line 15 of file SemanticsObjectTest.mm.

819 {
823 FlutterSemanticsObject* object = [[FlutterSemanticsObject alloc] initWithBridge:bridge uid:0];
824
825 // Handle initial setting of node with header.
828 static_cast<int32_t>(flutter::SemanticsFlags::kHasCheckedState) |
829 static_cast<int32_t>(flutter::SemanticsFlags::kHasEnabledState) |
830 static_cast<int32_t>(flutter::SemanticsFlags::kIsEnabled);
831 node.label = "foo";
832 [object setSemanticsNode:&node];
833 XCTAssertTrue((object.accessibilityTraits & UIAccessibilityTraitButton) > 0);
834 XCTAssertNil(object.accessibilityValue);
835}

◆ testFlutterSemanticsObjectReturnsNilContainerWhenBridgeIsNotAlive

- (void) testFlutterSemanticsObjectReturnsNilContainerWhenBridgeIsNotAlive
implementation

Definition at line 15 of file SemanticsObjectTest.mm.

873 {
874 FlutterSemanticsObject* parentObject;
876 FlutterSemanticsObject* object2;
877
879 parent.id = 0;
880 parent.rect = SkRect::MakeXYWH(0, 0, 100, 200);
881 parent.label = "label";
882 parent.value = "value";
883 parent.hint = "hint";
884
886 node.id = 1;
887 node.flags = static_cast<int32_t>(flutter::SemanticsFlags::kHasImplicitScrolling);
889 node.rect = SkRect::MakeXYWH(0, 0, 100, 200);
890 node.label = "label";
891 node.value = "value";
892 node.hint = "hint";
893 node.scrollExtentMax = 100.0;
894 node.scrollPosition = 0.0;
895 parent.childrenInTraversalOrder.push_back(1);
896
898 node2.id = 2;
899 node2.rect = SkRect::MakeXYWH(0, 0, 100, 200);
900 node2.label = "label";
901 node2.value = "value";
902 node2.hint = "hint";
903 node2.scrollExtentMax = 100.0;
904 node2.scrollPosition = 0.0;
905 parent.childrenInTraversalOrder.push_back(2);
906
907 {
910 mock->isVoiceOverRunningValue = true;
912 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
913
914 parentObject = [[FlutterSemanticsObject alloc] initWithBridge:bridge uid:0];
915 [parentObject setSemanticsNode:&parent];
916
917 scrollable = [[FlutterScrollableSemanticsObject alloc] initWithBridge:bridge uid:1];
918 [scrollable setSemanticsNode:&node];
919 [scrollable accessibilityBridgeDidFinishUpdate];
920
921 object2 = [[FlutterSemanticsObject alloc] initWithBridge:bridge uid:2];
922 [object2 setSemanticsNode:&node2];
923
924 parentObject.children = @[ scrollable, object2 ];
925 [parentObject accessibilityBridgeDidFinishUpdate];
926 [scrollable accessibilityBridgeDidFinishUpdate];
927 [object2 accessibilityBridgeDidFinishUpdate];
928
929 // Returns the correct container if the bridge is alive.
930 SemanticsObjectContainer* container =
931 static_cast<SemanticsObjectContainer*>(scrollable.accessibilityContainer);
932 XCTAssertEqual(container.semanticsObject, parentObject);
933 SemanticsObjectContainer* container2 =
934 static_cast<SemanticsObjectContainer*>(object2.accessibilityContainer);
935 XCTAssertEqual(container2.semanticsObject, parentObject);
936 }
937 // The bridge pointer went out of scope and was deallocated.
938
939 XCTAssertNil(scrollable.accessibilityContainer);
940 XCTAssertNil(object2.accessibilityContainer);
941}

◆ testFlutterSwitchSemanticsObjectMatchesUISwitch

- (void) testFlutterSwitchSemanticsObjectMatchesUISwitch
implementation

Definition at line 15 of file SemanticsObjectTest.mm.

785 {
789 FlutterSwitchSemanticsObject* object = [[FlutterSwitchSemanticsObject alloc] initWithBridge:bridge
790 uid:1];
791
792 // Handle initial setting of node with header.
794 node.flags = static_cast<int32_t>(flutter::SemanticsFlags::kHasToggledState) |
795 static_cast<int32_t>(flutter::SemanticsFlags::kIsToggled) |
796 static_cast<int32_t>(flutter::SemanticsFlags::kIsEnabled);
797 node.label = "foo";
798 [object setSemanticsNode:&node];
799 // Create ab real UISwitch to compare the FlutterSwitchSemanticsObject with.
800 UISwitch* nativeSwitch = [[UISwitch alloc] init];
801 nativeSwitch.on = YES;
802
803 XCTAssertEqual(object.accessibilityTraits, nativeSwitch.accessibilityTraits);
804 XCTAssertEqualObjects(object.accessibilityValue, nativeSwitch.accessibilityValue);
805
806 // Set the toggled to false;
808 update.flags = static_cast<int32_t>(flutter::SemanticsFlags::kHasToggledState) |
809 static_cast<int32_t>(flutter::SemanticsFlags::kIsEnabled);
810 update.label = "foo";
811 [object setSemanticsNode:&update];
812
813 nativeSwitch.on = NO;
814
815 XCTAssertEqual(object.accessibilityTraits, nativeSwitch.accessibilityTraits);
816 XCTAssertEqualObjects(object.accessibilityValue, nativeSwitch.accessibilityValue);
817}

◆ testFlutterSwitchSemanticsObjectMatchesUISwitchDisabled

- (void) testFlutterSwitchSemanticsObjectMatchesUISwitchDisabled
implementation

Definition at line 15 of file SemanticsObjectTest.mm.

837 {
841 FlutterSwitchSemanticsObject* object = [[FlutterSwitchSemanticsObject alloc] initWithBridge:bridge
842 uid:1];
843
844 // Handle initial setting of node with header.
846 node.flags = static_cast<int32_t>(flutter::SemanticsFlags::kHasToggledState) |
847 static_cast<int32_t>(flutter::SemanticsFlags::kIsToggled);
848 node.label = "foo";
849 [object setSemanticsNode:&node];
850 // Create ab real UISwitch to compare the FlutterSwitchSemanticsObject with.
851 UISwitch* nativeSwitch = [[UISwitch alloc] init];
852 nativeSwitch.on = YES;
853 nativeSwitch.enabled = NO;
854
855 XCTAssertEqual(object.accessibilityTraits, nativeSwitch.accessibilityTraits);
856 XCTAssertEqualObjects(object.accessibilityValue, nativeSwitch.accessibilityValue);
857}

◆ testHorizontalFlutterScrollableSemanticsObject

- (void) testHorizontalFlutterScrollableSemanticsObject
implementation

Definition at line 15 of file SemanticsObjectTest.mm.

355 {
358 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
359
360 float transformScale = 0.5f;
361 float screenScale = [[bridge->view() window] screen].scale;
362 float effectivelyScale = transformScale / screenScale;
363 float x = 10;
364 float y = 10;
365 float w = 100;
366 float h = 200;
367 float scrollExtentMax = 500.0;
368 float scrollPosition = 150.0;
369
371 node.flags = static_cast<int32_t>(flutter::SemanticsFlags::kHasImplicitScrolling);
373 node.rect = SkRect::MakeXYWH(x, y, w, h);
374 node.scrollExtentMax = scrollExtentMax;
375 node.scrollPosition = scrollPosition;
376 node.transform = {
377 transformScale, 0, 0, 0, 0, transformScale, 0, 0, 0, 0, transformScale, 0, 0, 0, 0, 1.0};
379 [[FlutterScrollableSemanticsObject alloc] initWithBridge:bridge uid:0];
380 [scrollable setSemanticsNode:&node];
382 UIScrollView* scrollView = [scrollable nativeAccessibility];
383 XCTAssertTrue(
384 CGRectEqualToRect(scrollView.frame, CGRectMake(x * effectivelyScale, y * effectivelyScale,
385 w * effectivelyScale, h * effectivelyScale)));
386 XCTAssertTrue(CGSizeEqualToSize(
387 scrollView.contentSize,
388 CGSizeMake((w + scrollExtentMax) * effectivelyScale, h * effectivelyScale)));
389 XCTAssertTrue(CGPointEqualToPoint(scrollView.contentOffset,
390 CGPointMake(scrollPosition * effectivelyScale, 0)));
391}

◆ testIntresetingSemanticsObjectWithLabelHasStaticTextTrait

- (void) testIntresetingSemanticsObjectWithLabelHasStaticTextTrait
implementation

Definition at line 15 of file SemanticsObjectTest.mm.

252 {
255 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
257 node.label = "foo";
258 FlutterSemanticsObject* object = [[FlutterSemanticsObject alloc] initWithBridge:bridge uid:0];
259 SemanticsObject* child1 = [[SemanticsObject alloc] initWithBridge:bridge uid:1];
260 object.children = @[ child1 ];
261 [object setSemanticsNode:&node];
262 XCTAssertEqual([object accessibilityTraits], UIAccessibilityTraitNone);
263}

◆ testIntresetingSemanticsObjectWithLabelHasStaticTextTrait1

- (void) testIntresetingSemanticsObjectWithLabelHasStaticTextTrait1
implementation

Definition at line 15 of file SemanticsObjectTest.mm.

265 {
268 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
270 node.label = "foo";
271 node.flags = static_cast<int32_t>(flutter::SemanticsFlags::kIsTextField);
272 FlutterSemanticsObject* object = [[FlutterSemanticsObject alloc] initWithBridge:bridge uid:0];
273 [object setSemanticsNode:&node];
274 XCTAssertEqual([object accessibilityTraits], UIAccessibilityTraitNone);
275}

◆ testIntresetingSemanticsObjectWithLabelHasStaticTextTrait2

- (void) testIntresetingSemanticsObjectWithLabelHasStaticTextTrait2
implementation

Definition at line 15 of file SemanticsObjectTest.mm.

277 {
280 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
282 node.label = "foo";
283 node.flags = static_cast<int32_t>(flutter::SemanticsFlags::kIsButton);
284 FlutterSemanticsObject* object = [[FlutterSemanticsObject alloc] initWithBridge:bridge uid:0];
285 [object setSemanticsNode:&node];
286 XCTAssertEqual([object accessibilityTraits], UIAccessibilityTraitButton);
287}

◆ testNodeWithImplicitScrollIsAnAccessibilityElementWhenItisHidden

- (void) testNodeWithImplicitScrollIsAnAccessibilityElementWhenItisHidden
implementation

Definition at line 15 of file SemanticsObjectTest.mm.

229 {
232 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
234 node.flags = static_cast<int32_t>(flutter::SemanticsFlags::kHasImplicitScrolling) |
235 static_cast<int32_t>(flutter::SemanticsFlags::kIsHidden);
236 FlutterSemanticsObject* object = [[FlutterSemanticsObject alloc] initWithBridge:bridge uid:0];
237 [object setSemanticsNode:&node];
238 XCTAssertEqual(object.isAccessibilityElement, YES);
239}

◆ testNodeWithImplicitScrollIsNotAnAccessibilityElementWhenItisNotHidden

- (void) testNodeWithImplicitScrollIsNotAnAccessibilityElementWhenItisNotHidden
implementation

Definition at line 15 of file SemanticsObjectTest.mm.

241 {
244 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
246 node.flags = static_cast<int32_t>(flutter::SemanticsFlags::kHasImplicitScrolling);
247 FlutterSemanticsObject* object = [[FlutterSemanticsObject alloc] initWithBridge:bridge uid:0];
248 [object setSemanticsNode:&node];
249 XCTAssertEqual(object.isAccessibilityElement, NO);
250}

◆ testPlainSemanticsObjectWithLabelHasStaticTextTrait

- (void) testPlainSemanticsObjectWithLabelHasStaticTextTrait
implementation

Definition at line 15 of file SemanticsObjectTest.mm.

218 {
221 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
223 node.label = "foo";
224 FlutterSemanticsObject* object = [[FlutterSemanticsObject alloc] initWithBridge:bridge uid:0];
225 [object setSemanticsNode:&node];
226 XCTAssertEqual([object accessibilityTraits], UIAccessibilityTraitStaticText);
227}

◆ testReplaceChildAtIndex

- (void) testReplaceChildAtIndex
implementation

Definition at line 15 of file SemanticsObjectTest.mm.

204 {
207 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
208 SemanticsObject* parent = [[SemanticsObject alloc] initWithBridge:bridge uid:0];
209 SemanticsObject* child1 = [[SemanticsObject alloc] initWithBridge:bridge uid:1];
210 SemanticsObject* child2 = [[SemanticsObject alloc] initWithBridge:bridge uid:2];
211 parent.children = @[ child1 ];
212 [parent replaceChildAtIndex:0 withChild:child2];
213 XCTAssertNil(child1.parent);
214 XCTAssertEqual(parent, child2.parent);
215 XCTAssertEqualObjects(parent.children, @[ child2 ]);
216}
SemanticsObject * parent
void replaceChildAtIndex:withChild:(NSInteger index,[withChild] SemanticsObject *child)

◆ testSemanticsObjectBuildsAttributedString

- (void) testSemanticsObjectBuildsAttributedString
implementation

Definition at line 15 of file SemanticsObjectTest.mm.

649 {
652 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
654 node.label = "label";
655 std::shared_ptr<flutter::SpellOutStringAttribute> attribute =
656 std::make_shared<flutter::SpellOutStringAttribute>();
657 attribute->start = 1;
658 attribute->end = 2;
660 node.labelAttributes.push_back(attribute);
661 node.value = "value";
662 attribute = std::make_shared<flutter::SpellOutStringAttribute>();
663 attribute->start = 2;
664 attribute->end = 3;
666 node.valueAttributes.push_back(attribute);
667 node.hint = "hint";
668 std::shared_ptr<flutter::LocaleStringAttribute> local_attribute =
669 std::make_shared<flutter::LocaleStringAttribute>();
670 local_attribute->start = 3;
671 local_attribute->end = 4;
672 local_attribute->type = flutter::StringAttributeType::kLocale;
673 local_attribute->locale = "en-MX";
674 node.hintAttributes.push_back(local_attribute);
675 FlutterSemanticsObject* object = [[FlutterSemanticsObject alloc] initWithBridge:bridge uid:0];
676 [object setSemanticsNode:&node];
677 NSMutableAttributedString* expectedAttributedLabel =
678 [[NSMutableAttributedString alloc] initWithString:NSLocalizedString(@"label", @"test")];
679 NSDictionary* attributeDict = @{
680 UIAccessibilitySpeechAttributeSpellOut : @YES,
681 };
682 [expectedAttributedLabel setAttributes:attributeDict range:NSMakeRange(1, 1)];
683 XCTAssertTrue(
684 [object.accessibilityAttributedLabel isEqualToAttributedString:expectedAttributedLabel]);
685
686 NSMutableAttributedString* expectedAttributedValue =
687 [[NSMutableAttributedString alloc] initWithString:NSLocalizedString(@"value", @"test")];
688 attributeDict = @{
689 UIAccessibilitySpeechAttributeSpellOut : @YES,
690 };
691 [expectedAttributedValue setAttributes:attributeDict range:NSMakeRange(2, 1)];
692 XCTAssertTrue(
693 [object.accessibilityAttributedValue isEqualToAttributedString:expectedAttributedValue]);
694
695 NSMutableAttributedString* expectedAttributedHint =
696 [[NSMutableAttributedString alloc] initWithString:NSLocalizedString(@"hint", @"test")];
697 attributeDict = @{
698 UIAccessibilitySpeechAttributeLanguage : @"en-MX",
699 };
700 [expectedAttributedHint setAttributes:attributeDict range:NSMakeRange(3, 1)];
701 XCTAssertTrue(
702 [object.accessibilityAttributedHint isEqualToAttributedString:expectedAttributedHint]);
703}
StringAttributes hintAttributes
StringAttributes valueAttributes
StringAttributes labelAttributes

◆ testSemanticsObjectDeallocated

- (void) testSemanticsObjectDeallocated
implementation

Definition at line 15 of file SemanticsObjectTest.mm.

859 {
862 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
863 SemanticsObject* parent = [[SemanticsObject alloc] initWithBridge:bridge uid:0];
864 SemanticsObject* child = [[SemanticsObject alloc] initWithBridge:bridge uid:1];
865 parent.children = @[ child ];
866 // Validate SemanticsObject deallocation does not crash.
867 // https://github.com/flutter/flutter/issues/66032
868 __weak SemanticsObject* weakObject = parent;
869 parent = nil;
870 XCTAssertNil(weakObject);
871}

◆ testSetChildren

- (void) testSetChildren
implementation

Definition at line 15 of file SemanticsObjectTest.mm.

30 {
33 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
34 SemanticsObject* parent = [[SemanticsObject alloc] initWithBridge:bridge uid:0];
35 SemanticsObject* child = [[SemanticsObject alloc] initWithBridge:bridge uid:1];
36 parent.children = @[ child ];
37 XCTAssertEqual(parent, child.parent);
38 parent.children = @[];
39 XCTAssertNil(child.parent);
40}

◆ testShouldDispatchShowOnScreenActionForHeader

- (void) testShouldDispatchShowOnScreenActionForHeader
implementation

Definition at line 15 of file SemanticsObjectTest.mm.

743 {
747 SemanticsObject* object = [[SemanticsObject alloc] initWithBridge:bridge uid:1];
748
749 // Handle initial setting of node with header.
751 node.flags = static_cast<int32_t>(flutter::SemanticsFlags::kIsHeader);
752 node.label = "foo";
753
754 [object setSemanticsNode:&node];
755
756 // Simulate accessibility focus.
758
759 XCTAssertTrue(bridge->observations.size() == 1);
760 XCTAssertTrue(bridge->observations[0].id == 1);
761 XCTAssertTrue(bridge->observations[0].action == flutter::SemanticsAction::kShowOnScreen);
762}
void accessibilityElementDidBecomeFocused()

◆ testShouldDispatchShowOnScreenActionForHidden

- (void) testShouldDispatchShowOnScreenActionForHidden
implementation

Definition at line 15 of file SemanticsObjectTest.mm.

764 {
768 SemanticsObject* object = [[SemanticsObject alloc] initWithBridge:bridge uid:1];
769
770 // Handle initial setting of node with hidden.
772 node.flags = static_cast<int32_t>(flutter::SemanticsFlags::kIsHidden);
773 node.label = "foo";
774
775 [object setSemanticsNode:&node];
776
777 // Simulate accessibility focus.
779
780 XCTAssertTrue(bridge->observations.size() == 1);
781 XCTAssertTrue(bridge->observations[0].id == 1);
782 XCTAssertTrue(bridge->observations[0].action == flutter::SemanticsAction::kShowOnScreen);
783}

◆ testShouldTriggerAnnouncement

- (void) testShouldTriggerAnnouncement
implementation

Definition at line 15 of file SemanticsObjectTest.mm.

705 {
708 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
709 SemanticsObject* object = [[SemanticsObject alloc] initWithBridge:bridge uid:0];
710
711 // Handle nil with no node set.
712 XCTAssertFalse([object nodeShouldTriggerAnnouncement:nil]);
713
714 // Handle initial setting of node with liveRegion
716 node.flags = static_cast<int32_t>(flutter::SemanticsFlags::kIsLiveRegion);
717 node.label = "foo";
718 XCTAssertTrue([object nodeShouldTriggerAnnouncement:&node]);
719
720 // Handle nil with node set.
721 [object setSemanticsNode:&node];
722 XCTAssertFalse([object nodeShouldTriggerAnnouncement:nil]);
723
724 // Handle new node, still has live region, same label.
725 XCTAssertFalse([object nodeShouldTriggerAnnouncement:&node]);
726
727 // Handle update node with new label, still has live region.
728 flutter::SemanticsNode updatedNode;
729 updatedNode.flags = static_cast<int32_t>(flutter::SemanticsFlags::kIsLiveRegion);
730 updatedNode.label = "bar";
731 XCTAssertTrue([object nodeShouldTriggerAnnouncement:&updatedNode]);
732
733 // Handle dropping the live region flag.
734 updatedNode.flags = 0;
735 XCTAssertFalse([object nodeShouldTriggerAnnouncement:&updatedNode]);
736
737 // Handle adding the flag when the label has not changed.
738 updatedNode.label = "foo";
739 [object setSemanticsNode:&updatedNode];
740 XCTAssertTrue([object nodeShouldTriggerAnnouncement:&node]);
741}

◆ testTextInputSemanticsObject

- (void) testTextInputSemanticsObject
implementation

Definition at line 15 of file SemanticsObjectTest.mm.

1012 {
1015 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
1016
1018 node.label = "foo";
1019 node.flags = static_cast<int32_t>(flutter::SemanticsFlags::kIsTextField) |
1020 static_cast<int32_t>(flutter::SemanticsFlags::kIsReadOnly);
1021 TextInputSemanticsObject* object = [[TextInputSemanticsObject alloc] initWithBridge:bridge uid:0];
1022 [object setSemanticsNode:&node];
1024 XCTAssertEqual([object accessibilityTraits], UIAccessibilityTraitNone);
1025}
void setSemanticsNode:(const flutter::SemanticsNode *node)

◆ testVerticalFlutterScrollableSemanticsObject

- (void) testVerticalFlutterScrollableSemanticsObject
implementation

Definition at line 15 of file SemanticsObjectTest.mm.

289 {
292 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
293
294 float transformScale = 0.5f;
295 float screenScale = [[bridge->view() window] screen].scale;
296 float effectivelyScale = transformScale / screenScale;
297 float x = 10;
298 float y = 10;
299 float w = 100;
300 float h = 200;
301 float scrollExtentMax = 500.0;
302 float scrollPosition = 150.0;
303
305 node.flags = static_cast<int32_t>(flutter::SemanticsFlags::kHasImplicitScrolling);
307 node.rect = SkRect::MakeXYWH(x, y, w, h);
308 node.scrollExtentMax = scrollExtentMax;
309 node.scrollPosition = scrollPosition;
310 node.transform = {
311 transformScale, 0, 0, 0, 0, transformScale, 0, 0, 0, 0, transformScale, 0, 0, 0, 0, 1.0};
313 [[FlutterScrollableSemanticsObject alloc] initWithBridge:bridge uid:0];
314 [scrollable setSemanticsNode:&node];
316 UIScrollView* scrollView = [scrollable nativeAccessibility];
317 XCTAssertTrue(
318 CGRectEqualToRect(scrollView.frame, CGRectMake(x * effectivelyScale, y * effectivelyScale,
319 w * effectivelyScale, h * effectivelyScale)));
320 XCTAssertTrue(CGSizeEqualToSize(
321 scrollView.contentSize,
322 CGSizeMake(w * effectivelyScale, (h + scrollExtentMax) * effectivelyScale)));
323 XCTAssertTrue(CGPointEqualToPoint(scrollView.contentOffset,
324 CGPointMake(0, scrollPosition * effectivelyScale)));
325}

◆ testVerticalFlutterScrollableSemanticsObjectNoWindowDoesNotCrash

- (void) testVerticalFlutterScrollableSemanticsObjectNoWindowDoesNotCrash
implementation

Definition at line 15 of file SemanticsObjectTest.mm.

327 {
330 fml::WeakPtr<flutter::AccessibilityBridgeIos> bridge = factory.GetWeakPtr();
331
332 float transformScale = 0.5f;
333 float x = 10;
334 float y = 10;
335 float w = 100;
336 float h = 200;
337 float scrollExtentMax = 500.0;
338 float scrollPosition = 150.0;
339
341 node.flags = static_cast<int32_t>(flutter::SemanticsFlags::kHasImplicitScrolling);
343 node.rect = SkRect::MakeXYWH(x, y, w, h);
344 node.scrollExtentMax = scrollExtentMax;
345 node.scrollPosition = scrollPosition;
346 node.transform = {
347 transformScale, 0, 0, 0, 0, transformScale, 0, 0, 0, 0, transformScale, 0, 0, 0, 0, 1.0};
349 [[FlutterScrollableSemanticsObject alloc] initWithBridge:bridge uid:0];
350 [scrollable setSemanticsNode:&node];
352 XCTAssertNoThrow([scrollable accessibilityBridgeDidFinishUpdate]);
353}

The documentation for this class was generated from the following file: