Como en:¿Puedo verificar la salida de mi programa con la prueba de refuerzo?
void f()
{
cout << "blah" << endl;
}
BOOST_AUTO_TEST_CASE(f)
{
f();
// This would be a beauty
// BOOST_CHECK_PROGRAM_OUTPUT_MATCH("blah");
}
Como en:¿Puedo verificar la salida de mi programa con la prueba de refuerzo?
void f()
{
cout << "blah" << endl;
}
BOOST_AUTO_TEST_CASE(f)
{
f();
// This would be a beauty
// BOOST_CHECK_PROGRAM_OUTPUT_MATCH("blah");
}
Sí, puede hacerlo mediante la reorientación de std::cout
a un boost::test_tools::output_test_stream
, que proporciona métodos especiales para comparar la salida. Para asegurarse de que std::cout
siempre se restaura correctamente, puede usar una estructura personalizada, como se muestra en el siguiente ejemplo.
#define BOOST_TEST_MAIN
#include <boost/test/unit_test.hpp>
#include <boost/test/output_test_stream.hpp>
#include <iostream>
BOOST_AUTO_TEST_SUITE(TestSuite1)
struct cout_redirect {
cout_redirect(std::streambuf * new_buffer)
: old(std::cout.rdbuf(new_buffer))
{ }
~cout_redirect() {
std::cout.rdbuf(old);
}
private:
std::streambuf * old;
};
BOOST_AUTO_TEST_CASE(test1)
{
boost::test_tools::output_test_stream output;
{
cout_redirect guard(output.rdbuf());
std::cout << "Test" << std::endl;
}
BOOST_CHECK(output.is_equal("Test\n"));
}
BOOST_AUTO_TEST_SUITE_END()
He seguido la respuesta de @Björn Pollex por algunos días. Pero un día descubrí que no es necesario hacerlo así. Simplemente use boost::test_tools::output_test_stream
.
#define BOOST_TEST_MAIN
#include <boost/test/unit_test.hpp>
#include <boost/test/output_test_stream.hpp>
BOOST_AUTO_TEST_SUITE(TestSuite1)
BOOST_AUTO_TEST_CASE(test1)
{
boost::test_tools::output_test_stream output;
output << "Test";
BOOST_CHECK(output.is_equal("Test"));
}
BOOST_AUTO_TEST_SUITE_END()
Para obtener más información, lea the official documentation.
Beautiful, Space_C0wb0y. Así que vamos a ver si entiendo lo que está pasando allí. En el constructor cout_redirect configuramos el buffer de flujo cout para aumentar el buffer de flujo de prueba de salida. Y guardamos el viejo buffer de flujo cout. Lo que está escrito a partir de ahí en cout, y hasta que se destruya cout_redirect, está escrito en el búfer de flujo de refuerzo. Cuando se destruye cout_redirect, reiniciamos el buffer de flujo de cout a su valor anterior, y tenemos un buffer de flujo boost con toda la salida de programa que queríamos. – rturrado
@rturrado: Exactamente. –
Supongo que lo que también podríamos hacer es configurar el búfer de flujo de refuerzo para ejecutar el buffer de flujo. En ese caso, aún obtendríamos salida en cout, y podríamos ser capaces de verificarlo usando la corriente de impulso. – rturrado