- байтовый порядок канонических форм остался тай-брейком только внутри одной доставки: на живом корпусе он решал 98,8% спорных координат и системно хранил меньшее значение, из-за чего step_count терял род и verify:archive был красным - правило перестало быть коммутативным осознанно, поэтому порядок свёртки приведён к журнальному: проход воркера прекращается на отложенной доставке, а свёртка вне порядка журнала пишет WARN - заведены счётчики PointsHeld и PointsErased — удержание полнотой и единственное направление, в котором правило теряет содержание
65 lines
7.5 KiB
Markdown
65 lines
7.5 KiB
Markdown
# Тесты
|
|
|
|
- Тесты на разбор формата HAE держим на **реальных пакетах**, сложенных в
|
|
`testdata` (с вычищенными токенами). Документация формата ненадёжна —
|
|
источником истины служат живые данные.
|
|
- Проверяем идемпотентность: повторный разбор того же пакета не меняет
|
|
витрину.
|
|
- **Где код выбирает между двумя версиями одних данных, тест обязан прогнать
|
|
обе стороны и хотя бы одну перестановку трёх.** Пример на паре доказывает
|
|
коммутативность и молчит про ассоциативность, а сломаться правило может
|
|
именно на ней: полнота — частичный порядок, тай-брейк — тотальный, и их
|
|
попарная свёртка дала нетранзитивное отношение победы, из-за которого одна
|
|
и та же доставка меняла витрину при каждой пересборке. Ревью дизайна этого
|
|
не увидело, ревью кода увидело только перебором троек. Правилом линтера не
|
|
выражается — отсюда проза.
|
|
- **В тот же перебор обязана входить версия с содержимым, равным одной из уже
|
|
присланных, и пара «равная каноническая форма, разные байты».** Три версии с
|
|
разными хешами ветку «содержание равно» не посещают ни разу — а именно на ней
|
|
устаревал провенанс, и живая витрина расходилась с пересборкой молча. Пара с
|
|
равной формой ловит другое: неединственный минимум, при котором победителем
|
|
оказывается просто первый в срезе, то есть порядок элементов на проводе.
|
|
- **Изменение правила разбора или слияния сопровождается замером на живом
|
|
архиве, и ответ «пересворачивать нечего» произносится с числом.** Утверждение
|
|
без числа не отличается от предположения, а цена ошибки здесь — необратимое
|
|
решение о судьбе тел.
|
|
- **В проверке на живом корпусе утверждается инвариант, а число печатается.**
|
|
Корпус растёт с каждой доставкой, а прогон живого архива в гейт не входит —
|
|
значит константа, производная от его размера, протухает по расписанию
|
|
телефона и краснеет у того, кто мимо проходил. Правило шире, чем «не
|
|
сравнивай с числом»: протухает и **оценка области действия**, снятая на
|
|
прежнем корпусе. «Тай-брейк — крайний разряд после полноты» было верно на
|
|
2 897 столкновениях и неверно на 80 129, где полнота решает 1,2%; на этой
|
|
оценке стоял нормативный текст спеки. Число, попавшее в спеку или в довод
|
|
решения, обязано нести рядом **метод замера** — иначе следующий замер
|
|
посчитает другое и разойдётся молча (так и вышло: ключ без слоя дал 29-кратное
|
|
расхождение). Три случая одного класса за три дня: записи 2026-08-02,
|
|
2026-08-03 и 2026-08-04 в [review.md](../review.md).
|
|
- **Оракул сходимости называет свою посылку рядом с собой, и прогон её
|
|
печатает.** «Пересборка = приём» — не тождество, а утверждение с условиями:
|
|
живая свёртка шла в порядке журнала, в журнале нет доставок, чью свёртку живой
|
|
путь провалил, а пересборка проведёт, и за время прогона новых доставок не
|
|
приезжало. Оракул, чья посылка не названа, краснеет по причине, к правилу
|
|
отношения не имеющей, и краснота становится неотличимой от дефекта — то есть
|
|
с ней начинают жить.
|
|
- **Проверка правила, зависящего от порядка, несёт отрицательный контроль.**
|
|
Тест «два пути дали один отпечаток» зеленеет и на правиле, которое к порядку
|
|
безразлично, — то есть не проверяет ничего. Рядом обязан стоять прогон в
|
|
заведомо другом порядке с утверждением, что отпечаток **отличается**.
|
|
- **Значение, попадающее в ключ витрины или в словарь, приёмочный тест берёт из
|
|
`testdata`, а не из литерала в тесте.** Литерал, набранный руками, не
|
|
воспроизводит невидимые символы источника — Apple шлёт неразрывные пробелы
|
|
внутри своих строк (находка 24), — и совпадение теста с реализацией доказывает
|
|
только согласие автора с самим собой.
|
|
- **Утверждение о таблице-константе обходит саму таблицу, а не её видимые
|
|
следствия.** Проверка «таблица синонимов плоская», написанная через
|
|
экспортированные функции, обходит лишь записи, достижимые из словаря: с
|
|
неплоской таблицей она остаётся зелёной (воспроизведено). Такие утверждения
|
|
живут во внутреннем тесте пакета и перебирают саму структуру.
|
|
- **Тест «в логе нет значения» проверяет запись без служебных полей, а не сырой
|
|
буфер.** Метка времени содержит доли секунды, поэтому искомая подстрока
|
|
находится в ней сама: проверка на «5.1» краснела примерно раз на сотню
|
|
прогонов от хода часов, а не от утечки. Разбираем запись, выбрасываем `time`
|
|
и ищем в остатке. Правило общее — таких тестов будет больше (токены, тела
|
|
запросов, координаты объектов).
|