15
15
*/
16
16
package rx ;
17
17
18
+ import static org .junit .Assert .assertEquals ;
19
+
18
20
import java .util .ArrayList ;
21
+ import java .util .Arrays ;
22
+ import java .util .LinkedHashSet ;
23
+ import java .util .List ;
24
+ import java .util .Set ;
19
25
20
26
import org .junit .Test ;
21
27
22
28
import rx .Observable .Transformer ;
23
29
import rx .functions .Func1 ;
24
30
import rx .functions .Func2 ;
31
+ import rx .observables .GroupedObservable ;
32
+ import rx .observers .TestSubscriber ;
25
33
26
34
/**
27
35
* Test super/extends of generics.
@@ -59,14 +67,52 @@ public Integer call(Media t1, Media t2) {
59
67
o2 .toSortedList (SORT_FUNCTION );
60
68
}
61
69
62
-
70
+ @ Test
71
+ public void testGroupByCompose () {
72
+ Observable <Movie > movies = Observable .just (new HorrorMovie (), new ActionMovie (), new Movie ());
73
+ TestSubscriber <String > ts = new TestSubscriber <String >();
74
+ movies .groupBy (new Func1 <Movie , Class <? extends Movie >>() {
75
+
76
+ @ Override
77
+ public Class <? extends Movie > call (Movie m ) {
78
+ return m .getClass ();
79
+ }
80
+
81
+ }).flatMap (new Func1 <GroupedObservable <Class <? extends Movie >, Movie >, Observable <String >>() {
82
+
83
+ @ Override
84
+ public Observable <String > call (GroupedObservable <Class <? extends Movie >, Movie > g ) {
85
+ return g .compose (new Transformer <Movie , Movie >() {
86
+
87
+ @ Override
88
+ public Observable <? extends Movie > call (Observable <Movie > m ) {
89
+ return m .concatWith (Observable .just (new ActionMovie ()));
90
+ }
91
+
92
+ }).map (new Func1 <Movie , String >() {
93
+
94
+ @ Override
95
+ public String call (Movie m ) {
96
+ return m .toString ();
97
+ }
98
+
99
+ });
100
+ }
101
+
102
+ }).subscribe (ts );
103
+ ts .assertTerminalEvent ();
104
+ ts .assertNoErrors ();
105
+ // System.out.println(ts.getOnNextEvents());
106
+ assertEquals (6 , ts .getOnNextEvents ().size ());
107
+ }
108
+
63
109
@ Test
64
110
public void testCovarianceOfCompose () {
65
111
Observable <HorrorMovie > movie = Observable .just (new HorrorMovie ());
66
112
Observable <Movie > movie2 = movie .compose (new Transformer <Movie , Movie >() {
67
113
68
114
@ Override
69
- public Observable <? extends Movie > call (Observable <? extends Movie > t1 ) {
115
+ public Observable <? extends Movie > call (Observable <Movie > t1 ) {
70
116
return Observable .just (new Movie ());
71
117
}
72
118
@@ -78,7 +124,7 @@ public void testCovarianceOfCompose2() {
78
124
Observable <Movie > movie = Observable .<Movie > just (new HorrorMovie ());
79
125
Observable <HorrorMovie > movie2 = movie .compose (new Transformer <Movie , HorrorMovie >() {
80
126
@ Override
81
- public Observable <? extends HorrorMovie > call (Observable <? extends Movie > t1 ) {
127
+ public Observable <? extends HorrorMovie > call (Observable <Movie > t1 ) {
82
128
return Observable .just (new HorrorMovie ());
83
129
}
84
130
});
@@ -89,7 +135,7 @@ public void testCovarianceOfCompose3() {
89
135
Observable <Movie > movie = Observable .<Movie >just (new HorrorMovie ());
90
136
Observable <HorrorMovie > movie2 = movie .compose (new Transformer <Movie , HorrorMovie >() {
91
137
@ Override
92
- public Observable <? extends HorrorMovie > call (Observable <? extends Movie > t1 ) {
138
+ public Observable <? extends HorrorMovie > call (Observable <Movie > t1 ) {
93
139
return Observable .just (new HorrorMovie ()).map (new Func1 <HorrorMovie , HorrorMovie >() {
94
140
95
141
@ Override
@@ -106,7 +152,7 @@ public void testCovarianceOfCompose4() {
106
152
Observable <HorrorMovie > movie = Observable .just (new HorrorMovie ());
107
153
Observable <HorrorMovie > movie2 = movie .compose (new Transformer <HorrorMovie , HorrorMovie >() {
108
154
@ Override
109
- public Observable <? extends HorrorMovie > call (Observable <? extends HorrorMovie > t1 ) {
155
+ public Observable <? extends HorrorMovie > call (Observable <HorrorMovie > t1 ) {
110
156
return t1 .map (new Func1 <HorrorMovie , HorrorMovie >() {
111
157
112
158
@ Override
@@ -118,6 +164,52 @@ public HorrorMovie call(HorrorMovie horrorMovie) {
118
164
});
119
165
}
120
166
167
+ @ Test
168
+ public void testComposeWithDeltaLogic () {
169
+ List <Movie > list1 = Arrays .asList (new Movie (), new HorrorMovie (), new ActionMovie ());
170
+ List <Movie > list2 = Arrays .asList (new ActionMovie (), new Movie (), new HorrorMovie (), new ActionMovie ());
171
+ Observable <List <Movie >> movies = Observable .just (list1 , list2 );
172
+ movies .compose (deltaTransformer );
173
+ }
174
+
175
+ static Transformer <List <Movie >, Movie > deltaTransformer = new Transformer <List <Movie >, Movie >() {
176
+ @ Override
177
+ public Observable <Movie > call (Observable <List <Movie >> movieList ) {
178
+ return movieList
179
+ .startWith (new ArrayList <Movie >())
180
+ .buffer (2 , 1 )
181
+ .skip (1 )
182
+ .flatMap (calculateDelta );
183
+ }
184
+ };
185
+
186
+ static Func1 <List <List <Movie >>, Observable <Movie >> calculateDelta = new Func1 <List <List <Movie >>, Observable <Movie >>() {
187
+ public Observable <Movie > call (List <List <Movie >> listOfLists ) {
188
+ if (listOfLists .size () == 1 ) {
189
+ return Observable .from (listOfLists .get (0 ));
190
+ } else {
191
+ // diff the two
192
+ List <Movie > newList = listOfLists .get (1 );
193
+ List <Movie > oldList = new ArrayList <Movie >(listOfLists .get (0 ));
194
+
195
+ Set <Movie > delta = new LinkedHashSet <Movie >();
196
+ delta .addAll (newList );
197
+ // remove all that match in old
198
+ delta .removeAll (oldList );
199
+
200
+ // filter oldList to those that aren't in the newList
201
+ oldList .removeAll (newList );
202
+
203
+ // for all left in the oldList we'll create DROP events
204
+ for (Movie old : oldList ) {
205
+ delta .add (new Movie ());
206
+ }
207
+
208
+ return Observable .from (delta );
209
+ }
210
+ };
211
+ };
212
+
121
213
/*
122
214
* Most tests are moved into their applicable classes such as [Operator]Tests.java
123
215
*/
0 commit comments