From 26952af9dc2cf2b33fe832ef62e65db73c9ada29 Mon Sep 17 00:00:00 2001 From: Chua Chee Seng Date: Thu, 4 Aug 2022 21:49:52 +0800 Subject: [PATCH 1/2] Replaced remaining GenTraversable in Prettifier with Iterable. --- .../src/main/scala/org/scalactic/Prettifier.scala | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/jvm/scalactic/src/main/scala/org/scalactic/Prettifier.scala b/jvm/scalactic/src/main/scala/org/scalactic/Prettifier.scala index 0c2e364e32..6e59a36816 100644 --- a/jvm/scalactic/src/main/scala/org/scalactic/Prettifier.scala +++ b/jvm/scalactic/src/main/scala/org/scalactic/Prettifier.scala @@ -101,7 +101,7 @@ import scala.util.Success *
  • `org.scalactic.Bad` to: `Bad("3")`
  • *
  • `org.scalactic.One` to: `One("3")`
  • *
  • `org.scalactic.Many` to: `Many("1", "2", "3")`
  • - *
  • `scala.collection.GenTraversable` to: `List("1", "2", "3")`
  • + *
  • `scala.collection.Iterable` to: `List("1", "2", "3")`
  • *
  • `java.util.Collection` to: `["1", "2", "3"]`
  • *
  • `java.util.Map` to: `{1="one", 2="two", 3="three"}`
  • * @@ -242,13 +242,13 @@ private[scalactic] class TruncatingPrettifier(sizeLimit: SizeLimit) extends Defa (taken.map { case (key, value) => // toIterator is needed for consistent ordering prettify(key, processed + aGenMap) + " -> " + prettify(value, processed + aGenMap) }).mkString(", ") + dotDotDotIfTruncated(truncated) + ")" - case aGenTraversable: GenTraversable[_] => - val (taken, truncated) = if (aGenTraversable.size > sizeLimit.value) (aGenTraversable.take(sizeLimit.value), true) else (aGenTraversable, false) - val className = aGenTraversable.getClass.getName + case aIterable: Iterable[_] => + val (taken, truncated) = if (aIterable.size > sizeLimit.value) (aIterable.take(sizeLimit.value), true) else (aIterable, false) + val className = aIterable.getClass.getName if (className.startsWith("scala.xml.NodeSeq$") || className == "scala.xml.NodeBuffer" || className == "scala.xml.Elem") - aGenTraversable.mkString + aIterable.mkString else - ColCompatHelper.className(aGenTraversable) + "(" + taken.toIterator.map(prettify(_, processed + aGenTraversable)).mkString(", ") + dotDotDotIfTruncated(truncated) + ")" // toIterator is needed for consistent ordering + ColCompatHelper.className(aIterable) + "(" + taken.toIterator.map(prettify(_, processed + aIterable)).mkString(", ") + dotDotDotIfTruncated(truncated) + ")" // toIterator is needed for consistent ordering // SKIP-SCALATESTJS-START case javaCol: java.util.Collection[_] => // By default java collection follows http://download.java.net/jdk7/archive/b123/docs/api/java/util/AbstractCollection.html#toString() @@ -322,7 +322,7 @@ object Prettifier { *
  • `org.scalactic.Bad` to: `Bad("3")`
  • *
  • `org.scalactic.One` to: `One("3")`
  • *
  • `org.scalactic.Many` to: `Many("1", "2", "3")`
  • - *
  • `scala.collection.GenTraversable` to: `List("1", "2", "3")`
  • + *
  • `scala.collection.Iterable` to: `List("1", "2", "3")`
  • *
  • `java.util.Collection` to: `["1", "2", "3"]`
  • *
  • `java.util.Map` to: `{1="one", 2="two", 3="three"}`
  • * From 363a6d3399415630401ae1e00af0303a11b36fe1 Mon Sep 17 00:00:00 2001 From: Chua Chee Seng Date: Fri, 5 Aug 2022 15:50:49 +0800 Subject: [PATCH 2/2] Calling .size on infinite collection may hang the program, let's call .hasDefiniteSize first before calling .size. --- .../src/main/scala/org/scalactic/Prettifier.scala | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/jvm/scalactic/src/main/scala/org/scalactic/Prettifier.scala b/jvm/scalactic/src/main/scala/org/scalactic/Prettifier.scala index 6e59a36816..ed87a7c280 100644 --- a/jvm/scalactic/src/main/scala/org/scalactic/Prettifier.scala +++ b/jvm/scalactic/src/main/scala/org/scalactic/Prettifier.scala @@ -224,26 +224,26 @@ private[scalactic] class TruncatingPrettifier(sizeLimit: SizeLimit) extends Defa override protected def prettifyCollection(o: Any, processed: Set[Any]): String = { o match { case many: Many[_] => - val (taken, truncated) = if (many.size > sizeLimit.value) (many.toIterator.take(sizeLimit.value), true) else (many.toIterator, false) + val (taken, truncated) = if (!many.hasDefiniteSize || many.size > sizeLimit.value) (many.toIterator.take(sizeLimit.value), true) else (many.toIterator, false) "Many(" + taken.map(prettify(_, processed + many)).mkString(", ") + dotDotDotIfTruncated(truncated) + ")" case anArray: Array[_] => - val (taken, truncated) = if (anArray.size > sizeLimit.value) (anArray.take(sizeLimit.value), true) else (anArray, false) + val (taken, truncated) = if (!anArray.hasDefiniteSize || anArray.size > sizeLimit.value) (anArray.take(sizeLimit.value), true) else (anArray, false) "Array(" + taken.map(prettify(_, processed + anArray)).mkString(", ") + dotDotDotIfTruncated(truncated) + ")" case aWrappedArray: WrappedArray[_] => - val (taken, truncated) = if (aWrappedArray.size > sizeLimit.value) (aWrappedArray.take(sizeLimit.value), true) else (aWrappedArray, false) + val (taken, truncated) = if (!aWrappedArray.hasDefiniteSize || aWrappedArray.size > sizeLimit.value) (aWrappedArray.take(sizeLimit.value), true) else (aWrappedArray, false) "Array(" + taken.map(prettify(_, processed + aWrappedArray)).mkString(", ") + dotDotDotIfTruncated(truncated) + ")" case a if ArrayHelper.isArrayOps(a) => val anArrayOps = ArrayHelper.asArrayOps(a)// val (taken, truncated) = if (anArrayOps.size > sizeLimit.value) (anArrayOps.iterator.take(sizeLimit.value), true) else (anArrayOps.iterator, false) "Array(" + taken.map(prettify(_, processed + anArrayOps)).mkString(", ") + dotDotDotIfTruncated(truncated) + ")" case aGenMap: scala.collection.GenMap[_, _] => - val (taken, truncated) = if (aGenMap.size > sizeLimit.value) (aGenMap.toIterator.take(sizeLimit.value), true) else (aGenMap.toIterator, false) + val (taken, truncated) = if (!aGenMap.hasDefiniteSize || aGenMap.size > sizeLimit.value) (aGenMap.toIterator.take(sizeLimit.value), true) else (aGenMap.toIterator, false) ColCompatHelper.className(aGenMap) + "(" + (taken.map { case (key, value) => // toIterator is needed for consistent ordering prettify(key, processed + aGenMap) + " -> " + prettify(value, processed + aGenMap) }).mkString(", ") + dotDotDotIfTruncated(truncated) + ")" case aIterable: Iterable[_] => - val (taken, truncated) = if (aIterable.size > sizeLimit.value) (aIterable.take(sizeLimit.value), true) else (aIterable, false) + val (taken, truncated) = if (!aIterable.hasDefiniteSize || aIterable.size > sizeLimit.value) (aIterable.take(sizeLimit.value), true) else (aIterable, false) val className = aIterable.getClass.getName if (className.startsWith("scala.xml.NodeSeq$") || className == "scala.xml.NodeBuffer" || className == "scala.xml.Elem") aIterable.mkString