Record slice 2 recheck after notices and portraits.

This commit is contained in:
Leonid Pershin
2026-08-21 03:08:40 +03:00
parent c3d17cafc6
commit 2a199fda8f
4 changed files with 100 additions and 1 deletions
+57
View File
@@ -94,3 +94,60 @@
- Хостовые `PeopleApiTests` / `SchoolSeedTests` в этом проходе не гонялись (Testing policy:
HTTP не менялся). Симуляционный переход 1 сентября и библиотечный набор зелёные.
- `people.json` теперь ещё пишется после разговора и ссоры — это срез 9, не состав среза 2.
## Срез 2. Люди — перепроверка после notices и портретов
- **Фазы:** 59
- **Проверен на:** `c3d17ca`, 2026-08-21
- **Пути:** `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.Server/Game/SchoolWorker.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`,
`tests/HSchool.AppHost.Tests/SchoolSeedTests.cs`
- **Итог:** перепроверка после дрейфа с `8108508` (notices, scene prompt, портреты, одежда,
мнения). Обещания фаз 5–9 целы; код среза не чинился; дописаны тесты обзора карточки
и номеров кабинетов
Что подтверждено:
- Дефы, наследование, патч, неизвестная ссылка, взаимная несовместимость, склонение
правилом и таблицей, мод со своей страной и чертами. `GET /api/catalog` отдаёт страны,
не наборы имён — фаза 29, не регрессия среза 2.
- Генератор: тот же сид → тот же ростер; 13-я семья не двигает первые двенадцать;
отчества отцовские; полное телосложение зажимает ловкость; 1 и 11 кабинетов собираются;
неполные семьи 5–10% и не все материнские. Arch / ASP.NET / `DateTime.Now` в
`HSchool.People` нет.
- Одиннадцать кабинетов-номеров (`101``204`…), `Homeroom` не компьютерный класс,
сущности в `World`, `PersistPeople` с `peopleChanged` (набор / штат / разговор), не
с таймера часов. `RecordWorldEvents` в `Tick` не поднимает этот флаг. Штат при создании
пуст — фаза 11. Нужды в `core` с ненулевым `decayPerHour` — срез 5.
- Список читает опубликованный снимок (`FindPeople`), карточка — мейлбокс с
`TaskCompletionSource`. Фильтры роли/параллели/литеры/должности/пола/возраста в
`RosterBrowser`; панель — вкладка рядом с картой, строки через `t(...)`. Обзор карточки
по-прежнему тело, навыки, черты, нужды и семья-ссылка; кнопка notice среза 11 на карточку
не сажалась.
- Выпуск старшей имеющейся, вместимость, младший брат в том же роде, родитель-работник
выпускников остаётся, reload после набора (тесты прошлых проходов на месте).
Дописано:
- `renderPersonCard` / `opens a relative from the overview family links` — фаза 8 обещает
переход к родственнику; после вкладок одежды и портрета обзор с пустой `family` больше
не кликали.
- `RosterGeneratorTests.VanillaMap_HasElevenHomeroomsNotTheComputerLab` — подписи
кабинетов это трёхзначные номера, не имена классов.
Исправлено: ничего в коде среза.
Открытое:
- Хостовые `PeopleApiTests` / `SchoolSeedTests` в этом проходе не гонялись (Testing policy:
HTTP списка и карточки не менялся). `RosterGeneratorTests` и клиентский `personCard.test.ts`
зелёные.
- `people.json` после разговора и ссоры — срез 9, не состав среза 2.
- Рядом: `PersonCardReaderShapeTests` всё ещё ждёт один публичный `Read`, а срез 11
добавил `NodeId` для портрета. Это форма среза 10, не фазы 5–9; здесь не трогалось.
+1 -1
View File
@@ -21,7 +21,7 @@
| Срез | Проверен на | Журнал |
| --- | --- | --- |
| Срез 1. Оболочка и карта | `d087486` | [01-shell](01-shell/reviewed.md) |
| Срез 2. Люди | `8108508` | [02-people](02-people/reviewed.md) |
| Срез 2. Люди | `c3d17ca` | [02-people](02-people/reviewed.md) |
| Срез 3. Штат | `cf1403e` | [03-staffing](03-staffing/reviewed.md) |
| Срез 4. Расписание | `01ef277` | [04-schedule](04-schedule/reviewed.md) |
| Срез 5. Жизнь школы | `1118c59` | [05-ai](05-ai/reviewed.md) |
@@ -151,6 +151,41 @@ describe('renderPersonCard', () => {
expect(root.querySelector('[data-card-tab="now"]')?.hasAttribute('hidden')).toBe(false);
});
it('opens a relative from the overview family links', () => {
setLocale('ru');
const onRelative = vi.fn();
const root = document.createElement('div');
renderPersonCard(
root,
card({
skills: [{ id: 'Mathematics', label: 'Математика', value: '62' }],
traits: [{ defName: 'Diligent', label: 'Усидчивый' }],
needs: [{ id: 'Sleep', label: 'Сон', value: 1 }],
family: {
parents: [{ id: 'f0.p0', fullName: 'Иванова Ольга', female: true }],
children: [],
siblings: [],
partners: [],
},
}),
onRelative,
options(),
);
const overview = root.querySelector('[data-card-tab="overview"]');
expect(overview?.textContent).toContain('Рост');
expect(overview?.textContent).toContain('Математика');
expect(overview?.textContent).toContain('Усидчивый');
expect(overview?.textContent).toContain('Сон');
expect(overview?.textContent).toContain(t('peopleParents'));
const mother = overview?.querySelector('.people__link');
expect(mother).toBeInstanceOf(HTMLButtonElement);
expect(mother?.textContent).toBe('Иванова Ольга');
(mother as HTMLButtonElement).click();
expect(onRelative).toHaveBeenCalledWith('f0.p0');
});
it('shows the server condition caption, not a band inferred from the number', () => {
setLocale('ru');
const root = document.createElement('div');
@@ -127,6 +127,13 @@ public class RosterGeneratorTests
Assert.DoesNotContain(demand.Staff, opening => opening.Position == "Teacher");
Assert.DoesNotContain(demand.Staff, opening => opening.RoomId == "computer-lab");
Assert.Contains(demand.Staff, opening => opening.RoomId == "library" && opening.Position == "Librarian");
// Phase 7: homeroom captions are room numbers, not class names the generator would
// otherwise try to parse. The map file itself is not this test's to rewrite.
var homerooms = map.Rooms.Where(room => room.Def == "Classroom").ToArray();
Assert.Equal(11, homerooms.Length);
Assert.All(homerooms, room => Assert.Matches(@"^\d{3}$", room.Label));
Assert.Contains(homerooms, room => room.Label == "204");
}
[Fact]