@@ -10,13 +10,16 @@ class AccessibilityContainerTests: XCTestCase {
10
10
let viewA = UIView ( )
11
11
let viewB = UIView ( )
12
12
13
+ viewA. isAccessibilityElement = true
14
+ viewB. isAccessibilityElement = true
15
+
13
16
let innerContainerView = UIView ( )
14
17
innerContainerView. accessibilityElements = [ viewA, viewB]
15
18
16
19
let outerContainerView = UIView ( )
17
20
outerContainerView. addSubview ( innerContainerView)
18
21
19
- let accessibleSubviews = outerContainerView. recursiveAccessibleSubviews ( ) as! [ UIView ]
22
+ let accessibleSubviews = outerContainerView. accessibilityElements ( layoutDirection : . leftToRight ) as! [ UIView ]
20
23
21
24
XCTAssertEqual ( accessibleSubviews. count, 2 )
22
25
XCTAssertTrue ( accessibleSubviews. contains ( where: { $0 === viewA } ) )
@@ -34,58 +37,88 @@ class AccessibilityContainerTests: XCTestCase {
34
37
let containerView = UIView ( )
35
38
containerView. addSubview ( wrapperView)
36
39
37
- let accessibleSubviews = containerView. recursiveAccessibleSubviews ( ) as! [ UIView ]
40
+ let accessibleSubviews = containerView. accessibilityElements ( layoutDirection : . leftToRight ) as! [ UIView ]
38
41
39
42
XCTAssertEqual ( accessibleSubviews [ 0 ] , accessibleView)
40
43
}
41
44
42
- func test_accessibilityElementsAndContainedViewsAreFound( ) {
45
+ func test_searchIsTerminatedAtAccessibleViewButContinuesIntoNonAccessibleContainerElements( ) {
46
+ let deeplyNestedAccessible = UIView ( )
47
+ deeplyNestedAccessible. isAccessibilityElement = true
43
48
44
- let viewA = UIView ( )
49
+ let nonAccessibleContainerElement = UIView ( )
50
+ nonAccessibleContainerElement. addSubview ( deeplyNestedAccessible)
51
+
52
+ let undiscoveredViewB = UIView ( )
53
+ undiscoveredViewB. isAccessibilityElement = true
45
54
46
55
let innerContainerView = UIView ( )
47
- innerContainerView. accessibilityElements = [ viewA]
56
+ // This container has a non-accessible UIView element that should be recursively processed
57
+ innerContainerView. accessibilityElements = [ nonAccessibleContainerElement]
48
58
49
59
let accessibleView = UIView ( )
50
60
accessibleView. isAccessibilityElement = true
61
+ // This accessible view's children should not be discovered since search stops at accessibility elements
62
+ accessibleView. addSubview ( undiscoveredViewB)
51
63
52
64
let outerContainerView = UIView ( )
53
65
outerContainerView. addSubview ( accessibleView)
54
66
outerContainerView. addSubview ( innerContainerView)
55
67
56
- let accessibleSubviews = outerContainerView. recursiveAccessibleSubviews ( ) as! [ UIView ]
68
+ let accessibleSubviews = outerContainerView. accessibilityElements ( layoutDirection : . leftToRight ) as! [ UIView ]
57
69
58
70
XCTAssertEqual ( accessibleSubviews. count, 2 )
59
- XCTAssertTrue ( accessibleSubviews. contains ( where: { $0 === viewA } ) )
71
+ // Should find the deeply nested accessible view through recursive processing
72
+ XCTAssertTrue ( accessibleSubviews. contains ( where: { $0 === deeplyNestedAccessible } ) )
60
73
XCTAssertTrue ( accessibleSubviews. contains ( where: { $0 === accessibleView } ) )
74
+ // Should NOT find this because search stops at accessible views
75
+ XCTAssertFalse ( accessibleSubviews. contains ( where: { $0 === undiscoveredViewB } ) )
61
76
}
62
77
63
- func test_searchIsTerminatedAtContainerOrAccessibleView( ) {
64
- let undiscoveredViewA = UIView ( )
65
- undiscoveredViewA. isAccessibilityElement = true
78
+ func test_recursiveProcessingOfAccessibilityElementsUIViews( ) {
79
+ // Create a hierarchy where accessibilityElements contains UIViews that need further processing
80
+ let finalAccessibleView = UIView ( )
81
+ finalAccessibleView. isAccessibilityElement = true
66
82
67
- let undiscoveredViewB = UIView ( )
68
- undiscoveredViewB . isAccessibilityElement = true
83
+ let intermediateContainer = UIView ( )
84
+ intermediateContainer . addSubview ( finalAccessibleView )
69
85
70
- let viewA = UIView ( )
86
+ let parentContainer = UIView ( )
87
+ // The accessibility elements list contains a UIView that is not an accessibility element itself
88
+ // but contains accessible elements within it
89
+ parentContainer. accessibilityElements = [ intermediateContainer]
71
90
72
- let innerContainerView = UIView ( )
73
- innerContainerView. accessibilityElements = [ viewA]
74
- innerContainerView. addSubview ( undiscoveredViewA)
91
+ let rootContainer = UIView ( )
92
+ rootContainer. addSubview ( parentContainer)
75
93
76
- let accessibleView = UIView ( )
77
- accessibleView. isAccessibilityElement = true
78
- accessibleView. addSubview ( undiscoveredViewB)
94
+ let accessibleSubviews = rootContainer. accessibilityElements ( layoutDirection: . leftToRight) as! [ UIView ]
79
95
80
- let outerContainerView = UIView ( )
81
- outerContainerView . addSubview ( accessibleView )
82
- outerContainerView . addSubview ( innerContainerView )
96
+ XCTAssertEqual ( accessibleSubviews . count , 1 )
97
+ XCTAssertTrue ( accessibleSubviews . contains ( where : { $0 === finalAccessibleView } ) )
98
+ }
83
99
84
- let accessibleSubviews = outerContainerView. recursiveAccessibleSubviews ( ) as! [ UIView ]
100
+ func test_mixedAccessibilityElementsWithAccessibleAndNonAccessibleUIViews( ) {
101
+ let directAccessibleView = UIView ( )
102
+ directAccessibleView. isAccessibilityElement = true
103
+
104
+ let deeplyNestedAccessible = UIView ( )
105
+ deeplyNestedAccessible. isAccessibilityElement = true
106
+
107
+ let nonAccessibleContainer = UIView ( )
108
+ nonAccessibleContainer. addSubview ( deeplyNestedAccessible)
109
+
110
+ let parentContainer = UIView ( )
111
+ // Mix of directly accessible UIView and UIView that needs recursive processing
112
+ parentContainer. accessibilityElements = [ directAccessibleView, nonAccessibleContainer]
113
+
114
+ let rootContainer = UIView ( )
115
+ rootContainer. addSubview ( parentContainer)
116
+
117
+ let accessibleSubviews = rootContainer. accessibilityElements ( layoutDirection: . leftToRight) as! [ UIView ]
85
118
86
119
XCTAssertEqual ( accessibleSubviews. count, 2 )
87
- XCTAssertFalse ( accessibleSubviews. contains ( where: { $0 === undiscoveredViewA } ) )
88
- XCTAssertFalse ( accessibleSubviews. contains ( where: { $0 === undiscoveredViewB } ) )
120
+ XCTAssertTrue ( accessibleSubviews. contains ( where: { $0 === directAccessibleView } ) )
121
+ XCTAssertTrue ( accessibleSubviews. contains ( where: { $0 === deeplyNestedAccessible } ) )
89
122
}
90
123
91
124
func test_accessibilityElementHiddenNotAccessible( ) {
@@ -100,7 +133,7 @@ class AccessibilityContainerTests: XCTestCase {
100
133
let containerView = UIView ( )
101
134
containerView. addSubview ( wrapperView)
102
135
103
- let accessibleSubviews = containerView. recursiveAccessibleSubviews ( ) as! [ UIView ]
136
+ let accessibleSubviews = containerView. accessibilityElements ( layoutDirection : . leftToRight ) as! [ UIView ]
104
137
105
138
XCTAssertNil ( accessibleSubviews. first)
106
139
}
@@ -117,7 +150,7 @@ class AccessibilityContainerTests: XCTestCase {
117
150
let containerView = UIView ( )
118
151
containerView. addSubview ( wrapperView)
119
152
120
- let accessibleSubviews = containerView. recursiveAccessibleSubviews ( ) as! [ UIView ]
153
+ let accessibleSubviews = containerView. accessibilityElements ( layoutDirection : . leftToRight ) as! [ UIView ]
121
154
122
155
XCTAssertNil ( accessibleSubviews. first)
123
156
}
0 commit comments