Как добавить описание в тестовый набор, используя перегруженный оператор равенства (==)? - PullRequest
1 голос
/ 24 февраля 2020
TEST_CASE("Functions of Square")
{
    std::array<Point, 4> a_Vertices{Point(2, 2), Point(2, 4), Point(4, 2), Point(4, 4)};
    Square a_Square(a_Vertices, true);

    SECTION("Square is initialized properly")
    {
        REQUIRE(a_Square.get_Vertex_0() == Point(2, 1));
    }
}

Используя каркас модульного теста catch2, я хочу переопределить метод catch2 description, чтобы он выводил мой тип вместо {?} == {?}

Я также пытался это сделать через метод matcher

class Point_Matcher : public Catch::MatcherBase<Point>
{
private:
    Point p_;

public:
    Point_Matcher(const Point &a_Point)
        : p_(a_Point) {}

    bool match(Point const &a_Point) const override
    {
        return a_Point == p_;
    }

    virtual std::string describe() const override
    {
        std::ostringstream oss;
        oss << "not the same as Point (" << p_.get_X() << ", " << p_.get_Y() << ")";
        return oss.str();
    }
};

inline Point_Matcher is_Same(const Point &a_Point)
{
    return Point_Matcher(a_Point);
}

TEST_CASE("Functions of Square")
{
    std::array<Point, 4> a_Vertices{Point(2, 2), Point(2, 4), Point(4, 2), Point(4, 4)};
    Square a_Square(a_Vertices, true);

    SECTION("Square is initialized properly")
    {
        REQUIRE_THAT(a_Square.get_Vertex_0(), is_Same(Point(2, 1)));
    }
}

однако он будет показывать только объект, указанный в качестве теста, и не будет показывать тестируемый объект. Выходные данные будут {?} Не такими, как точка (2, 1)

в https://github.com/catchorg/Catch2/blob/master/docs/tostring.md#top Предлагаемый способ сделать это - переопределить оператор << из std :: ostream однако я не знаю, что я должен делать после перегрузки оператора. </p>

Заранее благодарен за ответ

Редактировать: Перегрузка для оператора << для точки Объект выглядит следующим образом: </p>

std::ostream &operator<<(std::ostream &os, const Point &p)
{
    os << "Point (" << p.get_X() << ", " << p.get_Y();
    return os;
}

Другими словами, выход, к которому я стремлюсь, в этом случае в конкретной точке (x, y) не совпадает с точкой (x, y)

1 Ответ

0 голосов
/ 24 февраля 2020

Есть два подхода, которые обычно используются. Оба описаны в документации , которую вы упомянули.

  1. Перегрузка оператора << для std :: ostream </a> с ограничением:

Вы должны поместить эту функцию в то же пространство имен, что и ваш тип, или в глобальное пространство имен, и объявить ее перед включением заголовка Catch.

Итак, перегрузка вашего оператора в порядке, просто положить его до #include "catch.hpp".

#define CATCH_CONFIG_MAIN
#include <array>
#include "Point.h"
#include "Square.h"    

std::ostream &operator<<(std::ostream &os, Point const& p)
{
    os << "Point (" << p.get_X() << ", " << p.get_Y() << ")";
    return os;
}

#include "catch.hpp"

TEST_CASE("Functions of Square")
{
    std::array<Point, 4> a_Vertices{Point(2, 2), Point(2, 4), Point(4, 2), Point(4, 4)};
    Square a_Square(a_Vertices, true);

    SECTION("Square is initialized properly")
    {
        REQUIRE_THAT(a_Square.get_Vertex_0(), is_Same(Point(2, 1)));
    }
}

2. Специализация Catch :: StringMaker с дополнительным использованием stringstream для правильного форматирования вывода.

#define CATCH_CONFIG_MAIN
#include <array>
#include <sstream>
#include "Point.h"
#include "Square.h"
#include "catch.hpp"

namespace Catch
{
template <> struct StringMaker<Point>
{
    static std::string convert(Point const& p)
    {
        std::stringstream buf;
        buf << "Point (" << p.get_X() << ", " << p.get_Y() << ")";
        return << buf.str();
    }
};
}

TEST_CASE("Functions of Square")
{
    std::array<Point, 4> a_Vertices{Point(2, 2), Point(2, 4), Point(4, 2), Point(4, 4)};
    Square a_Square(a_Vertices, true);

    SECTION("Square is initialized properly")
    {
        REQUIRE_THAT(a_Square.get_Vertex_0(), is_Same(Point(2, 1)));
    }
}    

Этот подход позволяет избежать глобального загрязнения пространства имен и позволить Вы маскируете любой другой ранее определенный оператор <<. Сначала будет использоваться специализация StringMaker.

...