Есть ли способ создать собственный генератор параметров с помощью googletest?

Я на самом деле использую каркас Googletest. У меня есть тест с параметризованным значением

std::tuple<int, double>

Это int представляет количество вершин в правильном многоугольнике, а double представляет его радиус. Я мог бы представить это с помощью такой структуры:

struct RegularPolygon{
int NbVertices;
double Radius;
}

Проблема в том, что я на самом деле создаю тесты, используя генератор параметров объединения:

INSTANTIATE_TEST_CASE_P(RegularPolygon, PolygonTestCase, testing::Combine(
testing::Range(3, 10),
testing::Range(1.0, 10.0)));

Так что, если я хочу перейти на использование

RegularPolygon

В качестве параметра, я должен жестко закодировать декартово произведение двух диапазонов.

Если нет способа определить мой собственный генератор RegularPolygon, который бы отображал только int на RegularPolygon :: NbVertices и удваивает на RegularPolygon :: Radius.

Есть ли способ сделать это?

Если нет, что было бы лучше всего преобразовать кортеж в экземпляр RegularPolygon?

1

Решение

Я пытался перегрузить operator+ а также operator< для тебя RegularPolygon:

struct RegularPolygon{
int NbVertices;
double Radius;

RegularPolygon(int a, double b) : NbVertices(a), Radius(b) {};

bool operator<(const RegularPolygon& o) { return (NbVertices < o.NbVertices && Radius < o.Radius); }
RegularPolygon operator+(const RegularPolygon& o) { return RegularPolygon(NbVertices + o.NbVertices, Radius + o.Radius);}
};

и использовать:

RegularPolygon first(1, 1.0);
RegularPolygon end(10, 10.0);
RegularPolygon step(1, 1.0);

INSTANTIATE_TEST_CASE_P(RegularPolygonTest,
PolygonTestCase,
::testing::Range(::first, ::end, ::step));
0

Другие решения

Просто переведите этот кортеж в нужный вам класс в классе тестового набора (см. polygonToTest переменная-член):

class PolygonTestCase : public ::testing::TestWithParam<std::tuple<int, double>>
{
protected:
RegularPolygon polygonToTest{
std::get<0>(GetParam()),
std::get<1>(GetParam())
};
};

TEST_P(PolygonTestCase, SomeTest)
{
// have access here to polygonToTest.NbVertices and polygonToTest.Radius
}

INSTANTIATE_TEST_CASE_P(RegularPolygon, PolygonTestCase, testing::Combine(
testing::Range(3, 10),
testing::Range(1.0, 10.0)));
0

По вопросам рекламы [email protected]