Skip to content

Commit 6b25b23

Browse files
Fixed state capture bug.
Added some additional tests
1 parent de31844 commit 6b25b23

File tree

2 files changed

+99
-11
lines changed

2 files changed

+99
-11
lines changed

rxjava-core/src/main/java/rx/operators/OperatorSkip.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
*/
1515
public final class OperatorSkip<T> implements Observable.Operator<T, T> {
1616

17-
int n;
17+
final int n;
1818

1919
public OperatorSkip(int n) {
2020
this.n = n;
@@ -24,6 +24,8 @@ public OperatorSkip(int n) {
2424
public Subscriber<? super T> call(final Subscriber<? super T> child) {
2525
return new Subscriber<T>(child) {
2626

27+
int skipped = 0;
28+
2729
@Override
2830
public void onCompleted() {
2931
child.onCompleted();
@@ -36,10 +38,10 @@ public void onError(Throwable e) {
3638

3739
@Override
3840
public void onNext(T t) {
39-
if(n <= 0) {
41+
if(skipped >= n) {
4042
child.onNext(t);
4143
} else {
42-
n -= 1;
44+
skipped += 1;
4345
}
4446
}
4547

rxjava-core/src/test/java/rx/operators/OperatorSkipTest.java

Lines changed: 94 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,24 +9,39 @@
99
public class OperatorSkipTest {
1010

1111
@Test
12-
public void testSkip1() {
13-
Observable<String> w = Observable.from("one", "two", "three");
14-
Observable<String> skip = w.lift(new OperatorSkip<String>(2));
12+
public void testSkipNegativeElements() {
13+
14+
Observable<String> skip = Observable.from("one", "two", "three").lift(new OperatorSkip<String>(-99));
1515

1616
@SuppressWarnings("unchecked")
1717
Observer<String> observer = mock(Observer.class);
1818
skip.subscribe(observer);
19-
verify(observer, never()).onNext("one");
20-
verify(observer, never()).onNext("two");
19+
verify(observer, times(1)).onNext("one");
20+
verify(observer, times(1)).onNext("two");
2121
verify(observer, times(1)).onNext("three");
2222
verify(observer, never()).onError(any(Throwable.class));
2323
verify(observer, times(1)).onCompleted();
2424
}
2525

2626
@Test
27-
public void testSkip2() {
28-
Observable<String> w = Observable.from("one", "two", "three");
29-
Observable<String> skip = w.lift(new OperatorSkip<String>(1));
27+
public void testSkipZeroElements() {
28+
29+
Observable<String> skip = Observable.from("one", "two", "three").lift(new OperatorSkip<String>(0));
30+
31+
@SuppressWarnings("unchecked")
32+
Observer<String> observer = mock(Observer.class);
33+
skip.subscribe(observer);
34+
verify(observer, times(1)).onNext("one");
35+
verify(observer, times(1)).onNext("two");
36+
verify(observer, times(1)).onNext("three");
37+
verify(observer, never()).onError(any(Throwable.class));
38+
verify(observer, times(1)).onCompleted();
39+
}
40+
41+
@Test
42+
public void testSkipOneElement() {
43+
44+
Observable<String> skip = Observable.from("one", "two", "three").lift(new OperatorSkip<String>(1));
3045

3146
@SuppressWarnings("unchecked")
3247
Observer<String> observer = mock(Observer.class);
@@ -37,4 +52,75 @@ public void testSkip2() {
3752
verify(observer, never()).onError(any(Throwable.class));
3853
verify(observer, times(1)).onCompleted();
3954
}
55+
56+
@Test
57+
public void testSkipTwoElements() {
58+
59+
Observable<String> skip = Observable.from("one", "two", "three").lift(new OperatorSkip<String>(2));
60+
61+
@SuppressWarnings("unchecked")
62+
Observer<String> observer = mock(Observer.class);
63+
skip.subscribe(observer);
64+
verify(observer, never()).onNext("one");
65+
verify(observer, never()).onNext("two");
66+
verify(observer, times(1)).onNext("three");
67+
verify(observer, never()).onError(any(Throwable.class));
68+
verify(observer, times(1)).onCompleted();
69+
}
70+
71+
@Test
72+
public void testSkipEmptyStream() {
73+
74+
Observable<String> w = Observable.empty();
75+
Observable<String> skip = w.lift(new OperatorSkip<String>(1));
76+
77+
@SuppressWarnings("unchecked")
78+
Observer<String> observer = mock(Observer.class);
79+
skip.subscribe(observer);
80+
verify(observer, never()).onNext(any(String.class));
81+
verify(observer, never()).onError(any(Throwable.class));
82+
verify(observer, times(1)).onCompleted();
83+
}
84+
85+
@Test
86+
public void testSkipMultipleObservers() {
87+
88+
Observable<String> skip = Observable.from("one", "two", "three").lift(new OperatorSkip<String>(2));
89+
90+
@SuppressWarnings("unchecked")
91+
Observer<String> observer1 = mock(Observer.class);
92+
skip.subscribe(observer1);
93+
94+
@SuppressWarnings("unchecked")
95+
Observer<String> observer2 = mock(Observer.class);
96+
skip.subscribe(observer2);
97+
98+
verify(observer1, times(1)).onNext(any(String.class));
99+
verify(observer1, never()).onError(any(Throwable.class));
100+
verify(observer1, times(1)).onCompleted();
101+
102+
verify(observer2, times(1)).onNext(any(String.class));
103+
verify(observer2, never()).onError(any(Throwable.class));
104+
verify(observer2, times(1)).onCompleted();
105+
}
106+
107+
@Test
108+
public void testSkipError() {
109+
110+
Exception e = new Exception();
111+
112+
Observable<String> ok = Observable.from("one");
113+
Observable<String> error = Observable.error(e);
114+
115+
Observable<String> skip = Observable.concat(ok, error).lift(new OperatorSkip<String>(100));
116+
117+
@SuppressWarnings("unchecked")
118+
Observer<String> observer = mock(Observer.class);
119+
skip.subscribe(observer);
120+
121+
verify(observer, never()).onNext(any(String.class));
122+
verify(observer, times(1)).onError(e);
123+
verify(observer, never()).onCompleted();
124+
125+
}
40126
}

0 commit comments

Comments
 (0)