This commit is contained in:
deeaitch committed 2026-10-14 09:04:11 -04:00
1 parent c3d3bd51fb
commit 6d6ace4315
6 files changed
+86 -4

No files matched your search

+55
View File
@@ -1,6 +1,7 @@
// SPDX-License-Identifier: MIT
#include "dbc_decode_builder.h"
#include "dbc_decoder.h"
#include "signal_layout.h"
#include <QtTest>
#include <limits>
#include <stdexcept>
@@ -53,6 +54,8 @@ private Q_SLOTS:
void numericParameters_data();
void numericParameters();
void validBoundaries();
void layoutBoundaries();
void builderSnapshot();
void multiplexingBoundaries();
void independentSnapshot();
void failedReplacement();
@@ -267,6 +270,50 @@ void DbcValidationTest::validBoundaries() {
QVERIFY(DbcDecodeBuilder().Build(DbcDatabase()).GetFrames().empty());
}
void DbcValidationTest::layoutBoundaries() {
// Compare the shared coordinate calculation with independent DBC bit traversal.
for (const std::uint8_t dlc: {std::uint8_t(0U), std::uint8_t(1U), std::uint8_t(8U),
std::uint8_t(64U), std::uint8_t(255U)}) {
const std::uint64_t payloadBits = std::uint64_t(dlc) * 8U;
for (const bool littleEndian: {true, false}) {
for (std::uint32_t start = 0U; start < payloadBits + 8U; ++start) {
std::uint64_t bit = start;
bool fits = true;
QVERIFY(!IsValidSignalLayout(start, 0U, littleEndian, dlc));
for (std::uint32_t length = 1U; length <= 64U; ++length) {
fits = fits && bit < payloadBits;
QCOMPARE(IsValidSignalLayout(start, length, littleEndian, dlc), fits);
if (littleEndian)
++bit;
else
bit = bit % 8U == 0U ? bit + 15U : bit - 1U;
}
QVERIFY(!IsValidSignalLayout(start, 65U, littleEndian, dlc));
}
const std::uint32_t maximum = std::numeric_limits<std::uint32_t>::max();
QVERIFY(!IsValidSignalLayout(maximum, 1U, littleEndian, dlc));
QVERIFY(!IsValidSignalLayout(maximum, maximum, littleEndian, dlc));
QVERIFY(!IsValidSignalLayout(0U, maximum, littleEndian, dlc));
}
}
}
void DbcValidationTest::builderSnapshot() {
DbcDatabase source = ParsedDefinitions({ValidFrame()});
source.frames[0].signals[0].valueDescriptions.emplace(std::uint64_t(1U), "One");
const FrameKey key(source.frames[0].canId, source.frames[0].isExtended);
const DecodeDatabase database = DbcDecodeBuilder().Build(source);
source.frames[0].canId = 0x800U;
source.frames[0].signals[0].name = "Changed";
source.frames[0].signals[0].valueDescriptions.begin()->second = "Changed";
source.frames.clear();
const std::shared_ptr<const DecodeSignal> signal = database.FindSignal(SignalKey(key, "Value"));
QVERIFY(signal);
QCOMPARE(signal->valueDescriptions.begin()->second, std::string("One"));
QVERIFY(database.FindFrame(key));
QVERIFY(!database.FindFrame(FrameKey(0x800U, false)));
}
void DbcValidationTest::multiplexingBoundaries() {
DecodeFrame frame = ValidFrame();
frame.dlc = 9U;
@@ -333,6 +380,14 @@ void DbcValidationTest::failedReplacement() {
QVERIFY_THROWS_EXCEPTION(std::invalid_argument,
database = DbcDecodeBuilder().Build(ParsedDefinitions({invalid})));
QCOMPARE(database.FindFrame(valid.GetKey()).get(), original.get());
QVERIFY_THROWS_EXCEPTION(std::invalid_argument, database = DecodeDatabase({valid, valid}));
QCOMPARE(database.FindFrame(valid.GetKey()).get(), original.get());
invalid = valid;
invalid.signals.push_back(invalid.signals[0]);
QVERIFY_THROWS_EXCEPTION(std::invalid_argument,
database = DbcDecodeBuilder().Build(ParsedDefinitions({invalid})));
QCOMPARE(database.FindFrame(valid.GetKey()).get(), original.get());
QVERIFY(database.FindSignal(SignalKey(valid.GetKey(), "Value")));
QCOMPARE(database.GetFrames().size(), std::size_t(1U));
database = DecodeDatabase();
QVERIFY(database.GetFrames().empty());