240 lines
7.1 KiB
C++
240 lines
7.1 KiB
C++
|
|
/**
|
|||
|
|
* @file test_can.cpp
|
|||
|
|
* @brief CAN协议层测试
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
#include "../include/can/CanMessage.h"
|
|||
|
|
#include "../include/can/CanController.h"
|
|||
|
|
#include "../include/can/CanFdController.h"
|
|||
|
|
#include "../include/platform/Platform.h"
|
|||
|
|
#include <iostream>
|
|||
|
|
#include <cassert>
|
|||
|
|
#include <cstring>
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 测试CAN消息创建功能
|
|||
|
|
* @return 测试结果
|
|||
|
|
*/
|
|||
|
|
bool test_can_message_creation() {
|
|||
|
|
std::cout << " [TEST] Testing CAN message creation..." << std::endl;
|
|||
|
|
|
|||
|
|
// 创建CAN消息
|
|||
|
|
usb2can::can::CanMessage message;
|
|||
|
|
|
|||
|
|
// 设置消息属性
|
|||
|
|
message.id = 0x123;
|
|||
|
|
message.dlc = 8;
|
|||
|
|
message.extended = true;
|
|||
|
|
message.rtr = false;
|
|||
|
|
|
|||
|
|
// 设置数据
|
|||
|
|
uint8_t data[8] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};
|
|||
|
|
std::memcpy(message.data, data, sizeof(data));
|
|||
|
|
|
|||
|
|
// 验证消息属性
|
|||
|
|
if (message.id != 0x123 || message.dlc != 8 || !message.extended || message.rtr) {
|
|||
|
|
std::cout << " [FAIL] CAN message properties not set correctly" << std::endl;
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 验证数据
|
|||
|
|
if (std::memcmp(message.data, data, sizeof(data)) != 0) {
|
|||
|
|
std::cout << " [FAIL] CAN message data not set correctly" << std::endl;
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
std::cout << " [PASS] CAN message created successfully" << std::endl;
|
|||
|
|
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 测试CAN消息构造函数
|
|||
|
|
* @return 测试结果
|
|||
|
|
*/
|
|||
|
|
bool test_can_message_constructor() {
|
|||
|
|
std::cout << " [TEST] Testing CAN message constructor..." << std::endl;
|
|||
|
|
|
|||
|
|
// 准备数据
|
|||
|
|
uint8_t data[8] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};
|
|||
|
|
|
|||
|
|
// 使用构造函数创建CAN消息
|
|||
|
|
usb2can::can::CanMessage message(0x456, data, 8, true, false);
|
|||
|
|
|
|||
|
|
// 验证消息属性
|
|||
|
|
if (message.id != 0x456 || message.dlc != 8 || !message.extended || message.rtr) {
|
|||
|
|
std::cout << " [FAIL] CAN message constructor not working correctly" << std::endl;
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 验证数据
|
|||
|
|
if (std::memcmp(message.data, data, sizeof(data)) != 0) {
|
|||
|
|
std::cout << " [FAIL] CAN message data not set correctly by constructor" << std::endl;
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
std::cout << " [PASS] CAN message constructor working correctly" << std::endl;
|
|||
|
|
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 测试CAN消息复制功能
|
|||
|
|
* @return 测试结果
|
|||
|
|
*/
|
|||
|
|
bool test_can_message_copy() {
|
|||
|
|
std::cout << " [TEST] Testing CAN message copy..." << std::endl;
|
|||
|
|
|
|||
|
|
// 创建原始消息
|
|||
|
|
uint8_t data[8] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};
|
|||
|
|
usb2can::can::CanMessage original(0x789, data, 8, true, false);
|
|||
|
|
|
|||
|
|
// 使用复制构造函数
|
|||
|
|
usb2can::can::CanMessage copy(original);
|
|||
|
|
|
|||
|
|
// 验证复制
|
|||
|
|
if (!(copy == original)) {
|
|||
|
|
std::cout << " [FAIL] CAN message copy constructor not working correctly" << std::endl;
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 使用赋值操作符
|
|||
|
|
usb2can::can::CanMessage assigned;
|
|||
|
|
assigned = original;
|
|||
|
|
|
|||
|
|
// 验证赋值
|
|||
|
|
if (!(assigned == original)) {
|
|||
|
|
std::cout << " [FAIL] CAN message assignment operator not working correctly" << std::endl;
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
std::cout << " [PASS] CAN message copy working correctly" << std::endl;
|
|||
|
|
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 测试CANFD消息创建功能
|
|||
|
|
* @return 测试结果
|
|||
|
|
*/
|
|||
|
|
bool test_canfd_message_creation() {
|
|||
|
|
std::cout << " [TEST] Testing CANFD message creation..." << std::endl;
|
|||
|
|
|
|||
|
|
// 创建CANFD消息
|
|||
|
|
usb2can::can::CanFdMessage message;
|
|||
|
|
|
|||
|
|
// 设置消息属性
|
|||
|
|
message.id = 0x123;
|
|||
|
|
message.dlc = 16;
|
|||
|
|
message.extended = true;
|
|||
|
|
message.rtr = false;
|
|||
|
|
message.fd = true;
|
|||
|
|
message.brs = true;
|
|||
|
|
message.esi = false;
|
|||
|
|
|
|||
|
|
// 设置数据
|
|||
|
|
uint8_t data[16] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
|
|||
|
|
0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10};
|
|||
|
|
std::memcpy(message.data, data, sizeof(data));
|
|||
|
|
|
|||
|
|
// 验证消息属性
|
|||
|
|
if (message.id != 0x123 || message.dlc != 16 || !message.extended ||
|
|||
|
|
message.rtr || !message.fd || !message.brs || message.esi) {
|
|||
|
|
std::cout << " [FAIL] CANFD message properties not set correctly" << std::endl;
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 验证数据
|
|||
|
|
if (std::memcmp(message.data, data, sizeof(data)) != 0) {
|
|||
|
|
std::cout << " [FAIL] CANFD message data not set correctly" << std::endl;
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
std::cout << " [PASS] CANFD message created successfully" << std::endl;
|
|||
|
|
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 测试CAN控制器创建功能
|
|||
|
|
* @return 测试结果
|
|||
|
|
*/
|
|||
|
|
bool test_can_controller_creation() {
|
|||
|
|
std::cout << " [TEST] Testing CAN controller creation..." << std::endl;
|
|||
|
|
|
|||
|
|
// 创建平台实例
|
|||
|
|
usb2can::platform::Platform* platform = usb2can::platform::Platform::createPlatform();
|
|||
|
|
if (!platform) {
|
|||
|
|
std::cout << " [FAIL] Failed to create platform instance" << std::endl;
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 创建CAN控制器实例
|
|||
|
|
usb2can::can::CanController* controller = usb2can::can::CanController::createCanController(platform);
|
|||
|
|
|
|||
|
|
// 注意:这里可能返回nullptr,因为我们的实现还不完整
|
|||
|
|
if (controller) {
|
|||
|
|
std::cout << " [PASS] CAN controller created successfully" << std::endl;
|
|||
|
|
delete controller;
|
|||
|
|
} else {
|
|||
|
|
std::cout << " [WARN] CAN controller creation returned nullptr (implementation incomplete)" << std::endl;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 清理资源
|
|||
|
|
delete platform;
|
|||
|
|
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 测试CANFD控制器创建功能
|
|||
|
|
* @return 测试结果
|
|||
|
|
*/
|
|||
|
|
bool test_canfd_controller_creation() {
|
|||
|
|
std::cout << " [TEST] Testing CANFD controller creation..." << std::endl;
|
|||
|
|
|
|||
|
|
// 创建平台实例
|
|||
|
|
usb2can::platform::Platform* platform = usb2can::platform::Platform::createPlatform();
|
|||
|
|
if (!platform) {
|
|||
|
|
std::cout << " [FAIL] Failed to create platform instance" << std::endl;
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 创建CANFD控制器实例
|
|||
|
|
usb2can::can::CanFdController* controller = usb2can::can::CanFdController::createCanFdController(platform);
|
|||
|
|
|
|||
|
|
// 注意:这里可能返回nullptr,因为我们的实现还不完整
|
|||
|
|
if (controller) {
|
|||
|
|
std::cout << " [PASS] CANFD controller created successfully" << std::endl;
|
|||
|
|
delete controller;
|
|||
|
|
} else {
|
|||
|
|
std::cout << " [WARN] CANFD controller creation returned nullptr (implementation incomplete)" << std::endl;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 清理资源
|
|||
|
|
delete platform;
|
|||
|
|
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 测试CAN协议层
|
|||
|
|
* @return 测试结果
|
|||
|
|
*/
|
|||
|
|
bool test_can() {
|
|||
|
|
std::cout << "\n[TEST] Starting CAN protocol layer tests..." << std::endl;
|
|||
|
|
|
|||
|
|
bool all_passed = true;
|
|||
|
|
|
|||
|
|
// 运行测试
|
|||
|
|
all_passed &= test_can_message_creation();
|
|||
|
|
all_passed &= test_can_message_constructor();
|
|||
|
|
all_passed &= test_can_message_copy();
|
|||
|
|
all_passed &= test_canfd_message_creation();
|
|||
|
|
all_passed &= test_can_controller_creation();
|
|||
|
|
all_passed &= test_canfd_controller_creation();
|
|||
|
|
|
|||
|
|
std::cout << "[TEST] CAN protocol layer tests " << (all_passed ? "PASSED" : "FAILED") << std::endl;
|
|||
|
|
|
|||
|
|
return all_passed;
|
|||
|
|
}
|