Есть ли в gtest что-то, что сравнивает двоичный файл? - PullRequest
0 голосов
/ 15 мая 2018

Имеет Google Test сравнивать функции, которые работают с двоичным представлением данного объекта?

У меня есть два struct -объекта одного типа, но нет функции сравнения.struct - это простой старый тип данных (POD), поэтому будет работать двоичное сравнение.

Мне нужно что-то вроде:

struct A{
  int some_data;
};

TEST(test, case){
    A a1{0}, a2{1};
    EXPECT_BINARY_EQ(a1, a2);
}

Какой самый простой способсделать это в C ++ с помощью gtest.

Ответы [ 3 ]

0 голосов
/ 15 мая 2018

Мое текущее решение:

#include <algorithm>

template < typename T >
bool binary_eq(T const& lhs, T const& rhs){
    auto lhs_i = reinterpret_cast< char const* >(&lhs);
    auto rhs_i = reinterpret_cast< char const* >(&rhs);
    return std::equal(lhs_i, lhs_i + sizeof(T), rhs_i);
}

Редактировать:

Благодаря Эрику Алапяя и Фрэнку, я понимаю, что это не может работать универсально из-за заполнения struct членов.В моем конкретном случае это работает, потому что все участники double.

0 голосов
/ 15 мая 2018

Если вы можете использовать библиотеку magic_get :

// requires: C++14, MSVC C++17
#include <iostream>
#include "boost/pfr/precise.hpp"

struct my_struct
{ // no operators defined!
    int    i;
    char   c;
    double d;
};

bool operator==(const my_struct& l, const my_struct& r)
{
    using namespace boost::pfr::ops; // out-of-the-box operators for all PODs!

    return boost::pfr::structure_tie( l ) == boost::pfr::structure_tie( r );
}

int main()
{
    my_struct s{ 100, 'H', 3.141593 };
    my_struct t{ 200, 'X', 1.234567 };

    std::cout << ( s == s ) << '\n' << ( s == t ) << "\n";
}

Определяя operator == ASSERT_EQ в Google Test, можно использовать:

TEST( Test_magic_get, Test_magic_get )
{
    my_struct s{ 100, 'H', 3.141593 };
    my_struct t{ 200, 'X', 1.234567 };

    //ASSERT_EQ( s, t );
    ASSERT_EQ( s, s );
}
0 голосов
/ 15 мая 2018

Мое предложение основано на: http://en.cppreference.com/w/cpp/language/operators

Вы можете определить operator == для своего класса, используя std::tie (из заголовка кортежей)

struct Record
{
    std::string name;
    unsigned int floor;
    double weight;

    friend bool operator ==(const Record& l, const Record& r)
    {
        return   std::tie(l.name, l.floor, l.weight)
              == std::tie(r.name, r.floor, r.weight); // keep the same order
    }
};
...