@@ -19,7 +19,8 @@ object RxImplicits {
19
19
import java .{ lang => jlang }
20
20
import language .implicitConversions
21
21
22
- import rx .Observable
22
+ import rx .{ Observable , Observer , Subscription }
23
+ import rx .Observable .OnSubscribeFunc
23
24
import rx .observables .BlockingObservable
24
25
import rx .util .functions ._
25
26
@@ -56,7 +57,7 @@ object RxImplicits {
56
57
}
57
58
58
59
/**
59
- * Converts a function shaped ilke compareTo into the equivalent Rx Func2
60
+ * Converts a function shaped like compareTo into the equivalent Rx Func2
60
61
*/
61
62
implicit def convertComparisonFuncToRxFunc2 [A ](f : (A , A ) => Int ): Func2 [A , A , jlang.Integer ] =
62
63
new Func2 [A , A , jlang.Integer ] {
@@ -100,13 +101,18 @@ object RxImplicits {
100
101
def call (a : A , b : B , c : C , d : D ) = f(a, b, c, d)
101
102
}
102
103
104
+ implicit def onSubscribeFunc [A ](f : (Observer [_ >: A ]) => Subscription ): OnSubscribeFunc [A ] =
105
+ new OnSubscribeFunc [A ] {
106
+ override def onSubscribe (a : Observer [_ >: A ]) = f(a)
107
+ }
108
+
103
109
/**
104
110
* This implicit class implements all of the methods necessary for including Observables in a
105
111
* for-comprehension. Note that return type is always Observable, so that the ScalaObservable
106
112
* type never escapes the for-comprehension
107
113
*/
108
114
implicit class ScalaObservable [A ](wrapped : Observable [A ]) {
109
- def map [B ](f : A => B ): Observable [B ] = wrapped.map(f)
115
+ def map [B ](f : A => B ): Observable [B ] = wrapped.map[ B ] (f)
110
116
def flatMap [B ](f : A => Observable [B ]): Observable [B ] = wrapped.mapMany(f)
111
117
def foreach (f : A => Unit ): Unit = wrapped.toBlockingObservable.forEach(f)
112
118
def withFilter (p : A => Boolean ): WithFilter = new WithFilter (p)
@@ -131,7 +137,9 @@ class UnitTestSuite extends JUnitSuite {
131
137
import org .mockito .Mockito ._
132
138
import org .mockito .{ MockitoAnnotations , Mock }
133
139
import rx .{ Notification , Observer , Observable , Subscription }
140
+ import rx .Observable .OnSubscribeFunc
134
141
import rx .observables .GroupedObservable
142
+ import rx .subscriptions .Subscriptions
135
143
import collection .mutable .ArrayBuffer
136
144
import collection .JavaConverters ._
137
145
@@ -147,7 +155,7 @@ class UnitTestSuite extends JUnitSuite {
147
155
class ObservableWithException (s : Subscription , values : String * ) extends Observable [String ] {
148
156
var t : Thread = null
149
157
150
- override def subscribe (observer : Observer [String ]): Subscription = {
158
+ override def subscribe (observer : Observer [_ >: String ]): Subscription = {
151
159
println(" ObservableWithException subscribed to ..." )
152
160
t = new Thread (new Runnable () {
153
161
override def run () {
@@ -175,7 +183,6 @@ class UnitTestSuite extends JUnitSuite {
175
183
}
176
184
177
185
// tests of static methods
178
-
179
186
@ Test def testSingle {
180
187
assertEquals(1 , Observable .from(1 ).toBlockingObservable.single)
181
188
}
@@ -208,6 +215,11 @@ class UnitTestSuite extends JUnitSuite {
208
215
case ex : Throwable => fail(" Caught unexpected exception " + ex.getCause + " , expected IllegalStateException" )
209
216
}
210
217
}
218
+
219
+ @ Test def testCreateFromOnSubscribeFunc {
220
+ val created = Observable .create((o : Observer [_ >: Integer ]) => Subscriptions .empty)
221
+ // no assertions on subscription, just testing the implicit
222
+ }
211
223
212
224
@ Test def testFromJavaInterop {
213
225
val observable = Observable .from(List (1 , 2 , 3 ).asJava)
@@ -248,7 +260,7 @@ class UnitTestSuite extends JUnitSuite {
248
260
249
261
@ Test def testFlattenMerge {
250
262
val observable = Observable .from(Observable .from(1 , 2 , 3 ))
251
- val merged = Observable .merge(observable)
263
+ val merged = Observable .merge[ Int ] (observable)
252
264
assertSubscribeReceives(merged)(1 , 2 , 3 )
253
265
}
254
266
@@ -272,6 +284,18 @@ class UnitTestSuite extends JUnitSuite {
272
284
assertSubscribeReceives(synchronized )(1 , 2 , 3 )
273
285
}
274
286
287
+ @ Test def testZip2 () {
288
+ val colors : Observable [String ] = Observable .from(" red" , " green" , " blue" )
289
+ val names : Observable [String ] = Observable .from(" lion-o" , " cheetara" , " panthro" )
290
+
291
+ case class Character (color : String , name : String )
292
+
293
+ val cheetara = Character (" green" , " cheetara" )
294
+ val panthro = Character (" blue" , " panthro" )
295
+ val characters = Observable .zip[String , String , Character ](colors, names, Character .apply _)
296
+ assertSubscribeReceives(characters)(cheetara, panthro)
297
+ }
298
+
275
299
@ Test def testZip3 () {
276
300
val numbers = Observable .from(1 , 2 , 3 )
277
301
val colors = Observable .from(" red" , " green" , " blue" )
@@ -283,7 +307,7 @@ class UnitTestSuite extends JUnitSuite {
283
307
val cheetara = Character (2 , " green" , " cheetara" )
284
308
val panthro = Character (3 , " blue" , " panthro" )
285
309
286
- val characters = Observable .zip(numbers, colors, names, Character .apply _)
310
+ val characters = Observable .zip[ Int , String , String , Character ] (numbers, colors, names, Character .apply _)
287
311
assertSubscribeReceives(characters)(liono, cheetara, panthro)
288
312
}
289
313
@@ -299,7 +323,7 @@ class UnitTestSuite extends JUnitSuite {
299
323
val cheetara = Character (2 , " green" , " cheetara" , false )
300
324
val panthro = Character (3 , " blue" , " panthro" , false )
301
325
302
- val characters = Observable .zip(numbers, colors, names, isLeader, Character .apply _)
326
+ val characters = Observable .zip[ Int , String , String , Boolean , Character ] (numbers, colors, names, isLeader, Character .apply _)
303
327
assertSubscribeReceives(characters)(liono, cheetara, panthro)
304
328
}
305
329
@@ -338,7 +362,8 @@ class UnitTestSuite extends JUnitSuite {
338
362
@ Test def testMap {
339
363
val numbers = Observable .from(1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 )
340
364
val mappedNumbers = ArrayBuffer .empty[Int ]
341
- numbers.map((x : Int ) => x * x).subscribe((squareVal : Int ) => {
365
+ val mapped : Observable [Int ] = numbers map ((x : Int ) => x * x)
366
+ mapped.subscribe((squareVal : Int ) => {
342
367
mappedNumbers.append(squareVal)
343
368
})
344
369
assertEquals(List (1 , 4 , 9 , 16 , 25 , 36 , 49 , 64 , 81 ), mappedNumbers.toList)
@@ -458,18 +483,9 @@ class UnitTestSuite extends JUnitSuite {
458
483
assertSubscribeReceives(skipped)(3 , 4 )
459
484
}
460
485
461
- /**
462
- * Both testTake and testTakeWhileWithIndex exposed a bug with unsubscribes not properly propagating.
463
- * observable.take(2) produces onNext(first), onNext(second), and 4 onCompleteds
464
- * it should produce onNext(first), onNext(second), and 1 onCompleted
465
- *
466
- * Switching to Observable.create(OperationTake.take(observable, 2)) works as expected
467
- */
468
486
@ Test def testTake {
469
- import rx .operators ._
470
-
471
487
val observable = Observable .from(1 , 2 , 3 , 4 , 5 )
472
- val took = Observable .create( OperationTake . take(observable, 2 ) )
488
+ val took = observable. take(2 )
473
489
assertSubscribeReceives(took)(1 , 2 )
474
490
}
475
491
@@ -479,11 +495,11 @@ class UnitTestSuite extends JUnitSuite {
479
495
assertSubscribeReceives(took)(1 , 3 , 5 )
480
496
}
481
497
482
- /* @Test def testTakeWhileWithIndex {
483
- val observable = Observable.from(1, 3, 5, 6 , 7, 9, 11, 12, 13, 15, 17)
484
- val took = observable.takeWhileWithIndex((i: Int, idx: Int) => isOdd(i) && idx > 4 )
485
- assertSubscribeReceives(took)(9, 11)
486
- } */
498
+ @ Test def testTakeWhileWithIndex {
499
+ val observable = Observable .from(1 , 3 , 5 , 7 , 9 , 11 , 12 , 13 , 15 , 17 )
500
+ val took = observable.takeWhileWithIndex((i : Int , idx : Int ) => isOdd(i) && idx < 8 )
501
+ assertSubscribeReceives(took)(1 , 3 , 5 , 7 , 9 , 11 )
502
+ }
487
503
488
504
@ Test def testTakeLast {
489
505
val observable = Observable .from(1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 )
@@ -559,7 +575,7 @@ class UnitTestSuite extends JUnitSuite {
559
575
560
576
@ Test def testFilterInForComprehension {
561
577
val doubler = (i : Int ) => Observable .from(i, i)
562
- val filteredObservable = for {
578
+ val filteredObservable : Observable [ Int ] = for {
563
579
i : Int <- Observable .from(1 , 2 , 3 , 4 )
564
580
j : Int <- doubler(i) if isOdd(i)
565
581
} yield j
0 commit comments