TestRandom

object TestRandom extends Serializable

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.environment.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.

class Object
trait Matchable
class Any

Type members

Classlikes

final case class Buffer(booleans: List[Boolean], bytes: List[Chunk[Byte]], chars: List[Char], doubles: List[Double], floats: List[Float], integers: List[Int], longs: List[Long], strings: List[String], UUIDs: List[UUID])

The buffer of the TestRandom.

The buffer of the TestRandom.

final case class Data(seed1: Int, seed2: Int, nextNextGaussians: Queue[Double])

The seed of the TestRandom.

The seed of the TestRandom.

trait Service extends Restorable
final case class Test(randomState: Ref[Data], bufferState: Ref[Buffer]) extends Service with Service

Adapted from @gzmo work in Scala.js (https://github.com/scala-js/scala-js/pull/780)

Adapted from @gzmo work in Scala.js (https://github.com/scala-js/scala-js/pull/780)

Value members

Concrete methods

def feedBooleans(booleans: Boolean*): URIO[TestRandom, Unit]

Accesses a TestRandom instance in the environment and feeds the buffer with the specified sequence of booleans.

Accesses a TestRandom instance in the environment and feeds the buffer with the specified sequence of booleans.

def feedBytes(bytes: Chunk[Byte]*): URIO[TestRandom, Unit]

Accesses a TestRandom instance in the environment and feeds the buffer with the specified sequence of chunks of bytes.

Accesses a TestRandom instance in the environment and feeds the buffer with the specified sequence of chunks of bytes.

def feedChars(chars: Char*): URIO[TestRandom, Unit]

Accesses a TestRandom instance in the environment and feeds the buffer with the specified sequence of characters.

Accesses a TestRandom instance in the environment and feeds the buffer with the specified sequence of characters.

def feedDoubles(doubles: Double*): URIO[TestRandom, Unit]

Accesses a TestRandom instance in the environment and feeds the buffer with the specified sequence of doubles.

Accesses a TestRandom instance in the environment and feeds the buffer with the specified sequence of doubles.

def feedFloats(floats: Float*): URIO[TestRandom, Unit]

Accesses a TestRandom instance in the environment and feeds the buffer with the specified sequence of floats.

Accesses a TestRandom instance in the environment and feeds the buffer with the specified sequence of floats.

def feedInts(ints: Int*): URIO[TestRandom, Unit]

Accesses a TestRandom instance in the environment and feeds the buffer with the specified sequence of integers.

Accesses a TestRandom instance in the environment and feeds the buffer with the specified sequence of integers.

def feedLongs(longs: Long*): URIO[TestRandom, Unit]

Accesses a TestRandom instance in the environment and feeds the buffer with the specified sequence of longs.

Accesses a TestRandom instance in the environment and feeds the buffer with the specified sequence of longs.

def feedStrings(strings: String*): URIO[TestRandom, Unit]

Accesses a TestRandom instance in the environment and feeds the buffer with the specified sequence of strings.

Accesses a TestRandom instance in the environment and feeds the buffer with the specified sequence of strings.

def feedUUIDs(UUIDs: UUID*): URIO[TestRandom, Unit]

Accesses a TestRandom instance in the environment and feeds the buffer with the specified sequence of UUIDs.

Accesses a TestRandom instance in the environment and feeds the buffer with the specified sequence of UUIDs.

def make(data: Data): Layer[Nothing, Random & TestRandom]

Constructs a new TestRandom with the specified initial state. This can be useful for providing the required environment to an effect that requires a Random, such as with ZIO#provide.

Constructs a new TestRandom with the specified initial state. This can be useful for providing the required environment to an effect that requires a Random, such as with ZIO#provide.

def makeTest(data: Data): UIO[Test]

Constructs a new Test object that implements the TestRandom interface. This can be useful for mixing in with implementations of other interfaces.

Constructs a new Test object that implements the TestRandom interface. This can be useful for mixing in with implementations of other interfaces.

def setSeed(seed: => Long): URIO[TestRandom, Unit]

Accesses a TestRandom instance in the environment and sets the seed to the specified value.

Accesses a TestRandom instance in the environment and sets the seed to the specified value.

Concrete fields

An arbitrary initial seed for the TestRandom.

An arbitrary initial seed for the TestRandom.

Accesses a TestRandom instance in the environment and clears the buffer of booleans.

Accesses a TestRandom instance in the environment and clears the buffer of booleans.

Accesses a TestRandom instance in the environment and clears the buffer of bytes.

Accesses a TestRandom instance in the environment and clears the buffer of bytes.

Accesses a TestRandom instance in the environment and clears the buffer of characters.

Accesses a TestRandom instance in the environment and clears the buffer of characters.

Accesses a TestRandom instance in the environment and clears the buffer of doubles.

Accesses a TestRandom instance in the environment and clears the buffer of doubles.

Accesses a TestRandom instance in the environment and clears the buffer of floats.

Accesses a TestRandom instance in the environment and clears the buffer of floats.

Accesses a TestRandom instance in the environment and clears the buffer of integers.

Accesses a TestRandom instance in the environment and clears the buffer of integers.

Accesses a TestRandom instance in the environment and clears the buffer of longs.

Accesses a TestRandom instance in the environment and clears the buffer of longs.

Accesses a TestRandom instance in the environment and clears the buffer of strings.

Accesses a TestRandom instance in the environment and clears the buffer of strings.

Accesses a TestRandom instance in the environment and clears the buffer of UUIDs.

Accesses a TestRandom instance in the environment and clears the buffer of UUIDs.

val getSeed: URIO[TestRandom, Long]

Accesses a TestRandom instance in the environment and gets the seed.

Accesses a TestRandom instance in the environment and gets the seed.

val random: ZLayer[Clock, Nothing, Random & TestRandom]
val save: ZIO[TestRandom, Nothing, UIO[Unit]]

Accesses a TestRandom instance in the environment and saves the random state in an effect which, when run, will restore the TestRandom to the saved state.

Accesses a TestRandom instance in the environment and saves the random state in an effect which, when run, will restore the TestRandom to the saved state.