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:
@@ -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)
|
||||||
|
}
|
||||||
|
"""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user