Как протестировать макросы Scala?
Каков предложенный способ проведения тестов на макросах scala?
Я понимаю, что нужно два проекта из-за необходимости отдельной компиляции. Этот шаг, если необходимо, является приемлемым и в основном ясным.
Но как вы утверждаете, что расширение макросов терпит неудачу, когда это необходимо? Без специального средства тестовый пример не будет компилироваться, поэтому весь тестовый проект не будет компилироваться.
Я думаю, что это утверждение потребует другого макроса формы
errors(code: => _): List[CompileError]
который возвращает ошибки компиляции внутреннего макроса. То же самое потребуется для проверки того, что предупреждения возникают, если они должны и т.д.
Существуют ли существующие средства тестирования для макросов scala?
Ответы
Ответ 1
Вы можете использовать assertDoesNotCompile
из ScalaTest. Ниже приведен пример использования этого метода для проверки Scala typechecker:
import org.scalatest.FunSuite
class TypeTest extends FunSuite {
test("String vals can't hold ints") {
assertDoesNotCompile("val x: String = 1")
}
}
Вы можете передать строку, содержащую пример того, когда расширение макроса должно assertDoesNotCompile
. Обратите внимание, что существует также assertCompiles
, если вы чувствуете необходимость в этом.
Ответ 2
вы можете использовать twitter eval, чтобы проверить, не скопировал ли код
https://github.com/twitter/util/blob/master/util-eval/src/main/scala/com/twitter/util/Eval.scala#L247