summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLukas Rytz <lukas.rytz@typesafe.com>2016-03-23 09:52:18 +0100
committerLukas Rytz <lukas.rytz@typesafe.com>2016-03-23 09:52:18 +0100
commit4ef14294453c43420e0e1a2ac984ba4a2d8b8dca (patch)
tree8b4aac09b51e6484fb3d6292838262d7d64fa7da
parent46595fb5fb4c548d52e39969aa58c69c30953bec (diff)
parentd832346268779090f08afad649a337ca571efc37 (diff)
downloadscala-4ef14294453c43420e0e1a2ac984ba4a2d8b8dca.tar.gz
scala-4ef14294453c43420e0e1a2ac984ba4a2d8b8dca.tar.bz2
scala-4ef14294453c43420e0e1a2ac984ba4a2d8b8dca.zip
Merge pull request #5056 from viktorklang/wip-SI9488-Future.toString-√
SI-9488 - adds the same default toString format to Scala Futures as 2…
-rw-r--r--bincompat-backward.whitelist.conf6
-rw-r--r--bincompat-forward.whitelist.conf6
-rw-r--r--src/library/scala/concurrent/impl/Promise.scala4
-rw-r--r--test/files/jvm/future-spec/FutureTests.scala20
4 files changed, 34 insertions, 2 deletions
diff --git a/bincompat-backward.whitelist.conf b/bincompat-backward.whitelist.conf
index 0d85590b41..0770b3cb95 100644
--- a/bincompat-backward.whitelist.conf
+++ b/bincompat-backward.whitelist.conf
@@ -217,6 +217,12 @@ filter {
{
matchName="scala.concurrent.impl.Promise$DefaultPromise"
problemName=MissingTypesProblem
+ },
+ // SI-9488: Due to SI-8362 above, toString was silently changed to the AtomicReference toString implementation,
+ // This is fixed by SI-9488, and this should be safe since the class in question is stdlib internal.
+ {
+ matchName="scala.concurrent.impl.Promise.toString"
+ problemName=MissingMethodProblem
}
]
}
diff --git a/bincompat-forward.whitelist.conf b/bincompat-forward.whitelist.conf
index a9fbaa7b87..c6cffee846 100644
--- a/bincompat-forward.whitelist.conf
+++ b/bincompat-forward.whitelist.conf
@@ -381,6 +381,12 @@ filter {
{
matchName="scala.concurrent.impl.Promise$DefaultPromise"
problemName=MissingTypesProblem
+ },
+ // SI-9488: Due to SI-8362 above, toString was silently changed to the AtomicReference toString implementation,
+ // This is fixed by SI-9488, and this should be safe since the class in question is stdlib internal.
+ {
+ matchName="scala.concurrent.impl.Promise.toString"
+ problemName=MissingMethodProblem
}
]
}
diff --git a/src/library/scala/concurrent/impl/Promise.scala b/src/library/scala/concurrent/impl/Promise.scala
index b15601058e..6d2fc5c87c 100644
--- a/src/library/scala/concurrent/impl/Promise.scala
+++ b/src/library/scala/concurrent/impl/Promise.scala
@@ -19,6 +19,10 @@ import java.util.concurrent.locks.AbstractQueuedSynchronizer
private[concurrent] trait Promise[T] extends scala.concurrent.Promise[T] with scala.concurrent.Future[T] {
def future: this.type = this
+ override def toString: String = value match {
+ case Some(result) => "Future("+result+")"
+ case None => "Future(<not completed>)"
+ }
}
/* Precondition: `executor` is prepared, i.e., `executor` has been returned from invocation of `prepare` on some other `ExecutionContext`.
diff --git a/test/files/jvm/future-spec/FutureTests.scala b/test/files/jvm/future-spec/FutureTests.scala
index a290af9cd3..efe9c59d7a 100644
--- a/test/files/jvm/future-spec/FutureTests.scala
+++ b/test/files/jvm/future-spec/FutureTests.scala
@@ -24,7 +24,7 @@ class FutureTests extends MinimalScalaTest {
"A future with custom ExecutionContext" should {
"shouldHandleThrowables" in {
val ms = new mutable.HashSet[Throwable] with mutable.SynchronizedSet[Throwable]
- implicit val ec = scala.concurrent.ExecutionContext.fromExecutor(new scala.concurrent.forkjoin.ForkJoinPool(), {
+ implicit val ec = scala.concurrent.ExecutionContext.fromExecutorService(new scala.concurrent.forkjoin.ForkJoinPool(), {
t =>
ms += t
})
@@ -64,7 +64,7 @@ class FutureTests extends MinimalScalaTest {
Await.ready(waiting, 2000 millis)
ms.size mustBe (4)
- //FIXME should check
+ ec.shutdownNow()
}
}
@@ -543,6 +543,22 @@ class FutureTests extends MinimalScalaTest {
Await.ready(f, defaultTimeout).value.get.toString mustBe expected.toString
}
+ "should have a decent toString representation" in {
+ val i = scala.concurrent.forkjoin.ThreadLocalRandom.current.nextInt()
+ val e = new Exception(i.toString)
+ val successString = "Future(Success("+i+"))"
+ val failureString = "Future(Failure("+e+"))"
+ val notCompletedString = "Future(<not completed>)"
+
+ Future.successful(i).toString mustBe successString
+ Future.failed[Int](e).toString mustBe failureString
+ Promise[Int]().toString mustBe notCompletedString
+ Promise[Int]().success(i).toString mustBe successString
+ Promise[Int]().failure(e).toString mustBe failureString
+ Await.ready(Future(i)(ExecutionContext.global), defaultTimeout).toString mustBe successString
+ Await.ready(Future(throw e)(ExecutionContext.global), defaultTimeout).toString mustBe failureString
+ }
+
}
}