Project

General

Profile

Actions

C++TESK Cookbook » History » Revision 3

« Previous | Revision 3/5 (diff) | Next »
Alexander Kamkin, 08/01/2013 01:39 PM


C++TESK Cookbook

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.

Step 1. Printer Definition

#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) { ... }
};

Step 2. Printer Registration

// If the printer is ready, it may be registered.
CPPTESK_MODEL(MyModel)
{
    MyModel()
    {
        // Printers are registered in a model.
        registerReportPrinter(new MyPrinter());
        ...
    }
};

Example. Simple Console Printer

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;
    }
}

Before developing your report printer make sure that printer you need to develop (or a similar one) doesn’t exist in the library.

Updated by Alexander Kamkin over 11 years ago · 5 revisions