|
5 | 5 | * LICENSE file in the root directory of this source tree. |
6 | 6 | */ |
7 | 7 |
|
| 8 | +#import <UIKit/UIKit.h> |
8 | 9 | #import <XCTest/XCTest.h> |
9 | 10 |
|
10 | 11 | #import <React/RCTAccessibilityManager.h> |
11 | 12 | #import <React/RCTBridgeModule.h> |
12 | 13 |
|
13 | | -extern BOOL RCTAccessibilityManagerSetPreferences( |
14 | | - RCTAccessibilityManager *accessibilityManager, |
15 | | - NSDictionary<NSString *, NSNumber *> *preferences); |
16 | | -extern double RCTRecommendedTimeoutMillis(double originalTimeout, BOOL isSwitchControlRunning); |
| 14 | +// From RCTAccessibilityManager+Internal.h. |
| 15 | +typedef NSDictionary<NSString *, NSNumber *> * (^RCTAccessibilityPreferencesReader)(void); |
| 16 | +typedef BOOL (^RCTSwitchControlReader)(void); |
| 17 | +extern void RCTAccessibilityManagerSetSystemReaders( |
| 18 | + RCTAccessibilityPreferencesReader preferencesReader, |
| 19 | + RCTSwitchControlReader switchControlReader); |
| 20 | + |
| 21 | +// The native module methods JS calls, from the generated spec. |
| 22 | +@interface RCTAccessibilityManager (RCTAccessibilityManagerTests) |
| 23 | + |
| 24 | +- (void)getCurrentPreferences:(RCTResponseSenderBlock)onSuccess onError:(RCTResponseSenderBlock)onError; |
| 25 | +- (void)getRecommendedTimeoutMillis:(double)mSec onSuccess:(RCTResponseSenderBlock)onSuccess; |
| 26 | + |
| 27 | +@end |
17 | 28 |
|
18 | 29 | // Records the device events the module sends. |
19 | 30 | @interface RCTAccessibilityManagerTestsEventDispatcher : NSObject |
@@ -65,48 +76,108 @@ @implementation RCTAccessibilityManagerTests { |
65 | 76 | RCTAccessibilityManagerTestsEventDispatcher *_eventDispatcher; |
66 | 77 | // The module holds its registry weakly. |
67 | 78 | RCTAccessibilityManagerTestsModuleRegistry *_moduleRegistry; |
| 79 | + NSDictionary<NSString *, NSNumber *> *_systemPreferences; |
| 80 | + BOOL _isSwitchControlRunning; |
68 | 81 | } |
69 | 82 |
|
70 | 83 | - (void)setUp |
71 | 84 | { |
72 | 85 | [super setUp]; |
| 86 | + _systemPreferences = @{@"prefersSwitchLabels" : @NO, @"prefersNonColorIndicators" : @NO}; |
| 87 | + _isSwitchControlRunning = NO; |
| 88 | + __weak RCTAccessibilityManagerTests *weakSelf = self; |
| 89 | + RCTAccessibilityManagerSetSystemReaders( |
| 90 | + ^NSDictionary<NSString *, NSNumber *> * { |
| 91 | + RCTAccessibilityManagerTests *strongSelf = weakSelf; |
| 92 | + return strongSelf ? strongSelf->_systemPreferences : @{}; |
| 93 | + }, |
| 94 | + ^BOOL { |
| 95 | + RCTAccessibilityManagerTests *strongSelf = weakSelf; |
| 96 | + return strongSelf ? strongSelf->_isSwitchControlRunning : NO; |
| 97 | + }); |
| 98 | + |
73 | 99 | _eventDispatcher = [RCTAccessibilityManagerTestsEventDispatcher new]; |
74 | 100 | _moduleRegistry = [RCTAccessibilityManagerTestsModuleRegistry new]; |
75 | 101 | _moduleRegistry.eventDispatcher = _eventDispatcher; |
76 | 102 | _manager = [RCTAccessibilityManager new]; |
77 | 103 | _manager.moduleRegistry = _moduleRegistry; |
78 | 104 | } |
79 | 105 |
|
80 | | -- (void)testRecommendedTimeoutIsLongerWhileSwitchControlIsRunning |
| 106 | +- (void)tearDown |
81 | 107 | { |
82 | | - XCTAssertEqual(RCTRecommendedTimeoutMillis(4000, YES), 12000); |
83 | | - XCTAssertEqual(RCTRecommendedTimeoutMillis(4000, NO), 4000); |
84 | | - XCTAssertEqual(RCTRecommendedTimeoutMillis(0, YES), 0); |
| 108 | + RCTAccessibilityManagerSetSystemReaders(nil, nil); |
| 109 | + _manager = nil; |
| 110 | + [super tearDown]; |
85 | 111 | } |
86 | 112 |
|
87 | | -- (void)testUnchangedPreferencesSendNoEvent |
| 113 | +- (NSDictionary *)currentPreferences |
88 | 114 | { |
89 | | - NSDictionary *preferences = @{@"prefersSwitchLabels" : @YES, @"prefersNonColorIndicators" : @NO}; |
| 115 | + __block NSDictionary *preferences = nil; |
| 116 | + [_manager |
| 117 | + getCurrentPreferences:^(NSArray *response) { |
| 118 | + preferences = response.firstObject; |
| 119 | + } |
| 120 | + onError:^(__unused NSArray *response) { |
| 121 | + XCTFail(@"getCurrentPreferences failed"); |
| 122 | + }]; |
| 123 | + return preferences; |
| 124 | +} |
90 | 125 |
|
91 | | - RCTAccessibilityManagerSetPreferences(_manager, preferences); |
92 | | - [_eventDispatcher.events removeAllObjects]; |
93 | | - BOOL sent = RCTAccessibilityManagerSetPreferences(_manager, [preferences copy]); |
| 126 | +- (NSNumber *)recommendedTimeoutFor:(double)mSec |
| 127 | +{ |
| 128 | + __block NSNumber *timeout = nil; |
| 129 | + [_manager getRecommendedTimeoutMillis:mSec |
| 130 | + onSuccess:^(NSArray *response) { |
| 131 | + timeout = response.firstObject; |
| 132 | + }]; |
| 133 | + return timeout; |
| 134 | +} |
94 | 135 |
|
95 | | - XCTAssertFalse(sent); |
96 | | - XCTAssertEqual(_eventDispatcher.events.count, 0); |
| 136 | +- (void)testGetCurrentPreferencesReturnsTheSettingsAtStartup |
| 137 | +{ |
| 138 | + XCTAssertEqualObjects( |
| 139 | + [self currentPreferences], (@{@"prefersSwitchLabels" : @NO, @"prefersNonColorIndicators" : @NO})); |
| 140 | +} |
| 141 | + |
| 142 | +- (void)testOnOffSwitchLabelsChangeSendsTheWholeSnapshot |
| 143 | +{ |
| 144 | + _systemPreferences = @{@"prefersSwitchLabels" : @YES, @"prefersNonColorIndicators" : @NO}; |
| 145 | + [[NSNotificationCenter defaultCenter] postNotificationName:UIAccessibilityOnOffSwitchLabelsDidChangeNotification |
| 146 | + object:nil]; |
| 147 | + |
| 148 | + XCTAssertEqualObjects(_eventDispatcher.events, (@[ @[ @"preferencesChanged", _systemPreferences ] ])); |
| 149 | + XCTAssertEqualObjects([self currentPreferences], _systemPreferences); |
| 150 | +} |
| 151 | + |
| 152 | +- (void)testDifferentiateWithoutColorChangeSendsTheWholeSnapshot |
| 153 | +{ |
| 154 | + _systemPreferences = @{@"prefersSwitchLabels" : @NO, @"prefersNonColorIndicators" : @YES}; |
| 155 | + [[NSNotificationCenter defaultCenter] |
| 156 | + postNotificationName:UIAccessibilityShouldDifferentiateWithoutColorDidChangeNotification |
| 157 | + object:nil]; |
| 158 | + |
| 159 | + XCTAssertEqualObjects(_eventDispatcher.events, (@[ @[ @"preferencesChanged", _systemPreferences ] ])); |
| 160 | + XCTAssertEqualObjects([self currentPreferences], _systemPreferences); |
97 | 161 | } |
98 | 162 |
|
99 | | -- (void)testChangedPreferencesSendTheWholeSnapshot |
| 163 | +- (void)testNotificationWithoutAChangeSendsNoEvent |
100 | 164 | { |
101 | | - RCTAccessibilityManagerSetPreferences(_manager, @{@"prefersSwitchLabels" : @NO, @"prefersNonColorIndicators" : @NO}); |
102 | | - [_eventDispatcher.events removeAllObjects]; |
| 165 | + [[NSNotificationCenter defaultCenter] postNotificationName:UIAccessibilityOnOffSwitchLabelsDidChangeNotification |
| 166 | + object:nil]; |
| 167 | + [[NSNotificationCenter defaultCenter] |
| 168 | + postNotificationName:UIAccessibilityShouldDifferentiateWithoutColorDidChangeNotification |
| 169 | + object:nil]; |
| 170 | + |
| 171 | + XCTAssertEqual(_eventDispatcher.events.count, 0); |
| 172 | +} |
103 | 173 |
|
104 | | - NSDictionary *changed = @{@"prefersSwitchLabels" : @NO, @"prefersNonColorIndicators" : @YES}; |
105 | | - BOOL sent = RCTAccessibilityManagerSetPreferences(_manager, changed); |
| 174 | +- (void)testRecommendedTimeoutIsLongerWhileSwitchControlIsRunning |
| 175 | +{ |
| 176 | + XCTAssertEqualObjects([self recommendedTimeoutFor:4000], @4000); |
106 | 177 |
|
107 | | - XCTAssertTrue(sent); |
108 | | - XCTAssertEqual(_eventDispatcher.events.count, 1); |
109 | | - XCTAssertEqualObjects(_eventDispatcher.events.firstObject, (@[ @"preferencesChanged", changed ])); |
| 178 | + _isSwitchControlRunning = YES; |
| 179 | + XCTAssertEqualObjects([self recommendedTimeoutFor:4000], @12000); |
| 180 | + XCTAssertEqualObjects([self recommendedTimeoutFor:0], @0); |
110 | 181 | } |
111 | 182 |
|
112 | 183 | @end |
0 commit comments