2017-07-17 43 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))); 
相關問題