# test_timeout_pattern ## Модуль под тестом Не отдельный файл, а паттерн таймаута `(uint32_t)(now - start) >= (uint32_t)timeout`, используемый в `bsp_uart_read()`, `bsp_delay()` и других BSP-модулях (счётчик — `bsp_tick_get_ms()`). Тестируется сама математика, изолированно от железа. ## Категория A — чистая математика, без внешних зависимостей. Только Unity. ## Моки Нет. ## Что проверяется - **Нормальные случаи** — истёкший/неистёкший таймаут при `elapsed < timeout`, `elapsed == timeout`, `elapsed > timeout`; нулевой `elapsed`; `timeout == 0` (истекает немедленно). - **Wraparound** — счётчик `now`/`start` переполняется через `UINT32_MAX`; беззнаковая арифметика корректно вычисляет `elapsed` в этих случаях (проверено на нескольких комбинациях старта у границы `UINT32_MAX`). - **Антипаттерн** — отдельный тест демонстрирует, что альтернативная формула `now >= start + timeout` ломается при переполнении `start + timeout`, в отличие от используемого паттерна. ## Гарантии - Формула `(uint32_t)(now - start) >= timeout` корректна при любом взаимном положении `now` и `start`, включая переполнение 32-битного счётчика. - `elapsed == timeout` считается истёкшим таймаутом (граница включительно). - `timeout == 0` всегда трактуется как немедленно истёкший. - Задокументировано и подтверждено тестом, почему альтернативная формула `now >= start + timeout` небезопасна и не должна использоваться. ## Запуск ```bash ctest --preset host-debug-test -R test_timeout_pattern -V ```