|
| 1 | +package asyncstreams |
| 2 | + |
| 3 | +import scala.concurrent.{Await, Future} |
| 4 | +import scala.concurrent.duration._ |
| 5 | +import scala.concurrent.ExecutionContext.Implicits.global |
| 6 | +import asyncstreams.AsyncStream._ |
| 7 | + |
| 8 | +import scalaz.std.scalaFuture._ |
| 9 | +import scalaz.syntax.std.option._ |
| 10 | +import scalaz.syntax.monad._ |
| 11 | +import scalaz.syntax.std.boolean._ |
| 12 | + |
| 13 | + |
| 14 | +class AsyncStreamTests extends BaseSuite { |
| 15 | + private def makeStream(l: List[Int]) = generate(l)(l => l.nonEmpty.option((l.tail, l.head)).point[Future]) |
| 16 | + |
| 17 | + private def makeInfStream = generate(0)(v => Future((v + 1, v).some)) |
| 18 | + |
| 19 | + private def wait[T](f: Future[T]): T = Await.result(f, 10.seconds) |
| 20 | + |
| 21 | + test("foldLeft") { |
| 22 | + val s2 = makeStream(2 :: 3 :: Nil) |
| 23 | + val f = s2.foldLeft(List[Int]())((list, el) => el :: list) |
| 24 | + wait(f) shouldBe List(3, 2) |
| 25 | + } |
| 26 | + |
| 27 | + test("concat") { |
| 28 | + val s1 = makeStream(0 :: 1 :: Nil) |
| 29 | + val s2 = makeStream(2 :: 3 :: Nil) |
| 30 | + val f = concat(s1, s2) |
| 31 | + wait(f.toList) shouldBe List(0, 1, 2, 3) |
| 32 | + } |
| 33 | + |
| 34 | + test("working as monad") { |
| 35 | + val s1 = makeStream(0 :: 1 :: Nil) |
| 36 | + val s2 = makeStream(2 :: 3 :: Nil) |
| 37 | + |
| 38 | + val res = for { |
| 39 | + v1 <- s1 |
| 40 | + v2 <- s2 |
| 41 | + } yield v1 * v2 |
| 42 | + |
| 43 | + wait(res.toList) shouldBe List(0, 0, 2, 3) |
| 44 | + } |
| 45 | + |
| 46 | + test("takeWhile") { |
| 47 | + val r = makeInfStream.takeWhile(_ < 4) |
| 48 | + wait(r.toList) shouldBe List(0, 1, 2, 3) |
| 49 | + } |
| 50 | + |
| 51 | + test("take") { |
| 52 | + val r = makeInfStream.take(3) |
| 53 | + wait(r.toList) shouldBe List(0, 1, 2) |
| 54 | + } |
| 55 | + |
| 56 | + test("folding large stream should not crash") { |
| 57 | + val r = makeInfStream.takeWhile(_ < 1000000) |
| 58 | + wait(r.toList) shouldBe (0 to 999999) |
| 59 | + } |
| 60 | +} |
0 commit comments