|
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