Следующий простой фрагмент кода содержит while
-петл, который выглядит так, как будто он может быть бесконечным:
def findDivisor(n: Int): Int = {
require(n >= 2)
var i = 2
while (true) {
if (n % i == 0) {
return i
} else {
// do-nothing branch
}
i += 1
}
// $COVERAGE-OFF$
throw new Error("unreachable")
// $COVERAGE-ON$
}
Базовая математика гарантирует, что этот метод всегда завершается (даже если он не может найти правильный делитель, он должен останавливаться на n
).
Несмотря на $COVERAGE-OFF$
сразу после while
-цикла, Scoverage (и, возможно, некоторые другие инструменты покрытия) будут жаловаться и вычислять только 75% покрытия филиала (поскольку while
считается точкой ветвления, а ветвь false
никогда не берется до return
).
Перемещение // $COVERAGE-OFF$
вокруг, например, перед закрытием }
while
Тело тоже не помогает.
Как заставить его игнорировать невозможную ветвь?