Files
templates/c/led-indicator/tests/test_led_indicator.c

85 lines
3.3 KiB
C

#include "led_indicator.h"
#include <stdio.h>
typedef struct {
uint32_t now;
uint8_t outputs[3];
uint32_t writes[3];
} FakePort;
static void fake_write(void *context, uint8_t channel, uint8_t on)
{
FakePort *fake = (FakePort *)context;
fake->outputs[channel] = on;
fake->writes[channel]++;
}
static uint32_t fake_now(void *context)
{
return ((FakePort *)context)->now;
}
#define CHECK(condition) \
do { \
if (!(condition)) { \
fprintf(stderr, "check failed at line %d: %s\n", __LINE__, \
#condition); \
return 1; \
} \
} while (0)
int main(void)
{
LedIndicator indicator;
LedIndicator_Channel channels[3];
LedIndicator_Config config;
LedIndicator_Pattern patterns[LED_INDICATOR_MODE_COUNT];
FakePort fake = {0};
LedIndicator_Port port = {fake_write, fake_now, &fake};
LedIndicator_ConfigDefault(&config);
CHECK(LedIndicator_ValidateConfig(&config) != 0U);
CHECK(LedIndicator_CopyDefaultPatterns(patterns, LED_INDICATOR_MODE_COUNT) ==
LED_INDICATOR_MODE_COUNT);
patterns[LED_INDICATOR_MODE_WORK].duration_ms[0] = 25U;
CHECK(patterns[LED_INDICATOR_MODE_WORK].duration_ms[0] == 25U);
CHECK(LedIndicator_Init(&indicator, channels, 3U, &port, &config) != 0U);
CHECK(fake.writes[0] == 1U && fake.writes[1] == 1U && fake.writes[2] == 1U);
CHECK(LedIndicator_SetMode(&indicator, 0U, LED_INDICATOR_MODE_WORK) != 0U);
CHECK(fake.outputs[0] == 1U);
fake.now = 99U;
CHECK(LedIndicator_SetMode(&indicator, 0U, LED_INDICATOR_MODE_WORK) != 0U);
LedIndicator_Process(&indicator);
CHECK(fake.outputs[0] == 1U);
fake.now = 100U;
LedIndicator_Process(&indicator);
CHECK(fake.outputs[0] == 0U);
fake.now = 1000U;
LedIndicator_Process(&indicator);
CHECK(fake.outputs[0] == 1U);
fake.now = 1050U;
CHECK(LedIndicator_RestartMode(&indicator, 0U, LED_INDICATOR_MODE_WORK) != 0U);
fake.now = 1150U;
LedIndicator_Process(&indicator);
CHECK(fake.outputs[0] == 0U);
CHECK(LedIndicator_SetModeAt(&indicator, 1U, LED_INDICATOR_MODE_ERROR,
0xFFFFFFF0UL) != 0U);
LedIndicator_ProcessAt(&indicator, 0x00000054UL);
CHECK(fake.outputs[1] == 0U); /* 100 ms после старта, переход во второй шаг. */
LedIndicator_ProcessAt(&indicator, 0x000000B8UL);
CHECK(fake.outputs[1] == 1U); /* 200 ms после старта, второй импульс. */
CHECK(LedIndicator_SetModeAt(&indicator, 2U, LED_INDICATOR_MODE_STARTUP, 10U) != 0U);
LedIndicator_ProcessAt(&indicator, 610U);
CHECK(fake.outputs[2] == 1U); /* Однократный startup завершён постоянным ON. */
CHECK(LedIndicator_SetMode(&indicator, 3U, LED_INDICATOR_MODE_ON) == 0U);
CHECK(LedIndicator_GetMode(&indicator, 0U) == LED_INDICATOR_MODE_WORK);
puts("led indicator tests passed");
return 0;
}