2015-04-01 8 views
5

मैं gtest के साथ एक टेम्पलेट वर्ग का परीक्षण करना चाहता हूँ। मैंने gtest मैनुअल में TYPED_TEST एस पढ़ा और आधिकारिक उदाहरण (samples\sample6_unittest.cc) को संदर्भित किया। उदाहरण से इस टेम्पलेट में केवल एक टेम्पलेट पैरामीटर है। लेकिन, मेरे कोड में दो टेम्पलेट पैरामीटर हैं, मैं इसका परीक्षण कैसे कर सकता हूं?gtest का उपयोग कर एकाधिक टेम्पलेट पैरामीटर के साथ C++ टेम्पलेट क्लास का परीक्षण कैसे करें?

// two element type 
template <typename E, typename F> 
class QueueNew 
{ 
public: 
    QueueNew() {} 
    void Enqueue(const E& element) {} 
    E* Dequeue() {} 
    F size() const 
    { 
     return (F)123; 
    } 
}; 

जिसके लिए मैं नीचे परीक्षण कोड लिखा है::

error C2976: 'QueueTestNew' : too few template arguments 
see declaration of 'QueueTestNew' 
... 

मैं:

template <class E, class F> 
QueueNew<E, F>* CreateQueue(); 

template <> 
QueueNew<int, int>* CreateQueue<int, int>() 
{ 
    return new QueueNew < int, int > ; 
} 
template <> 
QueueNew<char, char>* CreateQueue<char, char>() 
{ 
    return new QueueNew < char, char > ; 
} 

template <class E, class F> 
class QueueTestNew; 

template <class E> 
class QueueTestNew<E, int> : public testing::Test 
{ 
protected: 
    QueueTestNew() : queue(CreateQueue<E, int>()){} 
    virtual ~QueueTestNew(){ delete queue; } 
    QueueNew<E, int>* const queue; 
}; 

template <class E> 
class QueueTestNew<char, E> : public testing::Test 
{ 
protected: 
    QueueTestNew() : queue(CreateQueue<char, E>()){} 
    virtual ~QueueTestNew(){ delete queue; } 
    QueueNew<char, E>* const queue; 
}; 

// The list of types we want to test. 
typedef ::testing::Types <char, int> Implementations; 

TYPED_TEST_CASE(QueueTestNew, Implementations); 

TYPED_TEST(QueueTestNew, DefaultConstructor) 
{ 
    EXPECT_EQ(123u, this->queue->size()); 
} 

लेकिन जब निर्माण, मैं त्रुटि मिलती है

मैं निम्नलिखित कोड है लगता है कि gtest के साथ मेरी टेस्ट टेम्पलेट विधि गलत है, तो मुझे यह कैसे करना चाहिए?

+0

तुम एक प्रकार परिभाषित कर सकते ऐसा करने के लिए, आप इस तरह के रूप में एक टेम्प्लेट की संरचना को परिभाषित कर सकते आपके प्रत्येक उपप्रकार। फिर उस कंट्री द्वारा टाइप-पैरामीट्रिज्ड होने के लिए 'क्यूईटेस्टन्यू' बनाएं (अतिरिक्त टेम्पलेट पैराम्स को घोंसला)। – SleuthEye

+0

क्षमा करें, मुझे यह नहीं मिला। – thinkerou

उत्तर

8

एक चाल नेटस्टेड प्रकारों के साथ, एक प्रकार के पैरामीटर को देखने के लिए होगी।

template <typename A, typename B> 
struct TypeDefinitions 
{ 
    typedef typename A MyA; 
    typedef typename B MyB; 
}; 

कौन सा आप अपने द्वारा लिखे गए परीक्षण स्थिरता के लिए पारित कर सकते हैं: इस तरह के लिए एक से अधिक typedefs के साथ एक struct के रूप में

template <class T> 
class QueueTestNew : public testing::Test 
{ 
protected: 
    QueueTestNew() : queue(CreateQueue<typename T::MyA, typename T::MyB>()){} 
    virtual ~QueueTestNew(){ delete queue; } 
    QueueNew<typename T::MyA, typename T::MyB>* const queue; 
}; 

// The list of types we want to test. 
typedef ::testing::Types <TypeDefinitions<char,char>, 
          TypeDefinitions<int,int> > Implementations; 

TYPED_TEST_CASE(QueueTestNew, Implementations); 

TYPED_TEST(QueueTestNew, DefaultConstructor) 
{ 
    typename TypeParam::MyA someA; // if you need access to the subtypes in the test itself 

    EXPECT_EQ(123u, this->queue->size()); 
} 
+0

ओह ब्रावो। यह मिला, thx बहुत ज्यादा! टेम्पलेट और टाइपनाम बहुत मजबूत हैं! – thinkerou

संबंधित मुद्दे

 संबंधित मुद्दे