75 lines
2.4 KiB
Kotlin
75 lines
2.4 KiB
Kotlin
/*
|
|
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
|
*/
|
|
|
|
package test.random
|
|
|
|
import kotlin.concurrent.AtomicInt
|
|
import kotlin.native.concurrent.*
|
|
import kotlin.random.*
|
|
import kotlin.test.*
|
|
|
|
// Native-specific part of stdlib/test/random/RandomTest.kt
|
|
class SeededRandomSmokeNativeTest {
|
|
val subject: Random get() = seededRandomSmokeTestSubject
|
|
|
|
@Test
|
|
fun sameIntSeedNextLong() {
|
|
val v = subject.nextInt(1..Int.MAX_VALUE)
|
|
for (seed in listOf(v, -v)) {
|
|
testSameSeededRandoms(Random(seed), Random(seed), seed) { nextLong() }
|
|
}
|
|
}
|
|
|
|
@Test
|
|
fun sameIntSeedNextIntWithLimit() {
|
|
val v = subject.nextInt(1..Int.MAX_VALUE)
|
|
for (seed in listOf(v, -v)) {
|
|
testSameSeededRandoms(Random(seed), Random(seed), seed) { nextInt(1000) }
|
|
}
|
|
}
|
|
|
|
private inline fun <reified T> testSameSeededRandoms(r1: Random, r2: Random, seed: Any, generator: Random.() -> T) {
|
|
val seq1 = List(10) { r1.generator() }
|
|
val seq2 = List(10) { r2.generator() }
|
|
|
|
assertEquals(seq1, seq2, "Generators seeded with $seed should produce the same output")
|
|
}
|
|
}
|
|
|
|
class MultiThreadedRandomSmokeTest {
|
|
val subject: Random get() = Random
|
|
|
|
@Test
|
|
fun nextInt() {
|
|
val workers = Array(10) { Worker.start() }
|
|
val canStart = AtomicInt(0)
|
|
val futures = workers.map {
|
|
it.execute(TransferMode.SAFE, { subject to canStart }) { (subject, canStart) ->
|
|
var result1 = 0
|
|
var result2 = -1
|
|
while (canStart.value == 0) {}
|
|
repeat(100) {
|
|
val r = subject.nextInt()
|
|
result1 = result1 or r
|
|
result2 = result2 and r
|
|
}
|
|
result1 to result2
|
|
}
|
|
}
|
|
canStart.value = 1
|
|
var result1 = 0
|
|
var result2 = -1
|
|
futures.forEach {
|
|
val (r1, r2) = it.result
|
|
result1 = result1 or r1
|
|
result2 = result2 and r2
|
|
}
|
|
assertEquals(-1, result1, "All one bits should present")
|
|
assertEquals(0, result2, "All zero bits should present")
|
|
workers.forEach {
|
|
it.requestTermination().result
|
|
}
|
|
}
|
|
} |