Хочу написать небольшой велосипедный unit test фреймворк, требования следующие: во-первых, нужно чтобы в выхлопе теста фигурировало тестируемое выражение, во-вторых, у тестов должны быть опциональные аргументы, например описание. Пример (ASSERT, понятно, проверяет выражение на истинность):
int main() {
ASSERT(true && true && true);
ASSERT(true && true && true, "is always true");
ASSERT(true && false);
ASSERT(true && false, "is actually false");
}
выдаёт
passed: true && true && true
passed: true && true && true (is always true)
failed: true && false
failed: true && false (is actually false)
Вопрос как это реализовать. Т.к. нужен stringify выражения, понятно что без макросов не обойтись. Но с макросами проблема в невозможности перегрузки и дефолтных зрачений (чтобы не нужен было указывать каждый раз все опциональные аргументы).
Есть variadic macros, но #define ASSERT(expr, ...) my_overloaded_function(#expr, expr, __VA_ARGS__) будет требовать хотя бы одного опционального аргумента, что не хочется. Есть ##__VA_ARGS__, которая эту проблему решает, но это GNU расширение.
Совсем ли нет других решений? GNU расширение я не хочу, писать каждый раз все опциональные аргументы не хочу, и делать пачку макросов на каждую комбинацию тоже не хочу.