Есть ли способ написать что-то вроде "unit test", которое гарантирует, что какой-то код не компилируется?
Зачем мне такое? Две причины.
1) Проверьте безопасность моего API. Я бы хотел, чтобы убедиться, что кто-то переходит в плохую ценность, вы получаете ошибку компилятора, а не только ошибку времени выполнения. Очевидно, что я могу просто запустить компилятор и проверить наличие ошибки, но формализация его в unit test хороша для предотвращения регрессии, а также для документации.
Например, рассмотрите этот тест. Существует какой-то прокомментированный код, который я использовал для проверки безопасности типа: https://github.com/squito/boxwood/blob/master/core/src/test/scala/com/quantifind/boxwood/EnumUnionTest.scala#L42 (строки 42 и 48 - строка 34 Я вызываю другой API, который имеет исключение во время выполнения, которое я могу проверить)
На самом деле мне потребовалось некоторое время, чтобы получить право на безопасность типа, поэтому это были важные проверки. Теперь, если я перейду и изменю базовую реализацию, я не могу просто запустить свой тестовый пакет - мне также нужно помнить о том, чтобы раскомментировать эти строки и проверить ошибку компилятора.
2) Проверка обработки ошибок макросов. Если у макроса есть некорректный ввод, это должно привести к ошибке компилятора. Те же проблемы здесь, одно и то же желание иметь его в легкодоступном тестовом наборе.
Я использую ScalaTest, но я рад, что здесь есть решение с любой инфраструктурой модульного тестирования.