Модульные тесты для Boost.Spirit
-
20-08-2019 - |
Вопрос
Я новичок в Boost.Spirit и Boost.Тестируйте, и я хотел бы знать, как вы проверяете правильность ваших грамматик.Ниже приведена упрощенная версия того, как я делаю это на данный момент, и я почти уверен, что есть лучший способ:
Каждый тестовый пример содержит пару из двух строк, содержащих текст для анализа и ожидаемый результат, разделенный точкой с запятой.
Функции синтаксического анализа выполняют фактический синтаксический анализ и возвращают строку, которая должна быть равна ожидаемому результату.
std::string parse(std::string const & line) {
std::string name;
int hours;
rule<> top_rule = ... ; // rule assignes values to 'name' and 'hours'
parse_info<> info = parse(line.c_str(), top_rule);
if(info.full) {
std::stringstream sstr;
sstr << name << ";" << hours;
return sstr.str();
}
return "parser failed.";
}
BOOST_AUTO_TEST_SUITE( TestSuite )
BOOST_AUTO_TEST_CASE( TestCase ) {
BOOST_CHECK_EQUAL(parse("Tom worked for 10 hours."), "Tom;10");
}
BOOST_AUTO_TEST_SUITE_END()
Решение
В целом, ваш подход кажется мне прекрасным.Я бы, вероятно, сгруппировал класс тестов в функцию с описательными именами, напримерTestInvalidGrammar, TestErrorHandling, TestNestedGrammar и т.д.и попросите тех, кто вызван из главного.
Я уверен, что вы читали документацию, но взгляните на примеры если это поможет.
Другие советы
Здесь вы можете увидеть, как они (авторы boost spirit) тестируют свои собственные парсеры: http://svn.boost.org/svn/boost/trunk/libs/spirit/test/qi/grammar.cpp .Для каждой части qi вы можете найти файл C ++ здесь: http://svn.boost.org/svn/boost/trunk/libs/spirit/test/qi/.