Operaciones de Generadores
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 entrearbA,arbByarbC,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,arbByarbCse 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) }