blob: 2c6d1acdc2e186d759cd7c620aa01789e52473c9 [file] [log] [blame]
package test.ranges
import kotlin.test.*
public class RangeTest {
@Test fun intRange() {
val range = -5..9
assertFalse(-1000 in range)
assertFalse(-6 in range)
assertTrue(-5 in range)
assertTrue(-4 in range)
assertTrue(0 in range)
assertTrue(3 in range)
assertTrue(8 in range)
assertTrue(9 in range)
assertFalse(10 in range)
assertFalse(9000 in range)
assertFalse(range.isEmpty())
assertTrue(9 in (range as ClosedRange<Int>))
assertFalse((range as ClosedRange<Int>).isEmpty())
assertTrue(1.toShort() in range)
assertTrue(1.toByte() in range)
assertTrue(1.toLong() in range)
assertTrue(1.toFloat() in range)
assertTrue(1.toDouble() in range)
assertFalse(Long.MAX_VALUE in range)
val openRange = 1 until 10
assertTrue(9 in openRange)
assertFalse(10 in openRange)
assertTrue((1 until Int.MIN_VALUE).isEmpty())
}
@Test fun byteRange() {
val range = (-5).toByte()..9.toByte()
assertFalse((-100).toByte() in range)
assertFalse((-6).toByte() in range)
assertTrue((-5).toByte() in range)
assertTrue((-4).toByte() in range)
assertTrue(0.toByte() in range)
assertTrue(3.toByte() in range)
assertTrue(8.toByte() in range)
assertTrue(9.toByte() in range)
assertFalse(10.toByte() in range)
assertFalse(111.toByte() in range)
assertFalse(range.isEmpty())
assertTrue(1.toShort() in range)
assertTrue(1.toInt() in range)
assertTrue(1.toLong() in range)
assertTrue(1.toFloat() in range)
assertTrue(1.toDouble() in range)
assertFalse(Long.MAX_VALUE in range)
val openRange = 1.toByte() until 10.toByte()
assertTrue(9.toByte() in openRange)
assertFalse(10.toByte() in openRange)
// byte arguments now construct IntRange so no overflow here
assertTrue((0.toByte() until Byte.MIN_VALUE).isEmpty())
assertTrue((0.toByte() until Int.MIN_VALUE).isEmpty())
}
@Test fun shortRange() {
val range = (-5).toShort()..9.toShort()
assertFalse((-1000).toShort() in range)
assertFalse((-6).toShort() in range)
assertTrue((-5).toShort() in range)
assertTrue((-4).toShort() in range)
assertTrue(0.toShort() in range)
assertTrue(3.toShort() in range)
assertTrue(8.toShort() in range)
assertTrue(9.toShort() in range)
assertFalse(10.toShort() in range)
assertFalse(239.toShort() in range)
assertFalse(range.isEmpty())
assertTrue(1.toByte() in range)
assertTrue(1.toInt() in range)
assertTrue(1.toLong() in range)
assertTrue(1.toFloat() in range)
assertTrue(1.toDouble() in range)
assertFalse(Long.MAX_VALUE in range)
val openRange = 1.toShort() until 10.toShort()
assertTrue(9.toShort() in openRange)
assertFalse(10.toShort() in openRange)
assertTrue((0.toShort() until Short.MIN_VALUE).isEmpty())
assertTrue((0.toShort() until Int.MIN_VALUE).isEmpty())
}
@Test fun longRange() {
val range = -5L..9L
assertFalse(-10000000L in range)
assertFalse(-6L in range)
assertTrue(-5L in range)
assertTrue(-4L in range)
assertTrue(0L in range)
assertTrue(3L in range)
assertTrue(8L in range)
assertTrue(9L in range)
assertFalse(10L in range)
assertFalse(10000000L in range)
assertFalse(range.isEmpty())
assertTrue(9 in (range as ClosedRange<Long>))
assertFalse((range as ClosedRange<Long>).isEmpty())
assertTrue(1.toByte() in range)
assertTrue(1.toShort() in range)
assertTrue(1.toInt() in range)
assertTrue(1.toFloat() in range)
assertTrue(1.toDouble() in range)
assertFalse(Double.MAX_VALUE in range)
val openRange = 1L until 10L
assertTrue(9L in openRange)
assertFalse(10L in openRange)
assertTrue((0 until Long.MIN_VALUE).isEmpty())
assertTrue((0L until Long.MIN_VALUE).isEmpty())
}
@Test fun charRange() {
val range = 'c'..'w'
assertFalse('0' in range)
assertFalse('b' in range)
assertTrue('c' in range)
assertTrue('d' in range)
assertTrue('h' in range)
assertTrue('m' in range)
assertTrue('v' in range)
assertTrue('w' in range)
assertFalse('z' in range)
assertFalse('\u1000' in range)
assertFalse(range.isEmpty())
assertTrue('v' in (range as ClosedRange<Char>))
assertFalse((range as ClosedRange<Char>).isEmpty())
val openRange = 'A' until 'Z'
assertTrue('Y' in openRange)
assertFalse('Z' in openRange)
assertTrue(('A' until '\u0000').isEmpty())
}
@Test fun doubleRange() {
val range = -1.0..3.14159265358979
assertFalse(-1e200 in range)
assertFalse(-100.0 in range)
assertFalse(-1.00000000001 in range)
assertTrue(-1.0 in range)
assertTrue(-0.99999999999 in range)
assertTrue(0.0 in range)
assertTrue(1.5 in range)
assertTrue(3.1415 in range)
assertTrue(3.14159265358979 in range)
assertFalse(3.15 in range)
assertFalse(10.0 in range)
assertFalse(1e200 in range)
assertFalse(range.isEmpty())
assertTrue(1.toByte() in range)
assertTrue(1.toShort() in range)
assertTrue(1.toInt() in range)
assertTrue(1.toLong() in range)
assertTrue(1.toFloat() in range)
val zeroRange = 0.0..-0.0
assertFalse(zeroRange.isEmpty())
assertTrue(-0.0 in zeroRange)
assertTrue(-0.0F in zeroRange)
val normalZeroRange = -0.0..0.0
assertEquals(zeroRange, normalZeroRange)
assertEquals(zeroRange.hashCode(), normalZeroRange.hashCode())
val nanRange = 0.0..Double.NaN
assertFalse(1.0 in nanRange)
assertFalse(Double.NaN in nanRange)
assertFalse(Float.NaN in nanRange)
assertTrue(nanRange.isEmpty())
val halfInfRange = 0.0..Double.POSITIVE_INFINITY
assertTrue(Double.POSITIVE_INFINITY in halfInfRange)
assertFalse(Double.NEGATIVE_INFINITY in halfInfRange)
assertFalse(Double.NaN in halfInfRange)
assertTrue(Float.POSITIVE_INFINITY in halfInfRange)
}
@Test fun floatRange() {
val range = -1.0f..3.14159f
assertFalse(-1e30f in range)
assertFalse(-100.0f in range)
assertFalse(-1.00001f in range)
assertTrue(-1.0f in range)
assertTrue(-0.99999f in range)
assertTrue(0.0f in range)
assertTrue(1.5f in range)
assertTrue(3.1415f in range)
assertTrue(3.14159f in range)
assertFalse(3.15f in range)
assertFalse(10.0f in range)
assertFalse(1e30f in range)
assertFalse(range.isEmpty())
assertTrue(1.toByte() in range)
assertTrue(1.toShort() in range)
assertTrue(1.toInt() in range)
assertTrue(1.toLong() in range)
assertTrue(1.toDouble() in range)
assertFalse(Double.MAX_VALUE in range)
val zeroRange = 0.0F..-0.0F
assertFalse(zeroRange.isEmpty())
assertTrue(-0.0F in zeroRange)
val normalZeroRange = -0.0F..0.0F
assertEquals(zeroRange, normalZeroRange)
assertEquals(zeroRange.hashCode(), normalZeroRange.hashCode())
val nanRange = 0.0F..Float.NaN
assertFalse(1.0F in nanRange)
assertFalse(Float.NaN in nanRange)
assertTrue(nanRange.isEmpty())
val halfInfRange = 0.0F..Float.POSITIVE_INFINITY
assertTrue(Float.POSITIVE_INFINITY in halfInfRange)
assertFalse(Float.NEGATIVE_INFINITY in halfInfRange)
assertFalse(Float.NaN in halfInfRange)
assertTrue(Double.POSITIVE_INFINITY in halfInfRange)
assertTrue(Double.MAX_VALUE in halfInfRange)
}
@Test fun isEmpty() {
assertTrue((2..1).isEmpty())
assertTrue((2L..0L).isEmpty())
assertTrue((1.toShort()..-1.toShort()).isEmpty())
assertTrue((0.toByte()..-1.toByte()).isEmpty())
assertTrue((0f..-3.14f).isEmpty())
assertTrue((-2.72..-3.14).isEmpty())
assertTrue(('z'..'x').isEmpty())
assertTrue((1 downTo 2).isEmpty())
assertTrue((0L downTo 2L).isEmpty())
assertFalse((2 downTo 1).isEmpty())
assertFalse((2L downTo 0L).isEmpty())
assertTrue(('a' downTo 'z').isEmpty())
assertTrue(('z'..'a' step 2).isEmpty())
assertTrue(("range".."progression").isEmpty())
}
@Test fun emptyEquals() {
assertTrue(IntRange.EMPTY == IntRange.EMPTY)
assertEquals(IntRange.EMPTY, IntRange.EMPTY)
assertEquals(0L..42L, 0L..42L)
assertEquals(0L..4200000042000000L, 0L..4200000042000000L)
assertEquals(3 downTo 0, 3 downTo 0)
assertEquals(2..1, 1..0)
assertEquals(2L..1L, 1L..0L)
assertEquals(2.toShort()..1.toShort(), 1.toShort()..0.toShort())
assertEquals(2.toByte()..1.toByte(), 1.toByte()..0.toByte())
assertEquals(0f..-3.14f, 3.14f..0f)
assertEquals(-2.0..-3.0, 3.0..2.0)
assertEquals('b'..'a', 'c'..'b')
assertTrue(1 downTo 2 == 2 downTo 3)
assertTrue(-1L downTo 0L == -2L downTo -1L)
assertEquals('j'..'a' step 4, 'u'..'q' step 2)
assertFalse(0..1 == IntRange.EMPTY)
assertEquals("range".."progression", "hashcode".."equals")
assertFalse(("aa".."bb") == ("aaa".."bbb"))
}
@Test fun emptyHashCode() {
assertEquals((0..42).hashCode(), (0..42).hashCode())
assertEquals((1.23..4.56).hashCode(), (1.23..4.56).hashCode())
assertEquals((0..-1).hashCode(), IntRange.EMPTY.hashCode())
assertEquals((2L..1L).hashCode(), (1L..0L).hashCode())
assertEquals((0.toShort()..-1.toShort()).hashCode(), (42.toShort()..0.toShort()).hashCode())
assertEquals((0.toByte()..-1.toByte()).hashCode(), (42.toByte()..0.toByte()).hashCode())
assertEquals((0f..-3.14f).hashCode(), (2.39f..1.41f).hashCode())
assertEquals((0.0..-10.0).hashCode(), (10.0..0.0).hashCode())
assertEquals(('z'..'x').hashCode(), ('l'..'k').hashCode())
assertEquals((1 downTo 2).hashCode(), (2 downTo 3).hashCode())
assertEquals((1L downTo 2L).hashCode(), (2L downTo 3L).hashCode())
assertEquals(('a' downTo 'b').hashCode(), ('c' downTo 'd').hashCode())
assertEquals(("range".."progression").hashCode(), ("hashcode".."equals").hashCode())
}
@Test fun comparableRange() {
val range = "island".."isle"
assertFalse("apple" in range)
assertFalse("icicle" in range)
assertTrue("island" in range)
assertTrue("isle" in range)
assertTrue("islandic" in range)
assertFalse("item" in range)
assertFalse("trail" in range)
assertFalse(range.isEmpty())
}
private fun assertFailsWithIllegalArgument(f: () -> Unit) = assertFailsWith<IllegalArgumentException> { f() }
@Test fun illegalProgressionCreation() {
// create Progression explicitly with increment = 0
assertFailsWithIllegalArgument { IntProgression.fromClosedRange(0, 5, 0) }
assertFailsWithIllegalArgument { LongProgression.fromClosedRange(0, 5, 0) }
assertFailsWithIllegalArgument { CharProgression.fromClosedRange('a', 'z', 0) }
assertFailsWithIllegalArgument { 0..5 step 0 }
assertFailsWithIllegalArgument { 0.toByte()..5.toByte() step 0 }
assertFailsWithIllegalArgument { 0.toShort()..5.toShort() step 0 }
assertFailsWithIllegalArgument { 0L..5L step 0L }
assertFailsWithIllegalArgument { 'a'..'z' step 0 }
assertFailsWithIllegalArgument { 0 downTo -5 step 0 }
assertFailsWithIllegalArgument { 0.toByte() downTo -5.toByte() step 0 }
assertFailsWithIllegalArgument { 0.toShort() downTo -5.toShort() step 0 }
assertFailsWithIllegalArgument { 0L downTo -5L step 0L }
assertFailsWithIllegalArgument { 'z' downTo 'a' step 0 }
assertFailsWithIllegalArgument { 0..5 step -2 }
assertFailsWithIllegalArgument { 0.toByte()..5.toByte() step -2 }
assertFailsWithIllegalArgument { 0.toShort()..5.toShort() step -2 }
assertFailsWithIllegalArgument { 0L..5L step -2L }
assertFailsWithIllegalArgument { 'a'..'z' step -2 }
assertFailsWithIllegalArgument { 0 downTo -5 step -2 }
assertFailsWithIllegalArgument { 0.toByte() downTo -5.toByte() step -2 }
assertFailsWithIllegalArgument { 0.toShort() downTo -5.toShort() step -2 }
assertFailsWithIllegalArgument { 0L downTo -5L step -2L }
assertFailsWithIllegalArgument { 'z' downTo 'a' step -2 }
}
}