Skip to content

Commit e7ce270

Browse files
Merge pull request #363 from benjchristensen/reduce-covariance
unit tests for covariance
2 parents 7d56649 + 6368578 commit e7ce270

File tree

6 files changed

+328
-188
lines changed

6 files changed

+328
-188
lines changed
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package rx;
2+
3+
import org.junit.Test;
4+
5+
import rx.CovarianceTest.CoolRating;
6+
import rx.CovarianceTest.ExtendedResult;
7+
import rx.CovarianceTest.HorrorMovie;
8+
import rx.CovarianceTest.Media;
9+
import rx.CovarianceTest.Movie;
10+
import rx.CovarianceTest.Rating;
11+
import rx.CovarianceTest.Result;
12+
import rx.util.functions.Action1;
13+
import rx.util.functions.Func2;
14+
15+
public class CombineLatestTests {
16+
/**
17+
* This won't compile if super/extends isn't done correctly on generics
18+
*/
19+
@Test
20+
public void testCovarianceOfCombineLatest() {
21+
Observable<HorrorMovie> horrors = Observable.from(new HorrorMovie());
22+
Observable<CoolRating> ratings = Observable.from(new CoolRating());
23+
24+
Observable.<Movie, CoolRating, Result> combineLatest(horrors, ratings, combine).toBlockingObservable().forEach(action);
25+
Observable.<Movie, CoolRating, Result> combineLatest(horrors, ratings, combine).toBlockingObservable().forEach(action);
26+
Observable.<Media, Rating, ExtendedResult> combineLatest(horrors, ratings, combine).toBlockingObservable().forEach(extendedAction);
27+
Observable.<Media, Rating, Result> combineLatest(horrors, ratings, combine).toBlockingObservable().forEach(action);
28+
Observable.<Media, Rating, ExtendedResult> combineLatest(horrors, ratings, combine).toBlockingObservable().forEach(action);
29+
30+
Observable.<Movie, CoolRating, Result> combineLatest(horrors, ratings, combine);
31+
}
32+
33+
Func2<Media, Rating, ExtendedResult> combine = new Func2<Media, Rating, ExtendedResult>() {
34+
@Override
35+
public ExtendedResult call(Media m, Rating r) {
36+
return new ExtendedResult();
37+
}
38+
};
39+
40+
Action1<Result> action = new Action1<Result>() {
41+
@Override
42+
public void call(Result t1) {
43+
System.out.println("Result: " + t1);
44+
}
45+
};
46+
47+
Action1<ExtendedResult> extendedAction = new Action1<ExtendedResult>() {
48+
@Override
49+
public void call(ExtendedResult t1) {
50+
System.out.println("Result: " + t1);
51+
}
52+
};
53+
}

rxjava-core/src/test/java/rx/ConcatTests.java

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,12 @@
77

88
import org.junit.Test;
99

10+
import rx.CovarianceTest.HorrorMovie;
11+
import rx.CovarianceTest.Media;
12+
import rx.CovarianceTest.Movie;
13+
import rx.Observable.OnSubscribeFunc;
14+
import rx.subscriptions.Subscriptions;
15+
1016
public class ConcatTests {
1117

1218
@Test
@@ -54,4 +60,62 @@ public void testConcatWithIterableOfObservable() {
5460
assertEquals("three", values.get(2));
5561
assertEquals("four", values.get(3));
5662
}
63+
64+
@Test
65+
public void testConcatCovariance() {
66+
Observable<Media> o1 = Observable.<Media> from(new HorrorMovie(), new Movie());
67+
Observable<Media> o2 = Observable.from(new Media(), new HorrorMovie());
68+
69+
Observable<Observable<Media>> os = Observable.from(o1, o2);
70+
71+
List<Media> values = Observable.concat(os).toList().toBlockingObservable().single();
72+
}
73+
74+
@Test
75+
public void testConcatCovariance2() {
76+
Observable<Media> o1 = Observable.from(new HorrorMovie(), new Movie(), new Media());
77+
Observable<Media> o2 = Observable.from(new Media(), new HorrorMovie());
78+
79+
Observable<Observable<Media>> os = Observable.from(o1, o2);
80+
81+
List<Media> values = Observable.concat(os).toList().toBlockingObservable().single();
82+
}
83+
84+
@Test
85+
public void testConcatCovariance3() {
86+
Observable<Movie> o1 = Observable.from(new HorrorMovie(), new Movie());
87+
Observable<Media> o2 = Observable.from(new Media(), new HorrorMovie());
88+
89+
List<Media> values = Observable.concat(o1, o2).toList().toBlockingObservable().single();
90+
91+
assertTrue(values.get(0) instanceof HorrorMovie);
92+
assertTrue(values.get(1) instanceof Movie);
93+
assertTrue(values.get(2) instanceof Media);
94+
assertTrue(values.get(3) instanceof HorrorMovie);
95+
}
96+
97+
@Test
98+
public void testConcatCovariance4() {
99+
100+
Observable<Movie> o1 = Observable.create(new OnSubscribeFunc<Movie>() {
101+
102+
@Override
103+
public Subscription onSubscribe(Observer<? super Movie> o) {
104+
o.onNext(new HorrorMovie());
105+
o.onNext(new Movie());
106+
// o.onNext(new Media()); // correctly doesn't compile
107+
o.onCompleted();
108+
return Subscriptions.empty();
109+
}
110+
});
111+
112+
Observable<Media> o2 = Observable.from(new Media(), new HorrorMovie());
113+
114+
List<Media> values = Observable.concat(o1, o2).toList().toBlockingObservable().single();
115+
116+
assertTrue(values.get(0) instanceof HorrorMovie);
117+
assertTrue(values.get(1) instanceof Movie);
118+
assertTrue(values.get(2) instanceof Media);
119+
assertTrue(values.get(3) instanceof HorrorMovie);
120+
}
57121
}

rxjava-core/src/test/java/rx/CovarianceTest.java

Lines changed: 2 additions & 188 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,9 @@
11
package rx;
22

3-
import static org.junit.Assert.*;
4-
53
import java.util.ArrayList;
6-
import java.util.List;
74

85
import org.junit.Test;
96

10-
import rx.Observable.OnSubscribeFunc;
11-
import rx.subscriptions.Subscriptions;
12-
import rx.util.functions.Action1;
13-
import rx.util.functions.Func2;
14-
157
/**
168
* Test super/extends of generics.
179
*
@@ -29,187 +21,9 @@ public void testCovarianceOfFrom() {
2921
// Observable.<HorrorMovie>from(new Movie()); // may not compile
3022
}
3123

32-
/**
33-
* This won't compile if super/extends isn't done correctly on generics
34-
*/
35-
@Test
36-
public void testCovarianceOfMerge() {
37-
Observable<HorrorMovie> horrors = Observable.from(new HorrorMovie());
38-
Observable<Observable<HorrorMovie>> metaHorrors = Observable.just(horrors);
39-
Observable.<Media> merge(metaHorrors);
40-
}
41-
42-
/**
43-
* This won't compile if super/extends isn't done correctly on generics
44-
*/
45-
@Test
46-
public void testCovarianceOfZip() {
47-
Observable<HorrorMovie> horrors = Observable.from(new HorrorMovie());
48-
Observable<CoolRating> ratings = Observable.from(new CoolRating());
49-
50-
Observable.<Movie, CoolRating, Result> zip(horrors, ratings, combine).toBlockingObservable().forEach(action);
51-
Observable.<Movie, CoolRating, Result> zip(horrors, ratings, combine).toBlockingObservable().forEach(action);
52-
Observable.<Media, Rating, ExtendedResult> zip(horrors, ratings, combine).toBlockingObservable().forEach(extendedAction);
53-
Observable.<Media, Rating, Result> zip(horrors, ratings, combine).toBlockingObservable().forEach(action);
54-
Observable.<Media, Rating, ExtendedResult> zip(horrors, ratings, combine).toBlockingObservable().forEach(action);
55-
56-
Observable.<Movie, CoolRating, Result> zip(horrors, ratings, combine);
57-
}
58-
59-
/**
60-
* This won't compile if super/extends isn't done correctly on generics
24+
/*
25+
* Most tests are moved into their applicable classes such as [Operator]Tests.java
6126
*/
62-
@Test
63-
public void testCovarianceOfCombineLatest() {
64-
Observable<HorrorMovie> horrors = Observable.from(new HorrorMovie());
65-
Observable<CoolRating> ratings = Observable.from(new CoolRating());
66-
67-
Observable.<Movie, CoolRating, Result> combineLatest(horrors, ratings, combine).toBlockingObservable().forEach(action);
68-
Observable.<Movie, CoolRating, Result> combineLatest(horrors, ratings, combine).toBlockingObservable().forEach(action);
69-
Observable.<Media, Rating, ExtendedResult> combineLatest(horrors, ratings, combine).toBlockingObservable().forEach(extendedAction);
70-
Observable.<Media, Rating, Result> combineLatest(horrors, ratings, combine).toBlockingObservable().forEach(action);
71-
Observable.<Media, Rating, ExtendedResult> combineLatest(horrors, ratings, combine).toBlockingObservable().forEach(action);
72-
73-
Observable.<Movie, CoolRating, Result> combineLatest(horrors, ratings, combine);
74-
}
75-
76-
@Test
77-
public void testConcatCovariance() {
78-
Observable<Media> o1 = Observable.<Media> from(new HorrorMovie(), new Movie());
79-
Observable<Media> o2 = Observable.from(new Media(), new HorrorMovie());
80-
81-
Observable<Observable<Media>> os = Observable.from(o1, o2);
82-
83-
List<Media> values = Observable.concat(os).toList().toBlockingObservable().single();
84-
}
85-
86-
@Test
87-
public void testConcatCovariance2() {
88-
Observable<Media> o1 = Observable.from(new HorrorMovie(), new Movie(), new Media());
89-
Observable<Media> o2 = Observable.from(new Media(), new HorrorMovie());
90-
91-
Observable<Observable<Media>> os = Observable.from(o1, o2);
92-
93-
List<Media> values = Observable.concat(os).toList().toBlockingObservable().single();
94-
}
95-
96-
@Test
97-
public void testConcatCovariance3() {
98-
Observable<Movie> o1 = Observable.from(new HorrorMovie(), new Movie());
99-
Observable<Media> o2 = Observable.from(new Media(), new HorrorMovie());
100-
101-
List<Media> values = Observable.concat(o1, o2).toList().toBlockingObservable().single();
102-
103-
assertTrue(values.get(0) instanceof HorrorMovie);
104-
assertTrue(values.get(1) instanceof Movie);
105-
assertTrue(values.get(2) instanceof Media);
106-
assertTrue(values.get(3) instanceof HorrorMovie);
107-
}
108-
109-
@Test
110-
public void testConcatCovariance4() {
111-
112-
Observable<Movie> o1 = Observable.create(new OnSubscribeFunc<Movie>() {
113-
114-
@Override
115-
public Subscription onSubscribe(Observer<? super Movie> o) {
116-
o.onNext(new HorrorMovie());
117-
o.onNext(new Movie());
118-
// o.onNext(new Media()); // correctly doesn't compile
119-
o.onCompleted();
120-
return Subscriptions.empty();
121-
}
122-
});
123-
124-
Observable<Media> o2 = Observable.from(new Media(), new HorrorMovie());
125-
126-
List<Media> values = Observable.concat(o1, o2).toList().toBlockingObservable().single();
127-
128-
assertTrue(values.get(0) instanceof HorrorMovie);
129-
assertTrue(values.get(1) instanceof Movie);
130-
assertTrue(values.get(2) instanceof Media);
131-
assertTrue(values.get(3) instanceof HorrorMovie);
132-
}
133-
134-
135-
@Test
136-
public void testMergeCovariance() {
137-
Observable<Media> o1 = Observable.<Media> from(new HorrorMovie(), new Movie());
138-
Observable<Media> o2 = Observable.from(new Media(), new HorrorMovie());
139-
140-
Observable<Observable<Media>> os = Observable.from(o1, o2);
141-
142-
List<Media> values = Observable.merge(os).toList().toBlockingObservable().single();
143-
}
144-
145-
@Test
146-
public void testMergeCovariance2() {
147-
Observable<Media> o1 = Observable.from(new HorrorMovie(), new Movie(), new Media());
148-
Observable<Media> o2 = Observable.from(new Media(), new HorrorMovie());
149-
150-
Observable<Observable<Media>> os = Observable.from(o1, o2);
151-
152-
List<Media> values = Observable.merge(os).toList().toBlockingObservable().single();
153-
}
154-
155-
@Test
156-
public void testMergeCovariance3() {
157-
Observable<Movie> o1 = Observable.from(new HorrorMovie(), new Movie());
158-
Observable<Media> o2 = Observable.from(new Media(), new HorrorMovie());
159-
160-
List<Media> values = Observable.merge(o1, o2).toList().toBlockingObservable().single();
161-
162-
assertTrue(values.get(0) instanceof HorrorMovie);
163-
assertTrue(values.get(1) instanceof Movie);
164-
assertTrue(values.get(2) instanceof Media);
165-
assertTrue(values.get(3) instanceof HorrorMovie);
166-
}
167-
168-
@Test
169-
public void testMergeCovariance4() {
170-
171-
Observable<Movie> o1 = Observable.create(new OnSubscribeFunc<Movie>() {
172-
173-
@Override
174-
public Subscription onSubscribe(Observer<? super Movie> o) {
175-
o.onNext(new HorrorMovie());
176-
o.onNext(new Movie());
177-
// o.onNext(new Media()); // correctly doesn't compile
178-
o.onCompleted();
179-
return Subscriptions.empty();
180-
}
181-
});
182-
183-
Observable<Media> o2 = Observable.from(new Media(), new HorrorMovie());
184-
185-
List<Media> values = Observable.merge(o1, o2).toList().toBlockingObservable().single();
186-
187-
assertTrue(values.get(0) instanceof HorrorMovie);
188-
assertTrue(values.get(1) instanceof Movie);
189-
assertTrue(values.get(2) instanceof Media);
190-
assertTrue(values.get(3) instanceof HorrorMovie);
191-
}
192-
193-
Func2<Media, Rating, ExtendedResult> combine = new Func2<Media, Rating, ExtendedResult>() {
194-
@Override
195-
public ExtendedResult call(Media m, Rating r) {
196-
return new ExtendedResult();
197-
}
198-
};
199-
200-
Action1<Result> action = new Action1<Result>() {
201-
@Override
202-
public void call(Result t1) {
203-
System.out.println("Result: " + t1);
204-
}
205-
};
206-
207-
Action1<ExtendedResult> extendedAction = new Action1<ExtendedResult>() {
208-
@Override
209-
public void call(ExtendedResult t1) {
210-
System.out.println("Result: " + t1);
211-
}
212-
};
21327

21428
static class Media {
21529
}

0 commit comments

Comments
 (0)