Pruebas unitarias para Boost.Spirit
-
20-08-2019 - |
Pregunta
Soy nuevo en Boost.Spirit y Boost.Test y me gustaría saber cómo verificas la corrección de tus gramáticas. A continuación se muestra una versión simplificada de cómo lo hago en este momento y estoy bastante seguro de que hay una mejor manera:
Cada caso de prueba tiene un par de dos cadenas que contienen el texto a analizar y el resultado esperado delimitado por punto y coma.
Las funciones de análisis realiza el análisis real y devuelve una cadena que debería ser igual al resultado esperado.
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()
Solución
En general, su enfoque me parece bien. Probablemente agruparía la clase de pruebas en función con nombres descriptivos, p. TestInvalidGrammar, TestErrorHandling, TestNestedGrammar, etc. y tienen los llamados desde el principal.
Estoy seguro de que ha leído la documentación, pero eche un vistazo a ejemplos si ayuda.
Otros consejos
Aquí puede ver cómo ellos (los autores del espíritu de impulso) prueban sus propios analizadores: http://svn.boost.org/svn/boost/trunk/libs/spirit/test/qi/grammar.cpp . Para cada parte de qi puede encontrar un archivo C ++ aquí: http : //svn.boost.org/svn/boost/trunk/libs/spirit/test/qi/ .