KT-5044 implement missing Range#contains tests and move it to separate package

This commit is contained in:
Vsevolod
2016-10-10 22:49:40 +03:00
committed by Dmitry Petrov
parent 0b3fb41eeb
commit d7ad27ac3b
13 changed files with 305 additions and 12 deletions
@@ -0,0 +1,15 @@
// WITH_RUNTIME
fun contains(set: Set<Any>, x: Int): Boolean = when {
set.size == 0 -> false
else -> x in set as Set<Int>
}
fun box(): String {
val set = setOf(1)
if (contains(set, 1)) {
return "OK"
}
return "Fail"
}
@@ -0,0 +1,18 @@
// WITH_RUNTIME
class ComparablePair<T : Comparable<T>>(val first: T, val second: T) : Comparable<ComparablePair<T>> {
override fun compareTo(other: ComparablePair<T>): Int {
val result = first.compareTo(other.first)
return if (result != 0) result else second.compareTo(other.second)
}
}
fun box(): String {
assert("a" !in "b".."c")
assert("b" in "a".."d")
assert(ComparablePair(2, 2) !in ComparablePair(1, 10)..ComparablePair(2, 1))
assert(ComparablePair(2, 2) in ComparablePair(2, 0)..ComparablePair(2, 10))
return "OK"
}
@@ -0,0 +1,18 @@
// WITH_RUNTIME
operator fun Int.rangeTo(right: String): ClosedRange<Int> = this..this + 1
operator fun Long.rangeTo(right: Double): ClosedRange<Long> = this..right.toLong() + 1
operator fun String.rangeTo(right: Int): ClosedRange<String> = this..this
fun box(): String {
assert(0 !in 1.."a")
assert(1 in 1.."a")
assert(0L !in 1L..2.0)
assert(2L in 1L..3.0)
assert("a" !in "b"..1)
assert("a" in "a"..1)
return "OK"
}
@@ -0,0 +1,33 @@
// WITH_RUNTIME
fun check(x: Double, left: Double, right: Double): Boolean {
val result = x in left..right
assert(result == checkUnoptimized(x, left..right))
return result
}
fun checkUnoptimized(x: Double, range: ClosedRange<Double>): Boolean {
return x in range
}
fun box(): String {
assert(check(1.0, 0.0, 2.0))
assert(!check(1.0, -1.0, 0.0))
assert(check(Double.MIN_VALUE, 0.0, 1.0))
assert(check(Double.MAX_VALUE, Double.MAX_VALUE - Double.MIN_VALUE, Double.MAX_VALUE))
assert(check(Double.NaN, Double.NaN, Double.NaN))
assert(!check(0.0, Double.NaN, Double.NaN))
assert(check(-0.0, -0.0, +0.0))
assert(check(-0.0, -0.0, -0.0))
assert(!check(-0.0, +0.0, +0.0))
assert(!check(+0.0, -0.0, -0.0))
assert(check(+0.0, +0.0, +0.0))
assert(check(+0.0, -0.0, +0.0))
var value = 0.0
assert(++value in 1.0..1.0)
assert(++value !in 1.0..1.0)
return "OK"
}
@@ -0,0 +1,33 @@
// WITH_RUNTIME
fun check(x: Float, left: Float, right: Float): Boolean {
val result = x in left..right
assert(result == checkUnoptimized(x, left..right))
return result
}
fun checkUnoptimized(x: Float, range: ClosedRange<Float>): Boolean {
return x in range
}
fun box(): String {
assert(check(1.0f, 0.0f, 2.0f))
assert(!check(1.0f, -1.0f, 0.0f))
assert(check(Float.MIN_VALUE, 0.0f, 1.0f))
assert(check(Float.MAX_VALUE, Float.MAX_VALUE - Float.MIN_VALUE, Float.MAX_VALUE))
assert(check(Float.NaN, Float.NaN, Float.NaN))
assert(!check(0.0f, Float.NaN, Float.NaN))
assert(check(-0.0f, -0.0f, +0.0f))
assert(check(-0.0f, -0.0f, -0.0f))
assert(!check(-0.0f, +0.0f, +0.0f))
assert(!check(+0.0f, -0.0f, -0.0f))
assert(check(+0.0f, +0.0f, +0.0f))
assert(check(+0.0f, -0.0f, +0.0f))
var value = 0.0f
assert(++value in 1.0f..1.0f)
assert(++value !in 1.0f..1.0f)
return "OK"
}
@@ -0,0 +1,26 @@
// WITH_RUNTIME
fun check(x: Int, left: Int, right: Int): Boolean {
val result = x in left..right
assert(result == checkUnoptimized(x, left..right))
return result
}
fun checkUnoptimized(x: Int, range: ClosedRange<Int>): Boolean {
return x in range
}
fun box(): String {
assert(check(1, 0, 2))
assert(!check(1, -1, 0))
assert(!check(239, 239, 238))
assert(check(239, 238, 239))
assert(check(Int.MIN_VALUE, Int.MIN_VALUE, Int.MIN_VALUE))
assert(check(Int.MAX_VALUE, Int.MIN_VALUE, Int.MAX_VALUE))
var value = 0
assert(++value in 1..1)
assert(++value !in 1..1)
return "OK"
}
@@ -0,0 +1,26 @@
// WITH_RUNTIME
fun check(x: Long, left: Long, right: Long): Boolean {
val result = x in left..right
assert(result == checkUnoptimized(x, left..right))
return result
}
fun checkUnoptimized(x: Long, range: ClosedRange<Long>): Boolean {
return x in range
}
fun box(): String {
assert(check(1L, 0L, 2L))
assert(!check(1L, -1L, 0L))
assert(!check(239L, 239L, 238L))
assert(check(239L, 238L, 239L))
assert(check(Long.MIN_VALUE, Long.MIN_VALUE, Long.MIN_VALUE))
assert(check(Long.MAX_VALUE, Long.MIN_VALUE, Long.MAX_VALUE))
var value = 0L
assert(++value in 1L..1L)
assert(++value !in 1L..1L)
return "OK"
}
@@ -0,0 +1,24 @@
// WITH_RUNTIME
class Value(val x: Int) : Comparable<Value> {
override fun compareTo(other: Value): Int {
throw AssertionError("Should not be called")
}
}
class ValueRange(override val start: Value,
override val endInclusive: Value) : ClosedRange<Value> {
override fun contains(value: Value): Boolean {
return value.x == 42
}
}
operator fun Value.rangeTo(other: Value): ClosedRange<Value> = ValueRange(this, other)
fun box(): String {
assert(Value(42) in Value(1)..Value(2))
assert(Value(41) !in Value(40)..Value(42))
return "OK"
}
@@ -0,0 +1,19 @@
// WITH_RUNTIME
fun Long.inLongs(l: Long, r: Long): Boolean {
return this in l..r
}
fun Double.inDoubles(l: Double, r: Double): Boolean {
return this in l..r
}
fun box(): String {
assert(2L.inLongs(1L, 3L))
assert(!2L.inLongs(0L, 1L))
assert(2.0.inDoubles(1.0, 3.0))
assert(!2.0.inDoubles(0.0, 1.0))
return "OK"
}
@@ -0,0 +1,12 @@
// WITH_RUNTIME
fun box(): String {
assert(Long.MAX_VALUE !in Int.MIN_VALUE..Int.MAX_VALUE)
assert(Int.MAX_VALUE in Long.MIN_VALUE..Long.MAX_VALUE)
assert(Double.MAX_VALUE !in Float.MIN_VALUE..Float.MAX_VALUE)
assert(Float.MIN_VALUE in 0..1)
assert(2.0 !in 1..0)
assert(1.0f in 0L..2L)
return "OK"
}