refactor: Improve message parsing and dictionary handling
- Changed the type of dictionary variable from int to int8_t for better type safety. - Updated the handling of dictionary entries in message parsing to ensure correct formatting and prevent parsing errors with command arguments. - Refactored message data parsing logic to use index-based loops, improving clarity and correctness in handling command arguments. - Enhanced the documentation in message_data.h to provide a comprehensive overview of the message data system and its components. - Added new tests to validate the correct parsing of messages with commands and arguments, ensuring robustness against previous bugs.
This commit is contained in:
@@ -208,5 +208,93 @@ TEST_F(MessageRomTest, BuildDictionaryEntries_CorrectSize) {
|
||||
EXPECT_FALSE(result.empty());
|
||||
}
|
||||
|
||||
TEST_F(MessageRomTest, ParseMessageData_CommandWithArgument_NoExtraCharacters) {
|
||||
// This test specifically checks for the bug where command arguments
|
||||
// were being incorrectly parsed as characters (e.g., capital 'A' after [W])
|
||||
// The bug was caused by using a range-based for loop while also tracking position
|
||||
|
||||
// Message: [W:01]ABC
|
||||
// Bytes: 0x6B (W command), 0x01 (argument), 0x00 (A), 0x01 (B), 0x02 (C)
|
||||
std::vector<uint8_t> data = {0x6B, 0x01, 0x00, 0x01, 0x02};
|
||||
|
||||
editor::MessageData message;
|
||||
message.ID = 0;
|
||||
message.Address = 0;
|
||||
message.Data = data;
|
||||
|
||||
std::vector<editor::MessageData> message_data_vector = {message};
|
||||
auto parsed = editor::ParseMessageData(message_data_vector, dictionary_);
|
||||
|
||||
// Should be "[W:01]ABC" NOT "[W:01]BABC" or "[W:01]AABC"
|
||||
EXPECT_EQ(parsed[0], "[W:01]ABC");
|
||||
|
||||
// The 'B' should not appear twice or be skipped
|
||||
EXPECT_EQ(parsed[0].find("BABC"), std::string::npos);
|
||||
EXPECT_EQ(parsed[0].find("AABC"), std::string::npos);
|
||||
}
|
||||
|
||||
TEST_F(MessageRomTest, ParseMessageData_MultipleCommandsWithArguments) {
|
||||
// Test multiple commands with arguments in sequence
|
||||
// [W:01][C:02]AB
|
||||
std::vector<uint8_t> data = {
|
||||
0x6B, 0x01, // [W:01] - Window border command with arg
|
||||
0x77, 0x02, // [C:02] - Color command with arg
|
||||
0x00, 0x01 // AB - Regular characters
|
||||
};
|
||||
|
||||
editor::MessageData message;
|
||||
message.ID = 0;
|
||||
message.Data = data;
|
||||
|
||||
std::vector<editor::MessageData> message_data_vector = {message};
|
||||
auto parsed = editor::ParseMessageData(message_data_vector, dictionary_);
|
||||
|
||||
EXPECT_EQ(parsed[0], "[W:01][C:02]AB");
|
||||
|
||||
// Make sure argument bytes (0x01, 0x02) weren't parsed as characters
|
||||
EXPECT_EQ(parsed[0].find("BAB"), std::string::npos);
|
||||
EXPECT_EQ(parsed[0].find("CAB"), std::string::npos);
|
||||
}
|
||||
|
||||
TEST_F(MessageRomTest, ParseMessageData_CommandWithoutArgument) {
|
||||
// Test command without argument followed by text
|
||||
// [K]ABC - Wait for key command (no arg) followed by ABC
|
||||
std::vector<uint8_t> data = {
|
||||
0x7E, // [K] - Wait for key (no argument)
|
||||
0x00, 0x01, 0x02 // ABC
|
||||
};
|
||||
|
||||
editor::MessageData message;
|
||||
message.ID = 0;
|
||||
message.Data = data;
|
||||
|
||||
std::vector<editor::MessageData> message_data_vector = {message};
|
||||
auto parsed = editor::ParseMessageData(message_data_vector, dictionary_);
|
||||
|
||||
EXPECT_EQ(parsed[0], "[K]ABC");
|
||||
}
|
||||
|
||||
TEST_F(MessageRomTest, ParseMessageData_MixedCommands) {
|
||||
// Test mix of commands with and without arguments
|
||||
// [W:01]A[K]B[C:02]C
|
||||
std::vector<uint8_t> data = {
|
||||
0x6B, 0x01, // [W:01] - with arg
|
||||
0x00, // A
|
||||
0x7E, // [K] - no arg
|
||||
0x01, // B
|
||||
0x77, 0x02, // [C:02] - with arg
|
||||
0x02 // C
|
||||
};
|
||||
|
||||
editor::MessageData message;
|
||||
message.ID = 0;
|
||||
message.Data = data;
|
||||
|
||||
std::vector<editor::MessageData> message_data_vector = {message};
|
||||
auto parsed = editor::ParseMessageData(message_data_vector, dictionary_);
|
||||
|
||||
EXPECT_EQ(parsed[0], "[W:01]A[K]B[C:02]C");
|
||||
}
|
||||
|
||||
} // namespace test
|
||||
} // namespace yaze
|
||||
|
||||
Reference in New Issue
Block a user