10 KiB
type, work_item_id, title, version, status, created_at, updated_at, authors
| type | work_item_id | title | version | status | created_at | updated_at | authors | |
|---|---|---|---|---|---|---|---|---|
| acceptance-criteria | ET-013 | Acceptance Criteria: Перепады высот на z9-z11 | 1 | draft | 2026-06-04 | 2026-06-04 |
|
Acceptance Criteria — ET-013
Критерии в Gherkin-стиле. Все обязательные. Задача считается принятой, когда каждый критерий прошёл проверку (автоматическую в CI или ручную в test-среде).
AC-01 — UI-минзум hillshade понижен до 9
Given ветка feature/ET-013-z9-z11-z8 после реализации
When проверяется код
Then:
- В
src/web/app.jsфункцияupdateHillshadeAvailabilityсодержитif (zoom < 9)(а не< 10). - В
src/web/index.htmlэлемент#terrain-hillshade-hintсодержит текст «Зум 9+» (а не «Зум 10+»).
AC-02 — Vector-source terrain-hillshade-source имеет minzoom=9
Given test-среда после деплоя ET-013, включены оба чекбокса слоёв рельефа When в DevTools выполнить
window._map.getSource('terrain-hillshade-source').minzoom
Then результат — 9.
AC-03 — При z=9 hillshade доступен и виден
Given пользователь на test-среде, центр карты над холмистым
районом (например, юг Москвы / Ока: [37.6, 54.5])
When установить window._map.setZoom(9), открыть #terrain-popup,
включить «Тени рельефа»
Then:
#terrain-hillshade-cbимеетdisabled === false.#terrain-hillshade-hintимеетdisplay: 'none'.window._map.getLayoutProperty('terrain-hillshade', 'visibility') === 'visible'.- На карте видны тени рельефа.
AC-04 — Hillshade paint zoom-aware
Given включён hillshade на test-среде When в DevTools выполнить
const op = window._map.getPaintProperty('terrain-hillshade', 'raster-opacity');
const ct = window._map.getPaintProperty('terrain-hillshade', 'raster-contrast');
const rs = window._map.getPaintProperty('terrain-hillshade', 'raster-resampling');
Then:
Array.isArray(op) && op[0] === 'interpolate'(zoom-aware opacity).Array.isArray(ct) && ct[0] === 'interpolate'(zoom-aware contrast).rs === 'nearest'.
AC-05 — TRI paint zoom-aware
Given включён TRI на test-среде When в DevTools
const op = window._map.getPaintProperty('terrain-tri', 'raster-opacity');
const rs = window._map.getPaintProperty('terrain-tri', 'raster-resampling');
Then:
Array.isArray(op) && op[0] === 'interpolate'.- На z=8 эффективное значение
≈ 0.70(регрессия). - На z=10 эффективное значение
≥ 0.80. rs === 'nearest'.
AC-06 — Регрессия z8: TRI визуально как было
Given test-среда после деплоя
When установить zoom = 8, включить ТОЛЬКО «Перепады» (без hillshade)
Then:
- Скриншот
et013-z8-tri-regress.pngне отличается визуально заметно от состояния до ET-013 (сравнение оператором). - Hillshade-слой не присутствует в стиле (
!map.getLayer('terrain-hillshade')).
AC-07 — Качественная читаемость z9 (целевой критерий)
Given test-среда, центр над Окой / Кашира / Воробьёвы Горы
When zoom = 9, включены оба слоя «Тени рельефа» и «Перепады»
Then:
- На скриншоте
et013-z9-readable.pngявно видны перепады высот: тени по склонам, цветные пятна TRI выделяют шероховатые зоны. - Оператор подтверждает: «перепады сопоставимы с z8 или лучше».
- При отказе — корректировка stops в HILLSHADE_PAINT / TRI_PAINT.
AC-08 — Качественная читаемость z10
Given test-среда, аналогично AC-07
When zoom = 10
Then: то же, что AC-07.
AC-09 — Качественная читаемость z11
Given test-среда, аналогично AC-07
When zoom = 11
Then: то же, что AC-07.
AC-10 — Регрессия z14: hillshade не перегрет
Given test-среда
When zoom = 14, включён hillshade
Then:
- Эффективные значения
raster-opacity ≈ 0.40,raster-contrast ≈ 0. - Скриншот
et013-z14-regress.pngне темнее и не контрастнее, чем до ET-013.
AC-11 — Hillshade на тёмной теме читается
Given test-среда, theme-dark активна
When zoom = 10, включён hillshade
Then:
- Тени видны, не сливаются с тёмной подложкой.
- При отказе (тени «съедают» карту) — открыть ADR
«theme-specific hillshade paint» и добавить отдельные stops
для dark-theme (см. BRD R-2). В рамках MVP ET-013 это
не обязательно, но фиксируется в
13-test-report.md.
AC-12 — Hillshade на спутниковой подложке не глушит снимок
Given test-среда, переключена подложка #base-btn-satellite
When zoom = 10, включён hillshade
Then:
- На спутниковом снимке видны и детали поверхности (рельеф улавливается уже через тени снимка), и hillshade-оверлей.
- Оверлей не превращает снимок в «серую плёнку».
- Подтверждается оператором по TC-UI-08-Z10-SAT-Q.
AC-13 — Hillshade на мобильном (375×667)
Given Playwright mobile viewport, включён hillshade
When zoom = 9
Then:
- Тени видны, читаемы.
- Чекбоксы и hint работают корректно.
AC-14 — Persistence не сломан
Given включены оба чекбокса
When перезагрузить страницу (location.reload())
Then:
localStorage.getItem('terrain-hillshade') === '1'.localStorage.getItem('terrain-tri') === '1'.- После загрузки слои восстановлены, на z=9 hillshade автоматически активен.
AC-15 — Unit-тесты paint-выражений зелёные
Given ветка
When pytest tests/unit/test_terrain_paint.py -v
Then все тесты проходят (UT-PAINT-, UT-REG-).
AC-16 — Integration smoke z9 тайлов
Given ветка, наличие данных в test-среде или CI fixture
When pytest tests/integration/test_terrain_z9_tiles.py -v
Then:
- При наличии тайлов
data/terrain/hillshade/9/*— тесты проходят: 200 на существующий тайл, 404 на невалидный zoom. - При отсутствии тайлов в CI — тесты
skippedс reason.
AC-17 — Регрессионные тесты ET-007 / PH-6
Given ветка
When pytest tests/unit/ tests/integration/ -v
Then:
- Все существующие тесты ET-007 (переключатель Схема/Спутник) и PH-6 проходят без регрессий.
- Никакие тесты grandfather'ов не отвалились.
AC-18 — make lint и make test зелёные
Given ветка
When make lint && make test
Then exit-code 0 на обе команды.
AC-19 — Pre-deploy проверка наличия тайлов z9-z11
Given ветка готова к merge When на test-среде
curl -sI https://openclaw.mva154.duckdns.org/enduro/terrain/hillshade/9/308/158.png
curl -sI https://openclaw.mva154.duckdns.org/enduro/terrain/hillshade/10/617/317.png
curl -sI https://openclaw.mva154.duckdns.org/enduro/terrain/hillshade/11/1234/635.png
Then все три запроса возвращают HTTP 200. Если 404 на любой — merge приостанавливается, открывается PH-6 follow-up (догенерить тайлы).
AC-20 — Документация полная
Given репо после слияния ET-013
When проверка docs/work-items/ET-013/
Then существуют:
00-business-request.md01-brd.md02-trz.md03-acceptance-criteria.md04-test-plan.yaml04b-ui-test-cases.md12-review.md(после Review)13-test-report.md(после Тестирования)14-deploy-log.md(после Деплоя)
AC-21 — Сетевая регрессия (M-10)
Given test-среда When сценарий: открыть карту, центр над Окой, выполнить zoom-последовательность z=8 → z=9 → z=10 → z=11 → z=10 → z=9 → z=8 с включёнными обоими слоями Then:
- Суммарный network-traffic PNG-тайлов рельефа ≤ 135% от того же
сценария до ET-013 (зафиксированного как baseline в
13-test-report.md). - Никаких сторонних запросов (например, 4xx или 5xx) не возникает.
AC-22 — Контракт applyTerrainLayer обратно-совместим
Given ветка When unit-тест UT-PAINT-COMPAT-01 Then:
- Вызов
applyTerrainLayer(id, url, true, 0.5, 8, 14)(старый контракт — число) собирает paint:{ 'raster-opacity': 0.5, 'raster-resampling': 'linear' }. - Вызов с object'ом передаёт paint как есть.