Closes #11
This commit is contained in:
1 parent
0067cb4ddd
commit
f17ddb6aad
104 files changed
+1928
-889
No files matched your search
+64
-51
@@ -1,6 +1,6 @@
|
||||
#include "dbc_decoder.h"
|
||||
|
||||
#include <iostream>
|
||||
#include <QtTest>
|
||||
#include <limits>
|
||||
#include <sstream>
|
||||
|
||||
@@ -18,7 +18,18 @@ struct DecodeCase {
|
||||
double physicalValue;
|
||||
};
|
||||
|
||||
int main() {
|
||||
Q_DECLARE_METATYPE(DecodeCase)
|
||||
|
||||
class DbcDecoderTest : public QObject {
|
||||
Q_OBJECT
|
||||
private Q_SLOTS:
|
||||
void decode_data();
|
||||
void decode();
|
||||
void boundaries();
|
||||
};
|
||||
|
||||
void DbcDecoderTest::decode_data() {
|
||||
QTest::addColumn<DecodeCase>("test");
|
||||
const DecodeCase cases[] = {
|
||||
{"Motorola reproduction", ByteOrder::Motorola, 7U, 16U, ValueType::Unsigned, {0x12, 0x34}, true, 0x1234, 1.0, 0.0, 4660.0},
|
||||
{"Motorola within byte", ByteOrder::Motorola, 5U, 4U, ValueType::Unsigned, {0xAC}, true, 11, 1.0, 0.0, 11.0},
|
||||
@@ -38,47 +49,49 @@ int main() {
|
||||
{"Intel signed regression", ByteOrder::Intel, 0U, 16U, ValueType::Signed, {0xFE, 0xFF}, true, -2, 0.5, 10.0, 9.0},
|
||||
{"Intel short payload", ByteOrder::Intel, 0U, 16U, ValueType::Unsigned, {0x12}, false, 0, 1.0, 0.0, 0.0}};
|
||||
|
||||
int failures = 0;
|
||||
for (const DecodeCase &test: cases) {
|
||||
DecodeSignal signal;
|
||||
signal.name = test.name;
|
||||
signal.byteOrder = test.byteOrder;
|
||||
signal.startBit = test.startBit;
|
||||
signal.length = test.length;
|
||||
signal.valueType = test.valueType;
|
||||
signal.factor = test.factor;
|
||||
signal.offset = test.offset;
|
||||
for (const auto &test: cases)
|
||||
QTest::newRow(test.name) << test;
|
||||
}
|
||||
|
||||
DecodeFrame definition;
|
||||
definition.canId = 0x123U;
|
||||
definition.dlc = static_cast<std::uint8_t>(test.data.size());
|
||||
definition.signals.push_back(signal);
|
||||
DecodeDatabase database;
|
||||
database.frames.push_back(definition);
|
||||
database.frameIndexByKey.emplace(FrameKey(definition.canId, false), 0U);
|
||||
void DbcDecoderTest::decode() {
|
||||
QFETCH(DecodeCase, test);
|
||||
DecodeSignal signal;
|
||||
signal.name = test.name;
|
||||
signal.byteOrder = test.byteOrder;
|
||||
signal.startBit = test.startBit;
|
||||
signal.length = test.length;
|
||||
signal.valueType = test.valueType;
|
||||
signal.factor = test.factor;
|
||||
signal.offset = test.offset;
|
||||
|
||||
RawCanFrame frame;
|
||||
frame.canId = definition.canId;
|
||||
frame.data = test.data;
|
||||
const DecodedFrameValue result = DbcDecoder().Decode(database, frame);
|
||||
const bool passed = result.valid &&
|
||||
(result.definition == &database.frames[0]) &&
|
||||
(result.signals.size() == 1U) &&
|
||||
(result.signals[0].definition == &database.frames[0].signals[0]) &&
|
||||
(result.signals[0].valid == test.valid) &&
|
||||
(!test.valid || (((test.valueType == ValueType::Signed)
|
||||
? (std::get_if<std::int64_t>(&result.signals[0].rawValue) &&
|
||||
std::get<std::int64_t>(result.signals[0].rawValue) == test.rawValue)
|
||||
: (std::get_if<std::uint64_t>(&result.signals[0].rawValue) &&
|
||||
std::get<std::uint64_t>(result.signals[0].rawValue) ==
|
||||
static_cast<std::uint64_t>(test.rawValue))) &&
|
||||
(result.signals[0].physicalValue == test.physicalValue)));
|
||||
if (!passed) {
|
||||
std::cerr << "FAIL: " << test.name << '\n';
|
||||
++failures;
|
||||
}
|
||||
}
|
||||
std::size_t boundaryCases = 0U;
|
||||
DecodeFrame definition;
|
||||
definition.canId = 0x123U;
|
||||
definition.dlc = static_cast<std::uint8_t>(test.data.size());
|
||||
definition.signals.push_back(signal);
|
||||
DecodeDatabase database;
|
||||
database.frames.push_back(definition);
|
||||
database.frameIndexByKey.emplace(FrameKey(definition.canId, false), 0U);
|
||||
|
||||
RawCanFrame frame;
|
||||
frame.canId = definition.canId;
|
||||
frame.data = test.data;
|
||||
const DecodedFrameValue result = DbcDecoder().Decode(database, frame);
|
||||
const bool passed = result.valid &&
|
||||
(result.definition == &database.frames[0]) &&
|
||||
(result.signals.size() == 1U) &&
|
||||
(result.signals[0].definition == &database.frames[0].signals[0]) &&
|
||||
(result.signals[0].valid == test.valid) &&
|
||||
(!test.valid || (((test.valueType == ValueType::Signed)
|
||||
? (std::get_if<std::int64_t>(&result.signals[0].rawValue) &&
|
||||
std::get<std::int64_t>(result.signals[0].rawValue) == test.rawValue)
|
||||
: (std::get_if<std::uint64_t>(&result.signals[0].rawValue) &&
|
||||
std::get<std::uint64_t>(result.signals[0].rawValue) ==
|
||||
static_cast<std::uint64_t>(test.rawValue))) &&
|
||||
(result.signals[0].physicalValue == test.physicalValue)));
|
||||
QVERIFY2(passed, test.name);
|
||||
}
|
||||
|
||||
void DbcDecoderTest::boundaries() {
|
||||
for (ByteOrder order: {ByteOrder::Intel, ByteOrder::Motorola}) {
|
||||
for (ValueType type: {ValueType::Unsigned, ValueType::Signed}) {
|
||||
for (std::uint64_t bits: {std::uint64_t(0U), std::uint64_t(0x7FFFFFFFFFFFFFFFULL),
|
||||
@@ -126,17 +139,17 @@ int main() {
|
||||
expectedText << bits;
|
||||
else
|
||||
expectedText << signedExpected;
|
||||
if (!decoded.valid || decoded.rawValue != expected ||
|
||||
decoded.physicalValue != physical || actualText.str() != expectedText.str()) {
|
||||
std::cerr << "FAIL: 64-bit boundary " << bits << '\n';
|
||||
++failures;
|
||||
}
|
||||
++boundaryCases;
|
||||
QVERIFY2(decoded.valid && decoded.rawValue == expected &&
|
||||
decoded.physicalValue == physical && actualText.str() == expectedText.str(),
|
||||
expectedText.str().c_str());
|
||||
}
|
||||
}
|
||||
}
|
||||
if (failures != 0)
|
||||
return 1;
|
||||
std::cout << "All " << sizeof(cases) / sizeof(cases[0]) + boundaryCases << " decoder cases passed.\n";
|
||||
return 0;
|
||||
}
|
||||
|
||||
int RunDecoderTests(int argc, char **argv) {
|
||||
DbcDecoderTest tests;
|
||||
return QTest::qExec(&tests, argc, argv);
|
||||
}
|
||||
|
||||
#include "dbc_decoder_test.moc"
|
||||
Reference in new issue
Block a user