C++TESK Cookbook » History » Revision 2
Revision 1 (Alexander Kamkin, 07/31/2013 06:29 PM) → Revision 2/5 (Alexander Kamkin, 08/01/2013 11:06 AM)
h1. C++TESK Cookbook
h2. Developing a Report Printer
If you want to change the way the tool describes failures (you don’t like the printing style or you get used to work with a different format or you need to integrate your test system with a bug tracker or whatever), the best solution is probably to write your own report printer. It can be easily done by defining one method in a printer class and registering the printer in C++TESK Report Subsystem. The steps are as follows.
h4. Step 1. Printer Definition
<pre><code class="cpp">
#include <hw/report/printer.hpp>
using namespace cpptesk::hw::report;
// You need to inherit from the base printer
structure MyPrinter: public ReportPrinter
{
// ... and to define (override) the print method.
virtual void print(std::ostream &out, const Report &report) { ... }
};
</code></pre>
h4. Step 2. Printer Registration
<pre><code class="cpp">
// If the printer is ready, it may be registered.
CPPTESK_MODEL(MyModel)
{
MyModel()
{
// Printers are registered in a model.
registerReportPrinter(new MyPrinter());
...
}
};
</code></pre>
h4. Example. Simple Console Printer
<pre><code class="cpp">
void MyPrinter::print(std::ostream &out, const Report &report)
{
const Failures &failures = report.failures;
out << "================================================================================" << std::endl;
out << failures.name << std::endl;
out << "================================================================================" << std::endl;
for(Failures::const_iterator i = failures.begin(); i != failures.end(); i++)
{
const Failure &failure = *i;
out << "--------------------------------------------------------------------------------" << std::endl;
out << failure.name << std::endl;
out << "--------------------------------------------------------------------------------" << std::endl;
out << failure.type << std::endl;
out << failure.value << std::endl;
out << failure.unit << std::endl;
out << failure.info << std::endl;
out << failure.failure << std::endl;
const DataFailure &data = failure.data;
out << data.name << std::endl;
out << data.failure << std::endl;
for(DataFailure::const_iterator j = data.begin(); j != data.end(); j++)
{
const FieldFailure &field = *j;
out << field.name << std::endl;
out << field.failure << std::endl;
for(FieldFailure::const_iterator k = field.begin(); k != field.end(); k++)
{
const ItemFailure &item = *k;
out << item.name << std::endl;
out << item.spec << std::endl;
out << item.impl << std::endl;
out << item.failure << std::endl;
}
}
const TimeFailure &time = failure.time;
out << "--------------------------------------------------------------------------------" << std::endl;
out << time.name << std::endl;
out << "--------------------------------------------------------------------------------" << std::endl;
out << time.spec << std::endl;
out << time.impl << std::endl;
out << time.failure << std::endl;
const IfaceFailure &iface = failure.iface;
out << "--------------------------------------------------------------------------------" << std::endl;
out << iface.name << std::endl;
out << "--------------------------------------------------------------------------------" << std::endl;
out << iface.spec << std::endl;
out << iface.impl << std::endl;
out << iface.failure << std::endl;
}
const Simulation &simulation = report.simulation;
out << "================================================================================" << std::endl;
out << simulation.name << std::endl;
out << "================================================================================" << std::endl;
for(Simulation::const_iterator i = simulation.begin(); i != simulation.end(); i++)
{
const Cycle &cycle = *i;
out << cycle.name << std::endl;
out << cycle.value << std::endl;
}
const Statistics &statistics = report.statistics;
out << "================================================================================" << std::endl;
out << statistics.name << std::endl;
out << "================================================================================" << std::endl;
for(Statistics::const_iterator i = statistics.begin(); i != statistics.end(); i++)
{
const Count &count = *i;
out << count.name << std::endl;
out << count.value << std::endl;
}
}
</code></pre>
Before developing your report printer make sure that printer you need to develop (or a similar one) doesn’t exist in the library.