我希望能够生成详尽的对象排列。想象以下对象
data class Person (name: String, age: Int)
出于测试目的,我想限制name
to3
值。Mohammad
, Nasir
,Rasul
和age
值4
。10
, 20
, 30
, 40
. 我想生成 12 个对象,其中每个名称都有 4 个年龄。
我可以生成一个arbitrary
绑定,但是不能保证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)
}
}
}
查看源代码,我似乎找不到方法。我希望社区中有人对此有需求。
谢谢。
注意:我正在寻找一种使用Exhaustive
生成器的方法,而不是Arb
生成器。我可以进行一些后期处理并删除重复项,但我希望预先获得更可靠、独特的东西。
Example outout:
Testing Person(name=Mohammad, age=40)
Testing Person(name=Nasir, age=20)
Testing Person(name=Rasul, age=20)
Testing Person(name=Rasul, age=30)
Testing Person(name=Mohammad, age=20)
Testing Person(name=Rasul, age=40)
Testing Person(name=Nasir, age=10)
Testing Person(name=Rasul, age=10)
Testing Person(name=Nasir, age=40)
Testing Person(name=Rasul, age=40)
Testing Person(name=Nasir, age=30)
Testing Person(name=Mohammad, age=30)
注意Rasul:40
是重复的。Mohammad:10
错过了。
根据@Tenfour04 的评论,一种可能的解决方案是使用times
and map
。尽管在我的领域中,映射变得多毛,因为我们将不得不处理Pairs
和处理。Pairs
Pairs
"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")
}
}
}