/* * Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license * that can be found in the LICENSE file. */ package runtime.basic.random import kotlin.collections.* import kotlin.random.* import kotlin.system.* import kotlin.test.* /** * Tests that setting the same seed make random generate the same sequence */ private inline fun testReproducibility(seed: Long, generator: Random.() -> T) { // Reset seed. This will make Random to start a new sequence val r1 = Random(seed) val first = Array(50, { i -> r1.generator() }).toList() // Reset seed and try again val r2 = Random(seed) val second = Array(50, { i -> r2.generator() }).toList() assertTrue(first == second, "FAIL: got different sequences of generated values " + "first: $first, second: $second") } /** * Tests that setting seed makes random generate different sequence. */ private inline fun testDifference(generator: Random.() -> T) { val r1 = Random(12345678L) val first = Array(100, { i -> r1.generator() }).toList() val r2 = Random(87654321L) val second = Array(100, { i -> r2.generator() }).toList() assertTrue(first != second, "FAIL: got the same sequence of generated values " + "first: $first, second: $second") } @Test fun testInts() { testReproducibility(getTimeMillis(), { nextInt() }) testReproducibility(Long.MAX_VALUE, { nextInt() }) } @Test fun testLong() { testReproducibility(getTimeMillis(), { nextLong() }) testReproducibility(Long.MAX_VALUE, { nextLong() }) } @Test fun testDiffInt() = testDifference { nextInt() } @Test fun testDiffLong() = testDifference { nextLong() } @Test fun testNextInt() { testReproducibility(getTimeMillis(), { nextInt(1000) }) testReproducibility(1000L, { nextInt(1024) }) }