Refine the exception type of EmptyRange.random()

Make it the same type as in case of an empty collection, so that
`emptyRange.random()` throws the same exception as `emptyRange.toList().random()`.

#KT-15539
This commit is contained in:
Ilya Gorbunov
2018-08-27 04:07:10 +03:00
parent 9c412ba436
commit 009980944b
4 changed files with 40 additions and 6 deletions
@@ -58,7 +58,11 @@ public inline fun CharRange.random(): Char {
*/ */
@SinceKotlin("1.3") @SinceKotlin("1.3")
public fun IntRange.random(random: Random): Int { public fun IntRange.random(random: Random): Int {
return random.nextInt(this) try {
return random.nextInt(this)
} catch(e: IllegalArgumentException) {
throw NoSuchElementException(e.message)
}
} }
/** /**
@@ -68,7 +72,11 @@ public fun IntRange.random(random: Random): Int {
*/ */
@SinceKotlin("1.3") @SinceKotlin("1.3")
public fun LongRange.random(random: Random): Long { public fun LongRange.random(random: Random): Long {
return random.nextLong(this) try {
return random.nextLong(this)
} catch(e: IllegalArgumentException) {
throw NoSuchElementException(e.message)
}
} }
/** /**
@@ -78,7 +86,11 @@ public fun LongRange.random(random: Random): Long {
*/ */
@SinceKotlin("1.3") @SinceKotlin("1.3")
public fun CharRange.random(random: Random): Char { public fun CharRange.random(random: Random): Char {
return random.nextInt(first.toInt(), last.toInt() + 1).toChar() try {
return random.nextInt(first.toInt(), last.toInt() + 1).toChar()
} catch(e: IllegalArgumentException) {
throw NoSuchElementException(e.message)
}
} }
/** /**
@@ -50,7 +50,11 @@ public inline fun ULongRange.random(): ULong {
@SinceKotlin("1.3") @SinceKotlin("1.3")
@ExperimentalUnsignedTypes @ExperimentalUnsignedTypes
public fun UIntRange.random(random: Random): UInt { public fun UIntRange.random(random: Random): UInt {
return random.nextUInt(this) try {
return random.nextUInt(this)
} catch(e: IllegalArgumentException) {
throw NoSuchElementException(e.message)
}
} }
/** /**
@@ -61,7 +65,11 @@ public fun UIntRange.random(random: Random): UInt {
@SinceKotlin("1.3") @SinceKotlin("1.3")
@ExperimentalUnsignedTypes @ExperimentalUnsignedTypes
public fun ULongRange.random(random: Random): ULong { public fun ULongRange.random(random: Random): ULong {
return random.nextULong(this) try {
return random.nextULong(this)
} catch(e: IllegalArgumentException) {
throw NoSuchElementException(e.message)
}
} }
/** /**
@@ -388,4 +388,12 @@ public class RangeTest {
assertFailsWithIllegalArgument { UIntProgression.fromClosedRange(0u, 1u, Int.MIN_VALUE) } assertFailsWithIllegalArgument { UIntProgression.fromClosedRange(0u, 1u, Int.MIN_VALUE) }
assertFailsWithIllegalArgument { ULongProgression.fromClosedRange(0u, 1u, Long.MIN_VALUE) } assertFailsWithIllegalArgument { ULongProgression.fromClosedRange(0u, 1u, Long.MIN_VALUE) }
} }
@Test fun randomInEmptyRange() {
assertFailsWith<NoSuchElementException> { IntRange.EMPTY.random() }
assertFailsWith<NoSuchElementException> { LongRange.EMPTY.random() }
assertFailsWith<NoSuchElementException> { CharRange.EMPTY.random() }
assertFailsWith<NoSuchElementException> { UIntRange.EMPTY.random() }
assertFailsWith<NoSuchElementException> { ULongRange.EMPTY.random() }
}
} }
@@ -877,7 +877,13 @@ object Elements : TemplateGroupBase() {
PrimitiveType.Char -> "nextInt(first.toInt(), last.toInt() + 1).toChar()" PrimitiveType.Char -> "nextInt(first.toInt(), last.toInt() + 1).toChar()"
else -> "next$primitive(this)" else -> "next$primitive(this)"
} }
"""return random.$expr""" """
try {
return random.$expr
} catch(e: IllegalArgumentException) {
throw NoSuchElementException(e.message)
}
"""
} }
} }
} }