Управление выводом формата исходного местоположения Boost.Test

Catch2 и Boost.Test предоставляет аналогичные функции для написания модульных тестов. Для определенного проекта я должен использовать Boost.Test вместо Catch2. У меня проблема в том, что оба используют разные выходные форматы.

Например, Catch2 скажет, что произошел сбой в

test.cpp:9

(см. пример ниже). Однако Boost.Test скажет

test.cpp(9): error in ....

Этот формат не позволяет моему редактору распознавать вывод как исходное местоположение.

Есть ли способ заставить Boost.Test выводить исходное местоположение как file.ext:lineno вместо file.ext(lineno)?

Это типичный вывод для Catch2

----------------------------------------------
Testing Binary Search
----------------------------------------------
test.cpp:9
..............................................test.cpp:18: FAILED:
  REQUIRE( binary_search(arr, 176) == 0 )
with expansion:
  -1 == 0==============================================
test cases: 1 | 1 failed
assertions: 5 | 4 passed | 1 failed

Это типичный вывод для Boost.Test.

Running 7 test cases...
./layout.hpp(764): error: in "layout_to_offset_1d_nontrivial": check L[3] == &B[3] - base(B) has failed [3 != 6]
Running 7 test cases...
./.././detail/layout.hpp(764): error: in "layout_to_offset_1d_nontrivial": check L[3] == &B[3] - base(B) has failed [3 != 6]

*** 1 failure is detected in the test module "C++ Unit Tests for Multi layout"

person alfC    schedule 31.10.2020    source источник


Ответы (1)


Я нашел решение в этом историческом посте: https://richarddingwall.name/2008/06/01/using-the-boost-unit-test-framework-with-xcode-3

Использование (утерянного) искусства переопределения виртуальных функций и приборов Boost.Test:

Просто добавьте этот код (некоторые обновления к исходному сообщению, с второстепенными форматами и обновлениями C++11):

#include<boost/test/output/compiler_log_formatter.hpp>

struct xcode_log_formatter: boost::unit_test::output::compiler_log_formatter{
    // Produces an Xcode-friendly message prefix.
    void print_prefix(std::ostream& output, boost::unit_test::const_string file_name, std::size_t line) override{
        output << file_name << ':' << line << ": error: ";
    }
};

// Set up the unit test framework to use an xcode-friendly log formatter.
struct xcode_config{
    xcode_config(){boost::unit_test::unit_test_log.set_formatter(new xcode_log_formatter);}
};

// Call our fixture.
BOOST_GLOBAL_FIXTURE(xcode_config);

с этим изменением вывод выглядит так (обратите внимание на формат файла:lineno).

Running 7 test cases...
./layout.hpp:781: error: error: in "layout_to_offset_1d_nontrivial": check L[3] == &B[3] - base(B) has failed [3 != 6]
Running 7 test cases...
./.././detail/layout.hpp:781: error: error: in "layout_to_offset_1d_nontrivial": check L[3] == &B[3] - base(B) has failed [3 != 6]

Меня все еще интересуют более простые решения.


Вот более компактная версия этого кода, переименованная для моего случая (xcode-gedit):

#include<boost/test/output/compiler_log_formatter.hpp>
struct gedit_config{
    struct formatter : boost::unit_test::output::compiler_log_formatter{
        void print_prefix(std::ostream& out, boost::unit_test::const_string file, std::size_t line){
            out<< file <<':'<< line <<": ";
        }
    };
    gedit_config(){boost::unit_test::unit_test_log.set_formatter(new formatter);}
};
BOOST_GLOBAL_FIXTURE(gedit_config);
person alfC    schedule 31.10.2020