Как покрыть унаследованный код C ++, управляемый препроцессором #ifdefs, юнит-тестами? - PullRequest
0 голосов
/ 25 мая 2018

Я унаследовал не слишком большой унаследованный код C ++, который в настоящее время реинжиниринг.До сих пор я достаточно хорошо понимаю большую часть кода и могу его использовать, хотя обслуживание - ад.Я думаю, что главная трудность заключается в массовом использовании директив препроцессора для управления поведением программы.

Рассмотрим следующие примеры:

void function(){
    ... // lots of code 
    #ifdef PARAMETER == 1
        do_one_thing();

    #elif PARAMETER == 2
        do_another_thing();
    ...//etc
    #endif
    ...//lots of code
}

или

void function(double arg1,
             #ifdef SOME_PP_VAR1 == 5
             double arg2,
             #endif
             )

и такие вещи, как

#ifdef SOME_PP_VAR2 == 2
    typedef myVector std::vector<double>;
#elif SOME_PP_VAR2 == 7
    typedef myVector std::vector<int>;
#endif

в глобальном масштабе.Или даже

#ifdef SOME_PP_VAR2 == 2
    #include "some_header.hpp"
#elif SOME_PP_VAR2 == 7
    #include "some_other_header.hpp"
#endif

Около 30 таких переменных препроцессора устанавливаются в файле конфигурации, который передается в систему сборки, а затем в компилятор.Он в основном контролирует все и присутствует практически в любом файле.Кстати, в некоторых местах #ifs даже вложены.

Поэтому довольно сложно писать юнит-тесты.Мне нужно было бы собрать все возможные комбинации переменных препроцессора и проверить каждую.

Мои (плохие) идеи на данный момент таковы:

  • Переписать код с нуля, возможно, вдругой язык.(Высокий риск, слишком много времени).
  • Заменить переменные препроцессора константами.(Не всегда выполнимо).

Вы когда-нибудь сталкивались с такой ситуацией и как справились с ней?

С уважением и заранее спасибо.

...