5#import <OCMock/OCMock.h>
6#import <XCTest/XCTest.h>
8#import "flutter/shell/platform/darwin/common/framework/Headers/FlutterMacros.h"
9#import "flutter/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h"
10#import "flutter/shell/platform/darwin/ios/framework/Source/FlutterTouchInterceptingView_Test.h"
11#import "flutter/shell/platform/darwin/ios/framework/Source/SemanticsObject.h"
12#import "flutter/shell/platform/darwin/ios/framework/Source/SemanticsObjectTestMocks.h"
13#import "flutter/shell/platform/darwin/ios/framework/Source/accessibility_text_entry.h"
27 XCTAssertNotNil(
object);
37 XCTAssertEqual(parent, child.
parent);
39 XCTAssertNil(child.
parent);
52 object1.
children = @[ object2, object3 ];
79 CGPoint point = CGPointMake(10, 10);
83 XCTAssertEqual(hitTestResult, object2);
96 object1.
children = @[ object2, object3 ];
119 CGPoint point = CGPointMake(10, 10);
122 XCTAssertNil(hitTestResult);
138 XCTAssertTrue(bridge->observations.size() == 1);
139 XCTAssertTrue(bridge->observations[0].id == 3);
156 XCTAssertTrue(bridge->observations.size() == 1);
157 XCTAssertTrue(bridge->observations[0].id == 3);
171 object1.
children = @[ object2, object3 ];
198 CGPoint point = CGPointMake(300, 300);
201 XCTAssertNil(hitTestResult);
213 XCTAssertNil(child1.
parent);
214 XCTAssertEqual(parent, child2.
parent);
215 XCTAssertEqualObjects(parent.
children, @[ child2 ]);
226 XCTAssertEqual([
object accessibilityTraits], UIAccessibilityTraitStaticText);
238 XCTAssertEqual(
object.isAccessibilityElement, YES);
249 XCTAssertEqual(
object.isAccessibilityElement, NO);
262 XCTAssertEqual([
object accessibilityTraits], UIAccessibilityTraitNone);
274 XCTAssertEqual([
object accessibilityTraits], UIAccessibilityTraitNone);
286 XCTAssertEqual([
object accessibilityTraits], UIAccessibilityTraitButton);
294 float transformScale = 0.5f;
295 float screenScale = [[bridge->view() window] screen].scale;
296 float effectivelyScale = transformScale / screenScale;
301 float scrollExtentMax = 500.0;
302 float scrollPosition = 150.0;
311 transformScale, 0, 0, 0, 0, transformScale, 0, 0, 0, 0, transformScale, 0, 0, 0, 0, 1.0};
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)));
332 float transformScale = 0.5f;
337 float scrollExtentMax = 500.0;
338 float scrollPosition = 150.0;
347 transformScale, 0, 0, 0, 0, transformScale, 0, 0, 0, 0, transformScale, 0, 0, 0, 0, 1.0};
352 XCTAssertNoThrow([scrollable accessibilityBridgeDidFinishUpdate]);
360 float transformScale = 0.5f;
361 float screenScale = [[bridge->view() window] screen].scale;
362 float effectivelyScale = transformScale / screenScale;
367 float scrollExtentMax = 500.0;
368 float scrollPosition = 150.0;
377 transformScale, 0, 0, 0, 0, transformScale, 0, 0, 0, 0, transformScale, 0, 0, 0, 0, 1.0};
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)));
398 float transformScale = 0.5f;
399 float screenScale = [[bridge->view() window] screen].scale;
400 float effectivelyScale = transformScale / screenScale;
405 float scrollExtentMax = INFINITY;
406 float scrollPosition = 150.0;
415 transformScale, 0, 0, 0, 0, transformScale, 0, 0, 0, 0, transformScale, 0, 0, 0, 0, 1.0};
422 CGRectEqualToRect(scrollView.frame, CGRectMake(
x * effectivelyScale,
y * effectivelyScale,
423 w * effectivelyScale,
h * effectivelyScale)));
424 XCTAssertTrue(CGSizeEqualToSize(
425 scrollView.contentSize,
426 CGSizeMake(
w * effectivelyScale,
428 XCTAssertTrue(CGPointEqualToPoint(scrollView.contentOffset,
429 CGPointMake(0, scrollPosition * effectivelyScale)));
437 float transformScale = 0.5f;
438 float screenScale = [[bridge->view() window] screen].scale;
439 float effectivelyScale = transformScale / screenScale;
444 float scrollExtentMax = std::nan(
"");
445 float scrollPosition = std::nan(
"");
454 transformScale, 0, 0, 0, 0, transformScale, 0, 0, 0, 0, transformScale, 0, 0, 0, 0, 1.0};
461 CGRectEqualToRect(scrollView.frame, CGRectMake(
x * effectivelyScale,
y * effectivelyScale,
462 w * effectivelyScale,
h * effectivelyScale)));
464 XCTAssertTrue(CGSizeEqualToSize(scrollView.contentSize,
465 CGSizeMake(
w * effectivelyScale,
h * effectivelyScale)));
466 XCTAssertTrue(CGPointEqualToPoint(scrollView.contentOffset, CGPointMake(0, 0)));
486 XCTAssertEqual([scrollView hitTest:CGPointMake(10, 10) withEvent:nil], nil);
507 XCTAssertTrue(scrollView.isAccessibilityElement);
509 XCTAssertFalse(scrollView.isAccessibilityElement);
523 XCTAssertTrue([
object.accessibilityIdentifier isEqualToString:
@"identifier"]);
536 node.
label =
"label";
537 node.
value =
"value";
547 XCTAssertTrue(scrollView.isAccessibilityElement);
549 [scrollView.accessibilityLabel isEqualToString:NSLocalizedString(
@"label",
@"test")]);
551 [scrollView.accessibilityValue isEqualToString:NSLocalizedString(
@"value",
@"test")]);
552 XCTAssertTrue([scrollView.accessibilityHint isEqualToString:NSLocalizedString(
@"hint",
@"test")]);
563 node.
label =
"label";
567 XCTAssertTrue(
object.isAccessibilityElement);
568 XCTAssertTrue([
object.accessibilityLabel isEqualToString:
@"label\ntooltip"]);
581 XCTAssertTrue(
object.accessibilityAttributedLabel == nil);
593 parent.
label =
"label";
594 parent.
value =
"value";
595 parent.
hint =
"hint";
602 node.
label =
"label";
603 node.
value =
"value";
618 parentObject.
children = @[ scrollable ];
621 XCTAssertTrue(scrollView.isAccessibilityElement);
645 XCTAssertFalse(scrollView.showsHorizontalScrollIndicator);
646 XCTAssertFalse(scrollView.showsVerticalScrollIndicator);
654 node.
label =
"label";
655 std::shared_ptr<flutter::SpellOutStringAttribute> attribute =
656 std::make_shared<flutter::SpellOutStringAttribute>();
657 attribute->start = 1;
661 node.
value =
"value";
662 attribute = std::make_shared<flutter::SpellOutStringAttribute>();
663 attribute->start = 2;
668 std::shared_ptr<flutter::LocaleStringAttribute> local_attribute =
669 std::make_shared<flutter::LocaleStringAttribute>();
670 local_attribute->start = 3;
671 local_attribute->end = 4;
673 local_attribute->locale =
"en-MX";
677 NSMutableAttributedString* expectedAttributedLabel =
678 [[NSMutableAttributedString alloc] initWithString:NSLocalizedString(@"label", @"test")];
679 NSDictionary* attributeDict = @{
680 UIAccessibilitySpeechAttributeSpellOut : @YES,
682 [expectedAttributedLabel setAttributes:attributeDict range:NSMakeRange(1, 1)];
684 [
object.accessibilityAttributedLabel isEqualToAttributedString:expectedAttributedLabel]);
686 NSMutableAttributedString* expectedAttributedValue =
687 [[NSMutableAttributedString alloc] initWithString:NSLocalizedString(@"value", @"test")];
689 UIAccessibilitySpeechAttributeSpellOut : @YES,
691 [expectedAttributedValue setAttributes:attributeDict range:NSMakeRange(2, 1)];
693 [
object.accessibilityAttributedValue isEqualToAttributedString:expectedAttributedValue]);
695 NSMutableAttributedString* expectedAttributedHint =
696 [[NSMutableAttributedString alloc] initWithString:NSLocalizedString(@"hint", @"test")];
698 UIAccessibilitySpeechAttributeLanguage :
@"en-MX",
700 [expectedAttributedHint setAttributes:attributeDict range:NSMakeRange(3, 1)];
702 [
object.accessibilityAttributedHint isEqualToAttributedString:expectedAttributedHint]);
712 XCTAssertFalse([
object nodeShouldTriggerAnnouncement:nil]);
718 XCTAssertTrue([
object nodeShouldTriggerAnnouncement:&node]);
722 XCTAssertFalse([
object nodeShouldTriggerAnnouncement:nil]);
725 XCTAssertFalse([
object nodeShouldTriggerAnnouncement:&node]);
730 updatedNode.label =
"bar";
731 XCTAssertTrue([
object nodeShouldTriggerAnnouncement:&updatedNode]);
734 updatedNode.flags = 0;
735 XCTAssertFalse([
object nodeShouldTriggerAnnouncement:&updatedNode]);
738 updatedNode.label =
"foo";
740 XCTAssertTrue([
object nodeShouldTriggerAnnouncement:&node]);
759 XCTAssertTrue(bridge->observations.size() == 1);
760 XCTAssertTrue(bridge->observations[0].id == 1);
780 XCTAssertTrue(bridge->observations.size() == 1);
781 XCTAssertTrue(bridge->observations[0].id == 1);
800 UISwitch* nativeSwitch = [[UISwitch alloc] init];
801 nativeSwitch.on = YES;
803 XCTAssertEqual(
object.accessibilityTraits, nativeSwitch.accessibilityTraits);
804 XCTAssertEqualObjects(
object.accessibilityValue, nativeSwitch.accessibilityValue);
813 nativeSwitch.on = NO;
815 XCTAssertEqual(
object.accessibilityTraits, nativeSwitch.accessibilityTraits);
816 XCTAssertEqualObjects(
object.accessibilityValue, nativeSwitch.accessibilityValue);
833 XCTAssertTrue((
object.accessibilityTraits & UIAccessibilityTraitButton) > 0);
834 XCTAssertNil(
object.accessibilityValue);
851 UISwitch* nativeSwitch = [[UISwitch alloc] init];
852 nativeSwitch.on = YES;
853 nativeSwitch.enabled = NO;
855 XCTAssertEqual(
object.accessibilityTraits, nativeSwitch.accessibilityTraits);
856 XCTAssertEqualObjects(
object.accessibilityValue, nativeSwitch.accessibilityValue);
870 XCTAssertNil(weakObject);
881 parent.
label =
"label";
882 parent.
value =
"value";
883 parent.
hint =
"hint";
890 node.
label =
"label";
891 node.
value =
"value";
900 node2.
label =
"label";
901 node2.
value =
"value";
924 parentObject.
children = @[ scrollable, object2 ];
955 platformView:platformView];
959 object1.
children = @[ platformViewSemanticsContainer, object3 ];
986 CGPoint point = CGPointMake(10, 10);
989 XCTAssertEqual(hitTestResult, platformView);
999 weakPlatformView = platformView;
1003 platformView:platformView];
1005 XCTAssertNotNil(weakPlatformView);
1009 XCTAssertNil(weakPlatformView);
1024 XCTAssertEqual([
object accessibilityTraits], UIAccessibilityTraitNone);
constexpr float kScrollExtentMaxForInf
id accessibilityContainer()
bool isVoiceOverRunningValue
WeakPtr< T > GetWeakPtr() const
SemanticsObject * semanticsObject
void testAccessibilityHitTestOutOfRect()
void testSemanticsObjectDeallocated()
void testCanHandleNaNScrollExtentAndScrollPoisition()
void testVerticalFlutterScrollableSemanticsObject()
void testNodeWithImplicitScrollIsNotAnAccessibilityElementWhenItisNotHidden()
void testReplaceChildAtIndex()
void testFlutterPlatformViewSemanticsContainer()
void testAccessibilityScrollToVisible()
void testVerticalFlutterScrollableSemanticsObjectNoWindowDoesNotCrash()
void testShouldDispatchShowOnScreenActionForHeader()
void testTextInputSemanticsObject()
void testFlutterSemanticsObjectMergeTooltipToLabel()
void testFlutterScrollableSemanticsObjectHidesScrollBar()
void testFlutterSemanticsObjectReturnsNilContainerWhenBridgeIsNotAlive()
void testCanHandleInfiniteScrollExtent()
void testNodeWithImplicitScrollIsAnAccessibilityElementWhenItisHidden()
void testHorizontalFlutterScrollableSemanticsObject()
void testFlutterSwitchSemanticsObjectMatchesUISwitchDisabled()
void testPlainSemanticsObjectWithLabelHasStaticTextTrait()
void testFlutterScrollableSemanticsObjectIsHiddenWhenVoiceOverIsRunning()
void testSemanticsObjectBuildsAttributedString()
void testAccessibilityScrollToVisibleWithChild()
void testFlutterScrollableSemanticsObjectReturnsParentContainerIfNoChildren()
void testAccessibilityHitTestSearchCanReturnPlatformView()
void testFlutterSwitchSemanticsObjectMatchesUISwitch()
void testFlutterSemanticsObjectAttributedStringsDoNotCrashWhenEmpty()
void testShouldDispatchShowOnScreenActionForHidden()
void testFlutterSemanticsObjectHasIdentifier()
void testFlutterSemanticsObjectOfRadioButton()
void testIntresetingSemanticsObjectWithLabelHasStaticTextTrait()
void testShouldTriggerAnnouncement()
void testIntresetingSemanticsObjectWithLabelHasStaticTextTrait1()
void testIntresetingSemanticsObjectWithLabelHasStaticTextTrait2()
void testFlutterScrollableSemanticsObjectWithLabelValueHintIsNotHiddenWhenVoiceOverIsRunning()
void testFlutterScrollableSemanticsObjectIsNotHittestable()
void testAccessibilityHitTestFocusAtLeaf()
void testAccessibilityHitTestNoFocusableItem()
id _accessibilityHitTest:withEvent:(CGPoint point, [withEvent] UIEvent *event)
void accessibilityElementDidBecomeFocused()
NSArray< SemanticsObject * > * childrenInHitTestOrder
BOOL accessibilityScrollToVisibleWithChild:(id child)
BOOL accessibilityScrollToVisible()
void accessibilityBridgeDidFinishUpdate()
id accessibilityContainer()
NSArray< SemanticsObject * > * children
void replaceChildAtIndex:withChild:(NSInteger index,[withChild] SemanticsObject *child)
void setSemanticsNode:(const flutter::SemanticsNode *NS_REQUIRES_SUPER)
void setSemanticsNode:(const flutter::SemanticsNode *node)
@ kIsInMutuallyExclusiveGroup
const int kHorizontalScrollSemanticsActions
const int kVerticalScrollSemanticsActions
static constexpr SkRect MakeXYWH(float x, float y, float w, float h)
StringAttributes hintAttributes
StringAttributes valueAttributes
StringAttributes labelAttributes
std::vector< int32_t > childrenInTraversalOrder