Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin Kotest-生成无重复的穷举对象置换_Kotlin_Kotest - Fatal编程技术网

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