TestRandom

trait TestRandom extends Random with Restorable

TestRandom allows for deterministically testing effects involving randomness.

TestRandom operates in two modes. In the first mode, TestRandom is a purely functional pseudo-random number generator. It will generate pseudo-random values just like scala.util.Random except that no internal state is mutated. Instead, methods like nextInt describe state transitions from one random state to another that are automatically composed together through methods like flatMap. The random seed can be set using setSeed and TestRandom is guaranteed to return the same sequence of values for any given seed. This is useful for deterministically generating a sequence of pseudo-random values and powers the property based testing functionality in ZIO Test.

In the second mode, TestRandom maintains an internal buffer of values that can be "fed" with methods such as feedInts and then when random values of that type are generated they will first be taken from the buffer. This is useful for verifying that functions produce the expected output for a given sequence of "random" inputs.

import zio.Random
import zio.test.TestRandom

for {
 _ <- TestRandom.feedInts(4, 5, 2)
 x <- Random.nextIntBounded(6)
 y <- Random.nextIntBounded(6)
 z <- Random.nextIntBounded(6)
} yield x + y + z == 11

TestRandom will automatically take values from the buffer if a value of the appropriate type is available and otherwise generate a pseudo-random value, so there is nothing you need to do to switch between the two modes. Just generate random values as you normally would to get pseudo-random values, or feed in values of your own to get those values back. You can also use methods like clearInts to clear the buffer of values of a given type so you can fill the buffer with new values or go back to pseudo-random number generation.

Companion:
object
trait Random
class Object
trait Matchable
class Any
class Test

Type members

Inherited classlikes

trait UnsafeAPI
Inherited from:
Random

Value members

Abstract methods

def clearBooleans(implicit trace: Trace): UIO[Unit]
def clearBytes(implicit trace: Trace): UIO[Unit]
def clearChars(implicit trace: Trace): UIO[Unit]
def clearDoubles(implicit trace: Trace): UIO[Unit]
def clearFloats(implicit trace: Trace): UIO[Unit]
def clearInts(implicit trace: Trace): UIO[Unit]
def clearLongs(implicit trace: Trace): UIO[Unit]
def clearStrings(implicit trace: Trace): UIO[Unit]
def clearUUIDs(implicit trace: Trace): UIO[Unit]
def feedBooleans(booleans: Boolean*)(implicit trace: Trace): UIO[Unit]
def feedBytes(bytes: Chunk[Byte]*)(implicit trace: Trace): UIO[Unit]
def feedChars(chars: Char*)(implicit trace: Trace): UIO[Unit]
def feedDoubles(doubles: Double*)(implicit trace: Trace): UIO[Unit]
def feedFloats(floats: Float*)(implicit trace: Trace): UIO[Unit]
def feedInts(ints: Int*)(implicit trace: Trace): UIO[Unit]
def feedLongs(longs: Long*)(implicit trace: Trace): UIO[Unit]
def feedStrings(strings: String*)(implicit trace: Trace): UIO[Unit]
def feedUUIDs(UUIDs: UUID*)(implicit trace: Trace): UIO[Unit]
def getSeed(implicit trace: Trace): UIO[Long]
def setSeed(seed: => Long)(implicit trace: Trace): UIO[Unit]

Inherited methods

def nextBoolean(implicit trace: Trace): UIO[Boolean]
Inherited from:
Random
def nextBytes(length: => Int)(implicit trace: Trace): UIO[Chunk[Byte]]
Inherited from:
Random
def nextDouble(implicit trace: Trace): UIO[Double]
Inherited from:
Random
def nextDoubleBetween(minInclusive: => Double, maxExclusive: => Double)(implicit trace: Trace): UIO[Double]
Inherited from:
Random
def nextFloat(implicit trace: Trace): UIO[Float]
Inherited from:
Random
def nextFloatBetween(minInclusive: => Float, maxExclusive: => Float)(implicit trace: Trace): UIO[Float]
Inherited from:
Random
def nextGaussian(implicit trace: Trace): UIO[Double]
Inherited from:
Random
def nextInt(implicit trace: Trace): UIO[Int]
Inherited from:
Random
def nextIntBetween(minInclusive: => Int, maxExclusive: => Int)(implicit trace: Trace): UIO[Int]
Inherited from:
Random
def nextIntBounded(n: => Int)(implicit trace: Trace): UIO[Int]
Inherited from:
Random
def nextLong(implicit trace: Trace): UIO[Long]
Inherited from:
Random
def nextLongBetween(minInclusive: => Long, maxExclusive: => Long)(implicit trace: Trace): UIO[Long]
Inherited from:
Random
def nextLongBounded(n: => Long)(implicit trace: Trace): UIO[Long]
Inherited from:
Random
def nextPrintableChar(implicit trace: Trace): UIO[Char]
Inherited from:
Random
def nextString(length: => Int)(implicit trace: Trace): UIO[String]
Inherited from:
Random
def nextUUID(implicit trace: Trace): UIO[UUID]
Inherited from:
Random
def save(implicit trace: Trace): UIO[UIO[Unit]]
Inherited from:
Restorable
def shuffle[A, Collection <: (Iterable)](collection: => Collection[A])(implicit bf: BuildFrom[Collection[A], A, Collection[A]], trace: Trace): UIO[Collection[A]]
Inherited from:
Random
Inherited from:
Random