8.6 KiB
8.6 KiB
TEST_PLAN — матрица тестов PEAK HOUR
Числовые данные — только
data/balance.jsonиdocs/DECISIONS.md. Юнит-Runner — headless-прогонtests/run_tests.gd(godot --headless --path . --script tests/run_tests.gd). Числа, не заданные в промпте, в данных помечены — тесты для них берут значения из JSON, а не хардкодят их.
1. Юнит-тесты
| № | Что проверяем | Как | Ожидаемо | Команда |
|---|---|---|---|---|
| U01 | Реестр: спавн файла по типу, уникальные id | создать 3 типа → посчитать FileRegistry |
3 разных id, тип и ext корректны | unit/file_registry |
| U02 | Лимит папки/буфера: capacity папки и буфера | положить в буфер 4+2×lvl, без апгрейда; на 5-й спавн | спавн отклонён, сигнал buffer_full (D05: base 4) |
unit/file_registry |
| U03 | Attach: 1 файл только 1 раз | один файл в required двух запросов → attach к обоим |
второй запрос видит файл серым, attach возвращает false (D06) | unit/file_registry |
| U04 | Отмена запроса по таймеру | запустить таймер запроса > | slot_reserved=true → по таймеруNECTION, слот свободен, штраф по D12 |
unit/hour_director |
| U05 | Оплата: money приёма/отправки | приём recv_fee, отправка — money, +1 SLA (D12) |
баланс money меняется ровно на recv_fee при переприёме; на успешную отправку — прирост |
unit/payout |
| U06 | Канал: формула load/factor |
час h, used_slots, Σ weight поданы в load и factor |
factor совпадает с ручным расчётом (CHANNEL_BG_BASE 10, CHANNEL_BG_PER_HOUR 4×(h−1), SLOT_LOAD 8×slots) | unit/channel |
| U07 | Слоты: резерв/освобождение | 2 стартовых слота, резерв → отказ на 3-й, buy → слоты 3 (D13) | SlotManager.try_reserve возвращает false; после «3-й слот» — true |
unit/slots |
| U08 | Магазин: 9 позиций, цены, max_level | проверка на каждый id | цена и уровень совпадают с D13 (250/450/200×2/350×3/300×3/250×4/300×5/250/400), сканер/автосортировка отсутствуют | unit/shop |
| U09 | Save/Load | сейв → изменить money → load | money, sla, folders, апгрейды восстановлены, типы/поля — по схеме |
unit/save |
2. Инварианты и фаззинг (системы)
| № | Что проверяем | Как | Ожидаемо | Команда |
|---|---|---|---|---|
| F01 | Прикрепление уникально | фаззинг: 200 попыток attach | <=1 attached у файла (D06), никакое «двойное» состояние не достигнуто |
fuzz/attach_once |
| F02 | Коoldown после отправки | успешный send → сразу повторная attach | false; после 20 с — true (D02) | fuzz/cooldown |
| F03 | Обычные файлы удаляются только в Prep | уничтожить в hour-фазе | refuse; malicious — ok в обеих фазах (D02) | fuzz/delete_phase |
| F04 | Гарантия уникальности required |
1000 сгенерированных запросов | required — не только id, поля корректны; картинок с failed не встречается |
fuzz/requests |
| F05 | W-формула | hour/successes/zone_level = {(1..9), (0..n), (0..3)} | все значения от 0.18 до 0.36, соответствуют clamp (D04) (cap 0.36) | fuzz/zone |
| F06 | Мини-игры по средней коэф. | все n варианты required-наборов |
тип мини-игры соответствует порогам D17 (text 1.0, sound 2.0, photo 3.0, video 4.0; <1.5/<2.5/<3.5) | fuzz/minigame_select |
| F07 | Состояния-флаги (D09) | быстрые случайные действия | нет самопротиворечий: attached ↔ other, locked+cooldown | fuzz/states |
3. Интеграция: час пика
| № | Что проверяем | Как | Ожидаемо | Команда |
|---|---|---|---|---|
| I01 | Ускоренный час (PEAKHOUR_TIMESCALE) | 120 с час → прогон | только числа/счёт с опережением, нет крашей | integration/hour_fast |
| I02 | Паузы по модалкам (D03) | открытая панель соединения / мини-игры | спавн приёма и таймеры пакетов стоят, таймер запроса идёт | integration/modals |
| I03 | Стресс-спавн (полный буфер, D03) | добивание буфера | новые пакеты не спавнятся: сигнал spawn_frozen("buffer_full"), переприём варьируется |
integration/overflow |
| I04 | Esc-фазы (D10) | Esc в часе / мини-игре / панели соединения | 3 разных поведения: пауза, no-op, отмена слота | integration/esc |
4. Прогон баланса (9-часовая симуляция)
| № | Что проверяем | Как | Ожидаемо | Команда |
|---|---|---|---|---|
| B01 | Доход по часам | симуляция 9 часов ( TestCase_фаззинг 1000 сидов, усреднить) | ср. доход по часам 1/2/3/5/9 ≈ D12 (500/800/1200/1800/2200) в пределах ±10 % | sim/income |
| B02 | SLA-прирост/штрафы | сбор суммарной SLA-карты | сумма приростов/штрафов соответствует D12; шифровальщик −10, DDoS −15, фишинг −10, мусор −5 (D07) | sim/sla |
| B03 | Стоимость выкупа | покупка всех 9 позиций по часам | полный выкуп к часу 8–9 (D12), цены из shop D13 |
sim/shop |
| B04 | Шкала сложности | hour 1..9 | difficulty на часе 9 = значения часа 8 (спawns +5 %/2ч), ничего «неOutOfBounds» (D12) |
sim/difficulty |
| B05 | Потери | замер штрафов по типам атак/таймаутов | соответствует sla таблице (D07/D12) |
sim/losses |
5. Браузер-смоук (Web)
| № | Что проверяем | Как | Ожидаемо | Команда |
|---|---|---|---|---|
| W01 | Сборка | --headless --export-release "Web" build/web/index.html |
index.html + .wasm + .pck собраны без ошибок | сборка Web |
| W02 | Chrome-load | открыть через python3 -m http.server 8000 --directory build/web |
загрузка, шрифт và текст рендерится, драг работает | W smоук |
| W03 | Сцены и переходы | меню → подготовка → час → итоги | все переходы работают, никакого глий в html | W смок |
6. Регламентный аудит (джем FEIS)
| № | Что проверяем | Как | Ожидаемо | Команда |
|---|---|---|---|---|
| A01 | Дивиденд и репозиторий | git-история + отчёт об ИИ заполнены | все протоколы/джем критерии проходятся, git push не сделать | ревизор feis-regulator |
| A02 | RU-only | grep по RU в strings_ru.json и интерфейсе |
пользовательские шапки — на русском, никаких тайных строк | аудит |
| A03 | Шрифты и лицензии | ASSETS.md: Handjet OFL.txt, Press Start 2P OFL |
только OFL/MIT-лицензии, OFL-файлы в репо, Pixelify Sans из темы удалён | аудит |
| A04 | Без секретов | grep по `password | token | key |
| A05 | itch.io | загрузка build/web/index.html |
игра стартует в 1280×720, RU, никакого зависания | гей-смоук |