Ir al contenido principal
Versión: 5.3.x

Operaciones de Generadores

[Traducción Beta No Oficial]

Esta página fue traducida por PageTurner AI (beta). No está respaldada oficialmente por el proyecto. ¿Encontraste un error? Reportar problema →

Next

Si quieres usar un Arb para obtener un valor (incluso fuera de una prueba de propiedades), puedes invocar next sobre él.

val arbA: Arb<A> = ...
val a = arbA.next() // use Random.Default
val a2 = arbA.next(rs) // pass in Random

Filter

Si tienes un arb y quieres crear uno nuevo que proporcione un subconjunto de valores, puedes llamar a filter en el arb de origen. Por ejemplo, una forma de generar números pares es tomar el arb de enteros y filtrar los valores impares. Viz:

val evens = Arb.int().filter { it.value % 2 == 0 }
val odds = Arb.int().filter { it.value % 2 == 1 }

Map

Si tienes un arb y quieres transformar el valor generado, puedes utilizar map.

val integerStrings: Arb<String> = Arb.int().map { it.toString() }

FlatMap

Si tienes un arb cuyas emisiones o casos límite dependen de las emisiones de arbitrarios previos, puedes emplear flatMap.

val dependentArbs: Arb<String> = Arb.of("foo", "bar").flatMap { prefix ->
Arb.int(1..10).map { integer ->
"${prefix}-${integer}"
}
}

Merging

Dos generadores pueden combinarse para que los elementos resultantes se muestreen equitativamente de ambos.

val merged = arbA.merge(arbB)

Así, en el siguiente ejemplo habría igual probabilidad de obtener "a" o "b" en cada muestra aleatoria:

val a = arbitrary { "a" }
val b = arbitrary { "b" }
val ab = a.merge(b)

println(ab.take(1000).groupingBy { it }.eachCount())
// {a=493, b=507}

Para combinar más de dos arbitrarios, Arb.choice o Arb.choose pueden ser más apropiados. Por ejemplo:

  • Arb.choice(arbA, arbB, arbC) para muestreo uniforme entre arbA, arbB y arbC,

  • o Arb.choose(4 to arbA, 1 to arbB, 5 to arbC) para un control más granular de la frecuencia de cada arbitrario. En este caso, arbA, arbB y arbC se muestrearán el 40%, 10% y 50% del tiempo, respectivamente.

Bind

Bind es útil cuando necesitas aplicar múltiples arbitrarios. Veamos cómo construir valores para una data class usando bind.

data class Person(val name: String, val age: Int)

val personArb: Arb<Person> = Arb.bind(
Arb.string(),
Arb.int()
) { name, age -> Person(name, age) }