1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
|
import org.scalacheck._
import Gen._
import Prop._
object Test extends Properties("NaN-Ordering") {
val specFloats: Gen[Float] = oneOf(
Float.MaxValue,
Float.MinPositiveValue,
Float.MinValue,
Float.NaN,
Float.NegativeInfinity,
Float.PositiveInfinity,
-0.0f,
+0.0f
)
property("Float min") = forAll(specFloats, specFloats) { (d1, d2) => {
val mathmin = math.min(d1, d2)
val numericmin = d1 min d2
mathmin == numericmin || mathmin.isNaN && numericmin.isNaN
}
}
property("Float max") = forAll(specFloats, specFloats) { (d1, d2) => {
val mathmax = math.max(d1, d2)
val numericmax = d1 max d2
mathmax == numericmax || mathmax.isNaN && numericmax.isNaN
}
}
val numFloat = implicitly[Numeric[Float]]
property("Float lt") = forAll(specFloats, specFloats) { (d1, d2) => numFloat.lt(d1, d2) == d1 < d2 }
property("Float lteq") = forAll(specFloats, specFloats) { (d1, d2) => numFloat.lteq(d1, d2) == d1 <= d2 }
property("Float gt") = forAll(specFloats, specFloats) { (d1, d2) => numFloat.gt(d1, d2) == d1 > d2 }
property("Float gteq") = forAll(specFloats, specFloats) { (d1, d2) => numFloat.gteq(d1, d2) == d1 >= d2 }
property("Float equiv") = forAll(specFloats, specFloats) { (d1, d2) => numFloat.equiv(d1, d2) == (d1 == d2) }
property("Float reverse.min") = forAll(specFloats, specFloats) { (d1, d2) => {
val mathmax = math.max(d1, d2)
val numericmin = numFloat.reverse.min(d1, d2)
mathmax == numericmin || mathmax.isNaN && numericmin.isNaN
}
}
property("Float reverse.max") = forAll(specFloats, specFloats) { (d1, d2) => {
val mathmin = math.min(d1, d2)
val numericmax = numFloat.reverse.max(d1, d2)
mathmin == numericmax || mathmin.isNaN && numericmax.isNaN
}
}
property("Float reverse.lt") = forAll(specFloats, specFloats) { (d1, d2) => numFloat.reverse.lt(d1, d2) == d2 < d1 }
property("Float reverse.lteq") = forAll(specFloats, specFloats) { (d1, d2) => numFloat.reverse.lteq(d1, d2) == d2 <= d1 }
property("Float reverse.gt") = forAll(specFloats, specFloats) { (d1, d2) => numFloat.reverse.gt(d1, d2) == d2 > d1 }
property("Float reverse.gteq") = forAll(specFloats, specFloats) { (d1, d2) => numFloat.reverse.gteq(d1, d2) == d2 >= d1 }
property("Float reverse.equiv") = forAll(specFloats, specFloats) { (d1, d2) => numFloat.reverse.equiv(d1, d2) == (d1 == d2) }
val specDoubles: Gen[Double] = oneOf(
Double.MaxValue,
Double.MinPositiveValue,
Double.MinValue,
Double.NaN,
Double.NegativeInfinity,
Double.PositiveInfinity,
-0.0,
+0.0
)
// ticket #5104
property("Double min") = forAll(specDoubles, specDoubles) { (d1, d2) => {
val mathmin = math.min(d1, d2)
val numericmin = d1 min d2
mathmin == numericmin || mathmin.isNaN && numericmin.isNaN
}
}
property("Double max") = forAll(specDoubles, specDoubles) { (d1, d2) => {
val mathmax = math.max(d1, d2)
val numericmax = d1 max d2
mathmax == numericmax || mathmax.isNaN && numericmax.isNaN
}
}
val numDouble = implicitly[Numeric[Double]]
property("Double lt") = forAll(specDoubles, specDoubles) { (d1, d2) => numDouble.lt(d1, d2) == d1 < d2 }
property("Double lteq") = forAll(specDoubles, specDoubles) { (d1, d2) => numDouble.lteq(d1, d2) == d1 <= d2 }
property("Double gt") = forAll(specDoubles, specDoubles) { (d1, d2) => numDouble.gt(d1, d2) == d1 > d2 }
property("Double gteq") = forAll(specDoubles, specDoubles) { (d1, d2) => numDouble.gteq(d1, d2) == d1 >= d2 }
property("Double equiv") = forAll(specDoubles, specDoubles) { (d1, d2) => numDouble.equiv(d1, d2) == (d1 == d2) }
property("Double reverse.min") = forAll(specDoubles, specDoubles) { (d1, d2) => {
val mathmax = math.max(d1, d2)
val numericmin = numDouble.reverse.min(d1, d2)
mathmax == numericmin || mathmax.isNaN && numericmin.isNaN
}
}
property("Double reverse.max") = forAll(specDoubles, specDoubles) { (d1, d2) => {
val mathmin = math.min(d1, d2)
val numericmax = numDouble.reverse.max(d1, d2)
mathmin == numericmax || mathmin.isNaN && numericmax.isNaN
}
}
property("Double reverse.lt") = forAll(specDoubles, specDoubles) { (d1, d2) => numDouble.reverse.lt(d1, d2) == d2 < d1 }
property("Double reverse.lteq") = forAll(specDoubles, specDoubles) { (d1, d2) => numDouble.reverse.lteq(d1, d2) == d2 <= d1 }
property("Double reverse.gt") = forAll(specDoubles, specDoubles) { (d1, d2) => numDouble.reverse.gt(d1, d2) == d2 > d1 }
property("Double reverse.gteq") = forAll(specDoubles, specDoubles) { (d1, d2) => numDouble.reverse.gteq(d1, d2) == d2 >= d1 }
property("Double reverse.equiv") = forAll(specDoubles, specDoubles) { (d1, d2) => numDouble.reverse.equiv(d1, d2) == (d1 == d2) }
}
|