/* * Проверки balsam_can: фиксируют ожидаемое поведение на воспроизводимых входных данных. * Тестовые значения и подмены окружения относятся к проверке контракта; они не являются * настройками рабочего устройства. */ #include #include #include "balsam_can.h" #define CHECK(x) do { if (!(x)) { \ fprintf(stderr, "FAIL %s:%d: %s\n", __FILE__, __LINE__, #x); return 1; \ } } while (0) int main(void) { const uint8_t packet[8] = { 0xFF, 0xFE, 0x12, 0x34, 0xE0, 0x18, 0x00, 0x29 }; const uint8_t command[8] = { 0, 0, 0, 0, 0x80, 0x7F, 0, 0x80 }; balsam_can_frame_t frame; char name[64]; CHECK(balsam_can_is_id(0x00BA0010UL)); CHECK(balsam_can_is_id(0x00BA001CUL)); CHECK(!balsam_can_is_id(0x00BA001DUL)); CHECK(balsam_can_decode(0x00BA0010UL, packet, sizeof packet, &frame) == 1); CHECK(frame.device == 1U); CHECK(frame.direction == BALSAM_CAN_FROM_NODE); CHECK(frame.present_mask == 7U); CHECK(frame.start_address == 0x18U); CHECK(frame.values[0] == 41U && frame.values[1] == 0xFFFEU && frame.values[2] == 0x1234U); CHECK(balsam_can_register_name(1U, 0x18U, name, sizeof name) > 0U); CHECK(strstr(name, "T° 1") != NULL); CHECK(balsam_can_decode(0x00BA0010UL, packet, 7U, &frame) == -2); CHECK(balsam_can_decode(0x00BA0004UL, command, 8U, &frame) == 1); CHECK(frame.device == 5U && frame.direction == BALSAM_CAN_TO_NODE); CHECK(frame.start_address == 127U && frame.present_mask == 4U); CHECK(frame.values[0] == 0x80U); CHECK(balsam_can_decode(0x00745009UL, command, 8U, &frame) == 1); CHECK(frame.device == 10U && frame.direction == BALSAM_CAN_TO_NODE); CHECK(balsam_can_decode(0x00745019UL, packet, 8U, &frame) == 1); CHECK(frame.device == 10U && frame.direction == BALSAM_CAN_FROM_NODE); return 0; }