2017-08-11 45 views
1

我想用QtTest設置一些單元測試,我想用QFETCH。用Q_DECLARE_METATYPE聲明無符號字符[]

我測試下面的函數:

static std::vector<bool> FrameHandler::getBitsFromFrame(unsigned char* data, unsigned char length); 

它只是簡單地將一陣列炭的成比特向量。

所以,我建立了我的測試類是這樣的:

#include <QtTest/QtTest> 
#include <vector> 
#include "FrameHandler.h" 

class BusTester : public QObject { 
    Q_OBJECT 

private slots: 

    void bytesToVector_data() { 
     QTest::addColumn<unsigned char[]>("Tested"); 
     QTest::addColumn<unsigned char>("Length"); 
     QTest::addColumn< std::vector<bool> >("Reference"); 

     // Test for one byte 
     std::vector<bool> oneByte(8, false); 
     oneByte[0] = true; 
     oneByte[1] = true; 
     oneByte[3] = true; 
     oneByte[4] = true; 

     unsigned char oneByteInput[1]{ 
      0b11011000 
     }; 

     QTest::newRow("One byte") << oneByteInput << 1 << oneByte; 
    } 

    void bytesToVector() { 
     QFETCH(unsigned char[], tested); 
     QFETCH(unsigned char, length); 
     QFETCH(std::vector<bool>, reference); 

     QCOMPARE(FrameHandler::getBitsFromFrame(tested, length), reference); 
    } 
}; 

QTEST_MAIN(BusTester) 
#include "bustester.moc" 

當我這樣做時,編譯器說:

expected unqualified-id before ‘[’ token 
     QFETCH(unsigned char[], tested); 

而且也:

On line `QTest::addColumn<unsigned char[]>("Tested");`, Type is not registered, please use the Q_DECLARE_METATYPE macro to make it known to Qt's meta-object system 

我想這兩個錯誤是有聯繫的,所以我在類聲明前加了Q_DECLARE_METATYPE(unsigned char[]);,但是我得到這個:

qmetatype.h,前 '*' 標記(線1695)

是否有可能宣佈unsigned char[] Qt的QMetaType系統預計 '>'? 謝謝

回答

2

Q_DECLARE_METATYPE(T)類型T必須是可構造的,可複製的和可破壞的。 數組不符合此規則,但您可以創建封裝。

struct Arr 
{ 
    unsigned char arr[SIZE]; 
}; 
Q_DECLARE_METATYPE(Arr); 

typedef std::array<unsigned char, SIZE> TArr; 
Q_DECLARE_METATYPE(TArr); 

但有一個困難 - 大小,您必須對聲明它

+0

或者只是使用一個'無符號字符*' – dtech

+0

是。但在這種情況下,您必須保持某個尖頂對象以避免訪問衝突。這個測試數據,所以它可以靜態常量來實現。 – arturx64

+0

據推測,OP知道他在做什麼,現在要避免出界限。 – dtech