Kotlin Kotest-生成无重复的穷举对象置换
我希望能够生成对象的彻底排列。想象一下下面的物体Kotlin Kotest-生成无重复的穷举对象置换,kotlin,kotest,Kotlin,Kotest,我希望能够生成对象的彻底排列。想象一下下面的物体 data class Person (name: String, age: Int) 出于测试目的,我想将name限制为3值Mohammad,Nasir,Rasul和age到4值10,20,30,40。我想生成12个对象,其中每个名称都有4个年龄 我可以生成一个任意的绑定,但是这不能保证12次迭代都有一个唯一的对象。我必须增加迭代次数,并剔除重复项 val list = Arb.bind( listOf("Na
data class Person (name: String, age: Int)
出于测试目的,我想将name
限制为3
值Mohammad
,Nasir
,Rasul
和age
到4
值<代码>10,20
,30
,40
。我想生成12个对象,其中每个名称都有4个年龄
我可以生成一个任意的
绑定,但是这不能保证12次
迭代都有一个唯一的对象。我必须增加迭代次数,并剔除重复项
val list = Arb.bind(
listOf("Nasir", "Rasul", "Mohammad").exhaustive(),
listOf(10, 20, 30, 40).exhaustive()
) { name, age -> Person(name, age) }
"Test person " - {
runBlocking {
list.checkAll(12) {
System.out.println("Testing $it")
assertTrue(it.age < 50)
}
}
}
请注意,Rasul:40
是重复的<代码>穆罕默德:10遗漏
根据@Tenfour04的评论,1个可能的解决方案是使用时间
和映射
。虽然对于我的字段,映射变得很复杂,因为我们将有对
和对
和对
进行处理
"Test cross product" - {
val times = Exhaustive.collection(listOf("Nasir", "Rasul"))
.times(Exhaustive.collection(listOf(10, 20)))
.map { Person(it.first as String, it.second) }
runBlocking {
times.checkAll(4) {
println("$it")
}
}
}
您可以通过映射每个组件中的每个值并将它们组合成一个新的值来实现这一点。例如,如果有三个组件,则要为其生成所有组合:
fun <A, B, C, D> cartesian(
a: Exhaustive<A>,
b: Exhaustive<B>,
c: Exhaustive<C>,
f: (A, B, C) -> D
): Exhaustive<D> {
val ds = a.values.flatMap { _a ->
b.values.flatMap { _b ->
c.values.map { _c ->
f(_a, _b, _c)
}
}
}
return ds.exhaustive()
}
注:上述功能存在于Kotest 4.5中,在编写本文时尚未发布 这能回答你的问题吗?谢谢@Tenfour04。不完全是。我希望能够在对象的上下文中定义它,而链接的构造似乎在外部。虽然我会试试看,但乍一看,我认为它行不通。如果我发现结果与此相反,我会向你汇报。我认为这会奏效的。我只需要将它映射到一个对象。。谢谢@Tenfour04。但是,由于使用了
Pair
,它有两个以上的属性,因此开始变得复杂起来。Wy不仅仅是手动生成所有可能的组合val persons=names.flatMap{name->ages.map{Person(name,it)}
?@Мааафаааа我不确定是否遵循。我将有一个数据结构,其中每个属性都有一组不同的值,一些枚举,一些其他有限集。。。如果我没弄错的话,你的建议会奏效的,只要有两件事。。。
fun <A, B, C, D> cartesian(
a: Exhaustive<A>,
b: Exhaustive<B>,
c: Exhaustive<C>,
f: (A, B, C) -> D
): Exhaustive<D> {
val ds = a.values.flatMap { _a ->
b.values.flatMap { _b ->
c.values.map { _c ->
f(_a, _b, _c)
}
}
}
return ds.exhaustive()
}
val persons = cartesian(
Exhaustive.collection(listOf("Nasir", "Rasul")),
Exhaustive.collection(listOf(10, 20))
) { a, b -> Person(a, b) }
checkAll(persons) { person -> .... test here .... }