Enhance people management tests and fix related issues
- Updated `PeopleApiTests` to correctly handle family structures, ensuring tests account for single-parent scenarios and sorting behavior for surnames. - Added a new test to validate roster integrity after the yearly intake, confirming that the composition reflects changes post-intake. - Revised assertions to ensure accurate comparisons of student and family data, improving test reliability. - Enhanced documentation within tests to clarify the purpose and expected outcomes of new functionalities. - Addressed discrepancies between design and implementation regarding the layout of the people management interface.
This commit is contained in:
@@ -94,3 +94,84 @@
|
||||
`LessonLearningSystem.cs`, `PresenceSystem.cs`, `gameScreen.ts`), и какое-то время решение не
|
||||
компилировалось. Выводам по срезу 1 это не мешает: его файлы правка не трогает, а дописанные
|
||||
тесты прогнаны и на чистом `b135a9c`, и на дереве после починки сборки.
|
||||
|
||||
## Срез 2. Люди
|
||||
|
||||
- **Фазы:** 5–9
|
||||
- **Проверен на:** `5cd5a6d`, 2026-08-19
|
||||
- **Пути:** `src/HSchool.People`, `src/HSchool.Content/PeopleDefs.cs`,
|
||||
`src/HSchool.Simulation/RosterSpawner.cs`, `src/HSchool.Simulation/School.cs`,
|
||||
`src/HSchool.Server/Api/SchoolEndpoints.cs`, `src/HSchool.Server/Game/PersonCardReader.cs`,
|
||||
`src/HSchool.Client/src/ui/peoplePanel.ts`, `src/HSchool.Client/src/ui/personCard.ts`,
|
||||
`tests/HSchool.People.Tests`, `tests/HSchool.Content.Tests/PeopleDefTests.cs`,
|
||||
`tests/HSchool.Simulation.Tests/PeopleInSchoolTests.cs`,
|
||||
`tests/HSchool.AppHost.Tests/PeopleApiTests.cs`
|
||||
- **Итог:** исправлен один тест, который падал на чистом клоне, укреплён второй, дописан один;
|
||||
расхождение с дизайном одно и то же, что в срезе 1 (раскладка оболочки менеджера)
|
||||
|
||||
Что подтверждено:
|
||||
|
||||
- **Фаза 5.** Все шесть пунктов списка тестов на месте в `PeopleDefTests` (разбор каждого вида,
|
||||
наследование навыка, патч черты, неизвестная ссылка — ошибка каталога, склонение по модели и
|
||||
перекрытие явной таблицей), плюс `ExtraPack_AddsANameSetAndTrait` — критерий «мод со своим
|
||||
набором имён виден в каталоге». Наборы имён в `GET /api/catalog` проверены в
|
||||
`SchoolApiTests.Catalog_LabelsDefsInTheRequestedLanguage`.
|
||||
- **Фаза 6.** Все шесть тестов из списка фазы существуют и проходят. Критерий «в проекте нет
|
||||
сокетов, ECS и `DateTime.Now`» закреплён самими тестами —
|
||||
`Assembly_DoesNotReferenceArchAspNetOrSockets` и `Sources_DoNotUseWallClock`.
|
||||
- **Фаза 7.** Одиннадцать кабинетов (`VanillaMap_HasElevenHomeroomsNotTheComputerLab`), нужды
|
||||
тикают со школой, ростер публикуется снимком, `PersistPeople` зовётся только когда состав
|
||||
изменился — файл не переписывается по таймеру. Ростер, не сходящийся с картой, оставляет школу
|
||||
незапущенной (`RosterFit.Matches` → `SchoolContentUnavailableException`).
|
||||
- **Фаза 8.** Список читает опубликованный снимок (`loop.FindPeople`), карточка идёт через
|
||||
очередь команд с `TaskCompletionSource` — инвариант 3 цел. Все пять требуемых фазой тестов API
|
||||
на месте. Клиент: фильтры, сортируемые колонки, пейджер, семейные ссылки, всё через `t(...)`;
|
||||
в строке списка только лёгкие поля.
|
||||
- **Фаза 9.** Выпуск старшей имеющейся параллели, сохранение вместимости, семьи через поколения и
|
||||
уход родителей выпускников покрыты в `YearlyIntakeTests` и `PeopleInSchoolTests`.
|
||||
- **Дизайн.** `design/people.md` сверен построчно: неполные семьи ≈8% (тест требует 5–10%),
|
||||
фамилия и отчество отцовские даже у одинокой матери, идентификатор ребёнка — счётчик, места
|
||||
раздаются вперемешку. Расхождений нет.
|
||||
|
||||
Исправлено:
|
||||
|
||||
- **`PeopleApiTests.Card_IncludesFamilyAndLiveNeeds` падал на чистом клоне.** Тест брал первого
|
||||
ученика страницы и требовал у него ровно двух родителей. Состав семьи выводится из сида, а сид —
|
||||
это id школы (`SchoolWorker.InstallPeople`: `seed = school.Id`), то есть зависит от того,
|
||||
сколько школ создали тесты до него и что лежит в `saves/index.json`. Замер по сидам 1–30: у 28
|
||||
первый пятиклассник с двумя родителями, у 2 — с одним, и полный прогон на свежем checkout
|
||||
`b135a9c` в отдельном worktree ловил как раз такой сид. Одинокие родители — сознательное
|
||||
решение дизайна, поэтому неправ был тест: теперь он ищет ученика, у которого есть мать, а
|
||||
количество родителей проверяет диапазоном. Проверено тем же способом, каким ловилось: полный
|
||||
прогон на чистом `b135a9c` трижды, 60/60.
|
||||
- **`PeopleApiTests.List_SortsBySurname` мерил не тем.** Тест требовал ordinal-порядка, а сервер
|
||||
ставит Ё на место Е (`RosterBrowser.NameOrder`, тест `SurnameSort_FollowsTheAlphabetNotCodePoints`).
|
||||
Совпадали они только потому, что в `core` нет фамилий на Ё — мод с такой фамилией уронил бы
|
||||
тест, а не код. Теперь тест складывает Ё в Е так же, как сервер.
|
||||
|
||||
Дописано:
|
||||
|
||||
- `PeopleApiTests.ReloadAfterTheYearlyIntake_RestoresTheNewComposition` — критерии фаз 7 и 9
|
||||
«перезапуск поднимает тех же людей» и «перезапуск после перехода поднимает **новый** состав» не
|
||||
проверялись сквозь сервер. Просто сравнить людей до и после reload недостаточно: генерация
|
||||
детерминирована от id школы, поэтому забывший файл сервер собрал бы тот же ростер и тест бы
|
||||
ничего не поймал. Тест поэтому ждёт 1 сентября (школа создаётся за 15 игровых минут до
|
||||
полуночи, это около трёх секунд реального времени), а после reload требует состав **после**
|
||||
набора и явно отличный от исходного.
|
||||
|
||||
Открыто:
|
||||
|
||||
- **Раскладка оболочки менеджера разошлась с дизайном** — то же расхождение, что записано в срезе
|
||||
1. Фаза 8 обещает панель «Люди» нижним рядом во всю ширину, `design/people.md` фиксирует
|
||||
«панель в оболочке менеджера, нижний ряд; не отдельный экран», а на экране она вкладкой рядом с
|
||||
картой. Тот же коммит `d8f8db6`, что убрал панель событий. Решается одним решением на оба
|
||||
пункта: либо вернуть нижний ряд, либо переписать обе строки дизайна.
|
||||
|
||||
Замечено рядом (за границами среза):
|
||||
|
||||
- `design/people.md` и задача фазы 5 говорят «скорость убывания нужд в `core` — ноль», а в
|
||||
`defs/needs` теперь `decayPerHour` от 0.05 до 0.15. Это сознательная работа фазы 20, не
|
||||
регрессия; строка дизайна просто устарела и относится к срезу 5.
|
||||
- Срез 1 успел сдвинуться: коммит `5cd5a6d` тронул `gameScreen.ts` и `strings.ts` (подпись
|
||||
идущего человека). По правилу журнала он больше не «проверен на `b135a9c`» — правка маленькая и
|
||||
относится к срезу 5, но следующий проход это увидит.
|
||||
|
||||
Reference in New Issue
Block a user