|
| 1 | +#include <catch2/catch_test_macros.hpp> |
| 2 | +#include <catch2/catch_approx.hpp> |
| 3 | +#include <catch2/matchers/catch_matchers.hpp> |
| 4 | + |
| 5 | +#include <libdbc/dbc.hpp> |
| 6 | + |
| 7 | +#include "common.hpp" |
| 8 | + |
| 9 | +// Testing of parsing messages |
| 10 | + |
| 11 | +TEST_CASE("Parse Message 1 Big Endian") { |
| 12 | + libdbc::DbcParser parser(true); |
| 13 | + |
| 14 | + const auto dbcContent = R"(BO_ 234 MSG1: 8 Vector__XXX |
| 15 | + SG_ Sig1 : 0|8@0- (0.1,-3) [-3276.8|-3276.7] "C" Vector__XXX |
| 16 | + SG_ Sig2 : 8|8@0- (0.15,7) [-3276.8|-3276.7] "C" Vector__XXX |
| 17 | +)"; |
| 18 | + |
| 19 | + const auto* filename = std::tmpnam(NULL); |
| 20 | + CHECK(create_tmp_dbc_with(filename, dbcContent)); |
| 21 | + |
| 22 | + parser.parse_file(filename); |
| 23 | + |
| 24 | + SECTION("Evaluating first message") { |
| 25 | + std::vector<double> out_values; |
| 26 | + CHECK(parser.parseMessage(234, std::vector<uint8_t>({0x01, 0x02}), out_values) == true); |
| 27 | + CHECK(out_values.size() == 2); |
| 28 | + CHECK(out_values.at(0) == 0x01 * 0.1 - 3); |
| 29 | + CHECK(out_values.at(1) == 0x02 * 0.15 + 7); |
| 30 | + } |
| 31 | + |
| 32 | +} |
| 33 | + |
| 34 | +TEST_CASE("Parse Message 2 Big Endian") { |
| 35 | + libdbc::DbcParser parser(true); |
| 36 | + |
| 37 | + const auto dbcContent = R"(BO_ 234 MSG1: 8 Vector__XXX |
| 38 | + SG_ Msg1Sig1 : 0|8@0+ (1,0) [-3276.8|-3276.7] "C" Vector__XXX |
| 39 | + SG_ MsgSig2 : 8|8@0+ (1,0) [-3276.8|-3276.7] "C" Vector__XXX |
| 40 | +BO_ 123 MSG2: 8 Vector__XXX |
| 41 | + SG_ Msg2Sig1 : 0|8@0+ (1,0) [-3276.8|-3276.7] "C" Vector__XXX |
| 42 | + SG_ Msg2Sig1 : 8|8@0+ (1,0) [-3276.8|-3276.7] "C" Vector__XXX |
| 43 | +)"; |
| 44 | + |
| 45 | + const auto* filename = std::tmpnam(NULL); |
| 46 | + CHECK(create_tmp_dbc_with(filename, dbcContent)); |
| 47 | + |
| 48 | + parser.parse_file(filename); |
| 49 | + |
| 50 | + SECTION("Evaluating first message") { |
| 51 | + std::vector<double> out_values; |
| 52 | + CHECK(parser.parseMessage(234, std::vector<uint8_t>({0x01, 0x02}), out_values) == true); |
| 53 | + std::vector<double> refData{0x01, 0x02}; |
| 54 | + CHECK(refData.size() == 2); |
| 55 | + CHECK(out_values.size() == refData.size()); |
| 56 | + for (int i=0; i < refData.size(); i++) { |
| 57 | + CHECK(out_values.at(i) == refData.at(i)); |
| 58 | + } |
| 59 | + } |
| 60 | + |
| 61 | + SECTION("Evaluating unknown message id") { |
| 62 | + std::vector<double> out_values; |
| 63 | + CHECK(parser.parseMessage(578, std::vector<uint8_t>({0xFF, 0xA2}), out_values) == false); |
| 64 | + } |
| 65 | +} |
| 66 | + |
| 67 | +TEST_CASE("Parse Message Big Number not aligned little endian") { |
| 68 | + libdbc::DbcParser parser(true); |
| 69 | + |
| 70 | + const auto dbcContent = R"(BO_ 337 STATUS: 8 Vector__XXX |
| 71 | + SG_ Value6 : 27|3@1+ (1,0) [0|7] "" Vector__XXX |
| 72 | + SG_ Value5 : 16|11@1+ (0.1,-102) [-102|102] "%" Vector__XXX |
| 73 | + SG_ Value2 : 8|2@1+ (1,0) [0|2] "" Vector__XXX |
| 74 | + SG_ Value3 : 10|1@1+ (1,0) [0|1] "" Vector__XXX |
| 75 | + SG_ Value7 : 30|2@1+ (1,0) [0|3] "" Vector__XXX |
| 76 | + SG_ Value4 : 11|4@1+ (1,0) [0|3] "" Vector__XXX |
| 77 | + SG_ Value1 : 0|8@1+ (1,0) [0|204] "Km/h" Vector__XXX |
| 78 | +)"; |
| 79 | + |
| 80 | + const auto* filename = std::tmpnam(NULL); |
| 81 | + CHECK(create_tmp_dbc_with(filename, dbcContent)); |
| 82 | + |
| 83 | + parser.parse_file(filename); |
| 84 | + |
| 85 | + SECTION("Evaluating first message") { |
| 86 | + std::vector<double> out_values; |
| 87 | + CHECK(parser.parseMessage(337, std::vector<uint8_t>({0, 4, 252, 19, 0, 0, 0, 0}), out_values) == true); |
| 88 | + std::vector<double> refData{0, 0, 1, 0, 0, 2, 0}; |
| 89 | + CHECK(refData.size() == 7); |
| 90 | + CHECK(out_values.size() == refData.size()); |
| 91 | + for (int i=0; i < refData.size(); i++) { |
| 92 | + CHECK(out_values.at(i) == refData.at(i)); |
| 93 | + } |
| 94 | + } |
| 95 | + |
| 96 | + SECTION("Evaluating second message") { |
| 97 | + std::vector<double> out_values; |
| 98 | + CHECK(parser.parseMessage(337, std::vector<uint8_t>({47, 4, 60, 29, 0, 0, 0, 0}), out_values) == true); |
| 99 | + std::vector<double> refData{47, 0, 1, 0, 32, 3, 0}; |
| 100 | + CHECK(refData.size() == 7); |
| 101 | + CHECK(out_values.size() == refData.size()); |
| 102 | + for (int i=0; i < refData.size(); i++) { |
| 103 | + CHECK(out_values.at(i) == refData.at(i)); |
| 104 | + } |
| 105 | + } |
| 106 | + |
| 107 | + SECTION("Evaluating third message") { |
| 108 | + std::vector<double> out_values; |
| 109 | + CHECK(parser.parseMessage(337, std::vector<uint8_t>({57, 4, 250, 29, 0, 0, 0, 0}), out_values) == true); |
| 110 | + std::vector<double> refData{57, 0, 1, 0, 51, 3, 0}; |
| 111 | + CHECK(refData.size() == 7); |
| 112 | + CHECK(out_values.size() == refData.size()); |
| 113 | + for (int i=0; i < refData.size(); i++) { |
| 114 | + CHECK(out_values.at(i) == refData.at(i)); |
| 115 | + } |
| 116 | + } |
| 117 | +} |
| 118 | + |
| 119 | +// TODO: create also for big endian! |
0 commit comments