Skip to content

Instantly share code, notes, and snippets.

@wangsha
Created February 5, 2014 06:13
Show Gist options
  • Save wangsha/8818215 to your computer and use it in GitHub Desktop.
Save wangsha/8818215 to your computer and use it in GitHub Desktop.
@Test
public void networkRequestSchedulingSimulation() {
BehaviorSubject<String> syncResultSubject = BehaviorSubject.create("L0");
PublishSubject<Integer> syncRequestSubject = PublishSubject.create();
Observable<Input> syncResultInputSubject = syncResultSubject.toObservable().map(new Func1<String, Input>() {
@Override
public Input call(String integer) {
return Input.RESULT;
}
});
Observable<Input> syncRequestInputSubject = syncRequestSubject.toObservable().map(new Func1<Integer, Input>() {
@Override
public Input call(Integer integer) {
return Input.SYNC;
}
});
Observable<Input> merge = Observable.merge(syncRequestInputSubject, syncResultInputSubject);
Observable<State> stateObservable = merge.scan(State.IDLE, new Func2<State, Input, State>() {
@Override
public State call(State currentState, Input input) {
boolean isSyncRequest = input.equals(Input.SYNC);
State nextState = currentState;
switch (currentState) {
case IDLE:
nextState = isSyncRequest ? State.STARTED : State.IDLE;
break;
case STARTED:
nextState = isSyncRequest ? State.QUEUED : State.IDLE;
break;
case QUEUED:
nextState = isSyncRequest ? State.QUEUED : State.STARTED;
break;
}
return nextState;
}
});
stateObservable.subscribe(observer);
/*
result |L0------L1--------L3--L4-----
sync request |----S0----S1--S2----------S3--
merged signals |L0--S0--L1S1--S2--L3--L4--S3--
states |I---S---I-S---Q---S---I---S--
sync operation |----O0----O1------02------O3--
*/
syncRequestSubject.onNext(0);
syncResultSubject.onNext("L1");
syncRequestSubject.onNext(1);
syncRequestSubject.onNext(2);
syncResultSubject.onNext("L3");
syncResultSubject.onNext("L4");
syncRequestSubject.onNext(3);
verify(observer, times(4)).onNext(State.STARTED);
verify(observer, never()).onError(any(Throwable.class));
verify(observer, never()).onCompleted();
verifyNoMoreInteractions(observer);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment