|
15 | 15 | */
|
16 | 16 | package rx.operators;
|
17 | 17 |
|
18 |
| -import static org.mockito.Matchers.any; |
19 |
| -import static org.mockito.Matchers.anyInt; |
20 |
| -import static org.mockito.Mockito.mock; |
21 |
| -import static org.mockito.Mockito.never; |
22 |
| -import static org.mockito.Mockito.times; |
23 |
| -import static org.mockito.Mockito.verify; |
24 |
| -import static org.mockito.Mockito.verifyNoMoreInteractions; |
25 |
| -import static org.mockito.Mockito.when; |
26 |
| - |
27 |
| -import org.junit.Before; |
28 |
| -import org.junit.Test; |
29 |
| -import org.junit.runner.RunWith; |
30 |
| -import org.mockito.Mock; |
31 |
| -import org.mockito.MockitoAnnotations; |
32 |
| -import org.robolectric.RobolectricTestRunner; |
33 |
| -import org.robolectric.annotation.Config; |
34 |
| - |
35 | 18 | import rx.Observable;
|
36 | 19 | import rx.Observer;
|
37 | 20 | import rx.Subscription;
|
|
42 | 25 | import android.os.Looper;
|
43 | 26 | import android.util.Log;
|
44 | 27 |
|
45 |
| -import java.lang.reflect.Field; |
46 | 28 | import java.util.concurrent.Callable;
|
47 | 29 | import java.util.concurrent.Executors;
|
48 | 30 | import java.util.concurrent.Future;
|
@@ -164,150 +146,4 @@ protected boolean isComponentValid(android.support.v4.app.Fragment fragment) {
|
164 | 146 | return fragment.isAdded();
|
165 | 147 | }
|
166 | 148 | }
|
167 |
| - |
168 |
| - @RunWith(RobolectricTestRunner.class) |
169 |
| - @Config(manifest = Config.NONE) |
170 |
| - public static final class UnitTest { |
171 |
| - |
172 |
| - @Mock |
173 |
| - private Observer<Integer> mockObserver; |
174 |
| - |
175 |
| - @Mock |
176 |
| - private Fragment mockFragment; |
177 |
| - |
178 |
| - @Mock |
179 |
| - private Activity mockActivity; |
180 |
| - |
181 |
| - @Mock |
182 |
| - private Observable<Integer> mockObservable; |
183 |
| - |
184 |
| - @Before |
185 |
| - public void setupMocks() { |
186 |
| - MockitoAnnotations.initMocks(this); |
187 |
| - when(mockFragment.isAdded()).thenReturn(true); |
188 |
| - } |
189 |
| - |
190 |
| - @Test |
191 |
| - public void itThrowsIfObserverSubscribesFromBackgroundThread() throws Exception { |
192 |
| - final Future<Object> future = Executors.newSingleThreadExecutor().submit(new Callable<Object>() { |
193 |
| - @Override |
194 |
| - public Object call() throws Exception { |
195 |
| - OperationObserveFromAndroidComponent.observeFromAndroidComponent( |
196 |
| - mockObservable, mockFragment).subscribe(mockObserver); |
197 |
| - return null; |
198 |
| - } |
199 |
| - }); |
200 |
| - future.get(1, TimeUnit.SECONDS); |
201 |
| - verify(mockObserver).onError(any(IllegalStateException.class)); |
202 |
| - verifyNoMoreInteractions(mockObserver); |
203 |
| - } |
204 |
| - |
205 |
| - @Test |
206 |
| - public void itObservesTheSourceSequenceOnTheMainUIThread() { |
207 |
| - OperationObserveFromAndroidComponent.observeFromAndroidComponent(mockObservable, mockFragment).subscribe(mockObserver); |
208 |
| - verify(mockObservable).observeOn(AndroidSchedulers.mainThread()); |
209 |
| - } |
210 |
| - |
211 |
| - @Test |
212 |
| - public void itForwardsOnNextOnCompletedSequenceToTargetObserver() { |
213 |
| - Observable<Integer> source = Observable.from(1, 2, 3); |
214 |
| - OperationObserveFromAndroidComponent.observeFromAndroidComponent(source, mockFragment).subscribe(mockObserver); |
215 |
| - verify(mockObserver, times(3)).onNext(anyInt()); |
216 |
| - verify(mockObserver).onCompleted(); |
217 |
| - verify(mockObserver, never()).onError(any(Exception.class)); |
218 |
| - } |
219 |
| - |
220 |
| - @Test |
221 |
| - public void itForwardsOnErrorToTargetObserver() { |
222 |
| - final Exception exception = new Exception(); |
223 |
| - Observable<Integer> source = Observable.error(exception); |
224 |
| - OperationObserveFromAndroidComponent.observeFromAndroidComponent(source, mockFragment).subscribe(mockObserver); |
225 |
| - verify(mockObserver).onError(exception); |
226 |
| - verify(mockObserver, never()).onNext(anyInt()); |
227 |
| - verify(mockObserver, never()).onCompleted(); |
228 |
| - } |
229 |
| - |
230 |
| - @Test |
231 |
| - public void itDropsOnNextOnCompletedSequenceIfTargetComponentIsGone() throws Throwable { |
232 |
| - PublishSubject<Integer> source = PublishSubject.create(); |
233 |
| - |
234 |
| - final OnSubscribeFragment<Integer> operator = new OnSubscribeFragment<Integer>(source, mockFragment); |
235 |
| - operator.onSubscribe(mockObserver); |
236 |
| - |
237 |
| - source.onNext(1); |
238 |
| - releaseComponentRef(operator); |
239 |
| - |
240 |
| - source.onNext(2); |
241 |
| - source.onNext(3); |
242 |
| - source.onCompleted(); |
243 |
| - |
244 |
| - verify(mockObserver).onNext(1); |
245 |
| - verifyNoMoreInteractions(mockObserver); |
246 |
| - } |
247 |
| - |
248 |
| - @Test |
249 |
| - public void itDropsOnErrorIfTargetComponentIsGone() throws Throwable { |
250 |
| - PublishSubject<Integer> source = PublishSubject.create(); |
251 |
| - |
252 |
| - final OnSubscribeFragment<Integer> operator = new OnSubscribeFragment<Integer>(source, mockFragment); |
253 |
| - operator.onSubscribe(mockObserver); |
254 |
| - |
255 |
| - source.onNext(1); |
256 |
| - releaseComponentRef(operator); |
257 |
| - |
258 |
| - source.onError(new Exception()); |
259 |
| - |
260 |
| - verify(mockObserver).onNext(1); |
261 |
| - verifyNoMoreInteractions(mockObserver); |
262 |
| - } |
263 |
| - |
264 |
| - private void releaseComponentRef(OnSubscribeFragment<Integer> operator) throws NoSuchFieldException, IllegalAccessException { |
265 |
| - final Field componentRef = operator.getClass().getSuperclass().getDeclaredField("componentRef"); |
266 |
| - componentRef.setAccessible(true); |
267 |
| - componentRef.set(operator, null); |
268 |
| - } |
269 |
| - |
270 |
| - @Test |
271 |
| - public void itDoesNotForwardOnNextOnCompletedSequenceIfFragmentIsDetached() { |
272 |
| - PublishSubject<Integer> source = PublishSubject.create(); |
273 |
| - OperationObserveFromAndroidComponent.observeFromAndroidComponent(source, mockFragment).subscribe(mockObserver); |
274 |
| - |
275 |
| - source.onNext(1); |
276 |
| - |
277 |
| - when(mockFragment.isAdded()).thenReturn(false); |
278 |
| - source.onNext(2); |
279 |
| - source.onNext(3); |
280 |
| - source.onCompleted(); |
281 |
| - |
282 |
| - verify(mockObserver).onNext(1); |
283 |
| - verify(mockObserver, never()).onCompleted(); |
284 |
| - } |
285 |
| - |
286 |
| - @Test |
287 |
| - public void itDoesNotForwardOnErrorIfFragmentIsDetached() { |
288 |
| - PublishSubject<Integer> source = PublishSubject.create(); |
289 |
| - OperationObserveFromAndroidComponent.observeFromAndroidComponent(source, mockFragment).subscribe(mockObserver); |
290 |
| - |
291 |
| - source.onNext(1); |
292 |
| - |
293 |
| - when(mockFragment.isAdded()).thenReturn(false); |
294 |
| - source.onError(new Exception()); |
295 |
| - |
296 |
| - verify(mockObserver).onNext(1); |
297 |
| - verify(mockObserver, never()).onError(any(Exception.class)); |
298 |
| - } |
299 |
| - |
300 |
| - @Test |
301 |
| - public void itUnsubscribesFromTheSourceSequence() { |
302 |
| - Subscription underlying = mock(Subscription.class); |
303 |
| - when(mockObservable.observeOn(AndroidSchedulers.mainThread())).thenReturn(mockObservable); |
304 |
| - when(mockObservable.subscribe(any(Observer.class))).thenReturn(underlying); |
305 |
| - |
306 |
| - Subscription sub = OperationObserveFromAndroidComponent.observeFromAndroidComponent( |
307 |
| - mockObservable, mockActivity).subscribe(mockObserver); |
308 |
| - sub.unsubscribe(); |
309 |
| - |
310 |
| - verify(underlying).unsubscribe(); |
311 |
| - } |
312 |
| - } |
313 | 149 | }
|
0 commit comments