2017-07-17 40 views
1

我实际上使用googletest框架。我有一个值参数化测试有没有办法用googletest创建自定义参数生成器?

std::tuple<int, double> 

这个int代表正多边形中的顶点数,双代表它的半径。我可以代表这个使用这样的结构:

struct RegularPolygon{ 
    int NbVertices; 
    double Radius; 
} 

的问题是,我用结合PARAMATERS发电机实际创建测试:

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

所以,如果我想切换到使用

RegularPolygon 

结构作为我的参数,我必须硬编码两个范围的笛卡尔乘积。

除非有一种方法来定义我自己的RegularPolygon生成器,它只会将int映射到RegularPolygon :: NbVertices,并将double映射到RegularPolygon :: Radius。

有没有办法做到这一点?

如果没有,将元组转换为RegularPolygon实例的最佳做法是什么?

回答

0

我试图超载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

这是一个很好的s解决方案,但不完全是问题中陈述的内容,因为它不提供多边形属性的笛卡尔乘积的测试 – Kongol

+0

@Kongol由于我不知道笛卡尔乘积,所以我只给你一个**原型** 。你必须以你自己的方式实现'operator <'和'operator +'(符合Cartesian产品)。 –

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))); 
相关问题