Support logging in tests
This commit is contained in:
parent
454d975ba6
commit
c6f01aad81
1 changed files with 47 additions and 5 deletions
|
|
@ -1,5 +1,6 @@
|
|||
#include <psemek/test/test.hpp>
|
||||
#include <psemek/util/pretty_print.hpp>
|
||||
#include <psemek/log/log.hpp>
|
||||
|
||||
#include <map>
|
||||
#include <set>
|
||||
|
|
@ -44,6 +45,17 @@ namespace psemek::test
|
|||
tests[pname] = f;
|
||||
}
|
||||
|
||||
struct sink
|
||||
: log::sink
|
||||
{
|
||||
std::vector<std::pair<log::level, std::string>> messages;
|
||||
|
||||
void put_message(log::message const & msg) override
|
||||
{
|
||||
messages.push_back({msg.level, std::string(msg.message)});
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
int main(int argc, char ** argv)
|
||||
|
|
@ -90,6 +102,11 @@ int main(int argc, char ** argv)
|
|||
|
||||
auto all_start = clock::now();
|
||||
|
||||
std::unique_ptr<psemek::log::sink> sink = std::make_unique<psemek::test::sink>();
|
||||
auto sink_ptr = static_cast<psemek::test::sink *>(sink.get());
|
||||
|
||||
psemek::log::register_thread("test");
|
||||
|
||||
std::size_t i = 0;
|
||||
for (auto const & name : tests)
|
||||
{
|
||||
|
|
@ -101,29 +118,54 @@ int main(int argc, char ** argv)
|
|||
|
||||
psemek::test::context ctx;
|
||||
|
||||
psemek::log::add_sink(std::move(sink));
|
||||
|
||||
bool failure = true;
|
||||
|
||||
auto start = clock::now();
|
||||
try
|
||||
{
|
||||
auto start = clock::now();
|
||||
psemek::test::tests[name](ctx);
|
||||
auto end = clock::now();
|
||||
std::cout << "ok " << psemek::util::pretty(end - start, std::chrono::milliseconds{1}) << std::endl;
|
||||
std::cout << "ok " << psemek::util::pretty(end - start, std::chrono::milliseconds{1});
|
||||
|
||||
auto filter = [](auto const & m){ return m.first >= psemek::log::level::info; };
|
||||
if (std::count_if(sink_ptr->messages.begin(), sink_ptr->messages.end(), filter) == 1)
|
||||
{
|
||||
std::cout << " " << std::find_if(sink_ptr->messages.begin(), sink_ptr->messages.end(), filter)->second;
|
||||
sink_ptr->messages.clear();
|
||||
}
|
||||
std::cout << std::endl;
|
||||
failure = false;
|
||||
++success;
|
||||
}
|
||||
catch (psemek::test::failure const & e)
|
||||
{
|
||||
std::cout << "failure" << std::endl;
|
||||
auto end = clock::now();
|
||||
std::cout << "failure " << psemek::util::pretty(end - start, std::chrono::milliseconds{1}) << std::endl;
|
||||
std::cout << indent << "Reason: " << e.message() << std::endl;
|
||||
std::cout << indent << "Location: " << e.location() << std::endl;
|
||||
}
|
||||
catch (std::exception const & e)
|
||||
{
|
||||
std::cout << "failure: " << e.what() << std::endl;
|
||||
auto end = clock::now();
|
||||
std::cout << "failure: " << e.what() << " " << psemek::util::pretty(end - start, std::chrono::milliseconds{1}) << std::endl;
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
std::cout << "failure: (unknown exception)" << std::endl;
|
||||
auto end = clock::now();
|
||||
std::cout << "failure: (unknown exception) " << psemek::util::pretty(end - start, std::chrono::milliseconds{1}) << std::endl;
|
||||
}
|
||||
|
||||
sink = psemek::log::remove_sink(sink_ptr);
|
||||
|
||||
for (auto const & msg : sink_ptr->messages)
|
||||
{
|
||||
if (failure || msg.first >= psemek::log::level::info)
|
||||
std::cout << indent << msg.second << std::endl;
|
||||
}
|
||||
sink_ptr->messages.clear();
|
||||
|
||||
std::size_t max_profile_name_len = 0;
|
||||
for (auto const & p : ctx.profile)
|
||||
max_profile_name_len = std::max(max_profile_name_len, p.name.size());
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue