@@ -100,3 +100,117 @@ class CLGeocoderTests: XCTestCase {
100100}
101101
102102private let dummyPlacemark = CLPlacemark ( )
103+
104+ //////////////////////////////////////////////////////////// Cancellation
105+
106+ extension CLGeocoderTests {
107+ func testCancel_reverseGeocodeLocation( ) {
108+ class MockGeocoder : CLGeocoder {
109+ override func reverseGeocodeLocation( _ location: CLLocation , completionHandler: @escaping CLGeocodeCompletionHandler ) {
110+ after ( . milliseconds( 100 ) ) . done {
111+ completionHandler ( [ dummyPlacemark] , nil )
112+ }
113+ }
114+ }
115+
116+ let ex = expectation ( description: " " )
117+ cancellable ( MockGeocoder ( ) . reverseGeocode ( location: CLLocation ( ) ) ) . done { _ in
118+ XCTFail ( " not cancelled " )
119+ } . catch ( policy: . allErrors) { error in
120+ error. isCancelled ? ex. fulfill ( ) : XCTFail ( " error \( error) " )
121+ } . cancel ( )
122+
123+ waitForExpectations ( timeout: 1 )
124+ }
125+
126+ func testCancel_geocodeAddressDictionary( ) {
127+ class MockGeocoder : CLGeocoder {
128+ override func geocodeAddressDictionary( _ addressDictionary: [ AnyHashable : Any ] , completionHandler: @escaping CLGeocodeCompletionHandler ) {
129+ after ( . milliseconds( 100 ) ) . done {
130+ completionHandler ( [ dummyPlacemark] , nil )
131+ }
132+ }
133+ }
134+
135+ let ex = expectation ( description: " " )
136+ let context = cancellable ( MockGeocoder ( ) . geocode ( [ : ] ) ) . done { _ in
137+ XCTFail ( " not cancelled " )
138+ } . catch ( policy: . allErrors) { error in
139+ error. isCancelled ? ex. fulfill ( ) : XCTFail ( " error \( error) " )
140+ } . cancelContext
141+ after ( . milliseconds( 50 ) ) . done {
142+ context. cancel ( )
143+ }
144+
145+ waitForExpectations ( timeout: 1 )
146+ }
147+
148+ func testCancel_geocodeAddressString( ) {
149+ class MockGeocoder : CLGeocoder {
150+ override func geocodeAddressString( _ addressString: String , completionHandler: @escaping CLGeocodeCompletionHandler ) {
151+ after ( . milliseconds( 100 ) ) . done {
152+ completionHandler ( [ dummyPlacemark] , nil )
153+ }
154+ }
155+ }
156+
157+ let ex = expectation ( description: " " )
158+ let p = cancellable ( MockGeocoder ( ) . geocode ( " " ) ) . done { _ in
159+ XCTFail ( " not cancelled " )
160+ } . catch ( policy: . allErrors) { error in
161+ error. isCancelled ? ex. fulfill ( ) : XCTFail ( " error \( error) " )
162+ }
163+ after ( . milliseconds( 50 ) ) . done {
164+ p. cancel ( )
165+ }
166+ waitForExpectations ( timeout: 1 )
167+ }
168+
169+ #if !os(tvOS) && swift(>=3.2)
170+ func testCancel_geocodePostalAddress( ) {
171+ guard #available( iOS 11 . 0 , OSX 10 . 13 , watchOS 4 . 0 , * ) else { return }
172+
173+ class MockGeocoder : CLGeocoder {
174+ override func geocodePostalAddress( _ postalAddress: CNPostalAddress , completionHandler: @escaping CLGeocodeCompletionHandler ) {
175+ after ( . milliseconds( 100 ) ) . done {
176+ completionHandler ( [ dummyPlacemark] , nil )
177+ }
178+ }
179+ }
180+
181+ let ex = expectation ( description: " " )
182+ let p = cancellable ( MockGeocoder ( ) . geocodePostalAddress ( CNPostalAddress ( ) ) ) . done { _ in
183+ XCTFail ( " not cancelled " )
184+ } . catch ( policy: . allErrors) { error in
185+ error. isCancelled ? ex. fulfill ( ) : XCTFail ( " error \( error) " )
186+ }
187+ after ( . milliseconds( 50 ) ) . done {
188+ p. cancel ( )
189+ }
190+ waitForExpectations ( timeout: 1 )
191+ }
192+
193+ func testCancel_geocodePostalAddressLocale( ) {
194+ guard #available( iOS 11 . 0 , OSX 10 . 13 , watchOS 4 . 0 , * ) else { return }
195+
196+ class MockGeocoder : CLGeocoder {
197+ override func geocodePostalAddress( _ postalAddress: CNPostalAddress , preferredLocale locale: Locale ? , completionHandler: @escaping CLGeocodeCompletionHandler ) {
198+ after ( . milliseconds( 100 ) ) . done {
199+ completionHandler ( [ dummyPlacemark] , nil )
200+ }
201+ }
202+ }
203+
204+ let ex = expectation ( description: " " )
205+ let p = cancellable ( MockGeocoder ( ) . geocodePostalAddress ( CNPostalAddress ( ) , preferredLocale: nil ) ) . done { _ in
206+ XCTFail ( " not cancelled " )
207+ } . catch ( policy: . allErrors) { error in
208+ error. isCancelled ? ex. fulfill ( ) : XCTFail ( " error \( error) " )
209+ }
210+ after ( . milliseconds( 50 ) ) . done {
211+ p. cancel ( )
212+ }
213+ waitForExpectations ( timeout: 1 )
214+ }
215+ #endif
216+ }
0 commit comments