diff options
Diffstat (limited to 'test/files')
-rw-r--r-- | test/files/run/t4658.check | 7 | ||||
-rw-r--r-- | test/files/run/t4658.scala | 11 | ||||
-rw-r--r-- | test/files/scalacheck/range.scala | 17 |
3 files changed, 31 insertions, 4 deletions
diff --git a/test/files/run/t4658.check b/test/files/run/t4658.check index bb6405175e..3bc52daef3 100644 --- a/test/files/run/t4658.check +++ b/test/files/run/t4658.check @@ -1,5 +1,5 @@ Ranges: -1073741824 +-1073741824 1073741824 0 0 @@ -20,7 +20,7 @@ Ranges: -10 IntRanges: -1073741824 --1073741824 +1073741824 0 0 55 @@ -78,3 +78,6 @@ BigIntRanges: -24 -30 -10 +BigInt agrees with Long: true +Long agrees with Int when rounded: true +Numeric Int agrees with Range: true diff --git a/test/files/run/t4658.scala b/test/files/run/t4658.scala index 8c07c50694..7fc6d4584c 100644 --- a/test/files/run/t4658.scala +++ b/test/files/run/t4658.scala @@ -2,6 +2,7 @@ import scala.collection.immutable.NumericRange //#4658 object Test { + // Only works for Int values! Need to rethink explicit otherwise. case class R(start: Int, end: Int, step: Int = 1, inclusive: Boolean = true) val rangeData = Array( @@ -28,6 +29,14 @@ object Test { numericLongRanges.foreach{range => println(range.sum)} println("BigIntRanges:") numericBigIntRanges.foreach{range => println(range.sum)} + println("BigInt agrees with Long: " + + (numericLongRanges zip numericBigIntRanges).forall{ case (lr, bir) => lr.sum == bir.sum } + ) + println("Long agrees with Int when rounded: " + + (numericLongRanges zip numericIntRanges).forall{ case (lr, ir) => lr.sum.toInt == ir.sum } + ) + println("Numeric Int agrees with Range: " + + (numericIntRanges zip ranges).forall{ case (ir, r) => ir.sum == r.sum } + ) } - }
\ No newline at end of file diff --git a/test/files/scalacheck/range.scala b/test/files/scalacheck/range.scala index 493083a51f..ac24b52f8d 100644 --- a/test/files/scalacheck/range.scala +++ b/test/files/scalacheck/range.scala @@ -134,7 +134,22 @@ abstract class RangeTest(kind: String) extends Properties("Range "+kind) { val expected = r.length match { case 0 => 0 case 1 => r.head - case _ => ((r.head + r.last).toLong * r.length / 2).toInt + case x if x < 1000 => + // Explicit sum, to guard against having the same mistake in both the + // range implementation and test implementation of sum formula. + // (Yes, this happened before.) + var i = r.head + var s = 0L + var n = x + while (n > 0) { + s += i + i += r.step + n -= 1 + } + s.toInt + case _ => + // Make sure head + last doesn't overflow! + ((r.head.toLong + r.last) * r.length / 2).toInt } // println("size: " + r.length) // println("expected: " + expected) |