迭代所有可能的布尔值

问题描述 投票:0回答:1

我有一个这样的功能:

fun foo(a: Boolean, b: Boolean, c: Boolean) { /*...*/ }

我想用所有可能的参数值来测试它:

for (a in false..true)
    for (b in false..true)
        for (c in false..true) {
            val expected = ...
            assertThat(foo(a, b, c)).isEqualTo(expected)
        }

但不幸的是 Kotlin 没有 BooleanRange 类型。

我可以这样做:

for (a in 0..1)
    for (b in 0..1)
        for (c in 0..1) {
            val expected = ...
            assertThat(foo(a == 1, b == 1, c == 1)).isEqualTo(expected)
        }

但这根本不清楚。

我能做到:

for (a in arrayOf(false, true))
    for (b in arrayOf(false, true))
        for (c in arrayOf(false, true)) {
            val expected = ...
            assertThat(foo(a, b, c)).isEqualTo(expected)
        }

但这仍然太冗长了。有没有更简洁的方法,也许 Kotlin 有一个函数可以直接迭代 false 和 true 这两个值?我看到它有一个

BooleanIterator
类型,但我不确定这在这里是否有任何用处。

kotlin for-loop boolean
1个回答
1
投票

您的解决方案效果很好。以下是另一种选择,但可能难以理解。使用

BitSet
获取布尔值的所有组合,我们可以扩展到任意数量的布尔值。

(0 until 8L).map {
  BitSet.valueOf(longArrayOf(it))
}.map {
  assertThat(foo(it[0], it[1], it[2])).isEqualTo(expected)
}

您可以使用

@ParamerterizedTest
将布尔组合移出实际测试。您可以获得所有组合的测试输出,有助于调试测试参数的问题。

 companion object {
  private val expected = arrayOf(...)
  @JvmStatic fun provideInput() : Stream<Arguments> {
   return (0 until 8).map {
     val b = BitSet.valueOf(longArrayOf(it.toLong()))
     Arguments.of(b[0], b[1], b[2], expected[it])
   }.stream()
  }
 }

@ParameterizedTest
@MethodSource("provideInput")
fun test(a: Boolean, b: Boolean, c: Boolean, expected: Boolean){
  assertThat(foo(a,b,c)).isEqualTo(expected)
}
© www.soinside.com 2019 - 2024. All rights reserved.