Merge branch 'review/slice-10-bc-recheck'
This commit is contained in:
@@ -37,10 +37,10 @@
|
|||||||
- Дубликат ключа проверяется изолированным `tsc -p`, не `tsc -b` живого клиента; проводка `run-test.mjs` покрыта отдельно.
|
- Дубликат ключа проверяется изолированным `tsc -p`, не `tsc -b` живого клиента; проводка `run-test.mjs` покрыта отдельно.
|
||||||
- Этап B–C (58–59) — соседний проход, здесь не перепроверялся.
|
- Этап B–C (58–59) — соседний проход, здесь не перепроверялся.
|
||||||
|
|
||||||
## Срез 10. Этапы B–C — работник, карточка и дамп
|
## Срез 10. Этапы B–C — работник, карточка и дамп (перепроверка)
|
||||||
|
|
||||||
- **Фазы:** 58–59
|
- **Фазы:** 58–59
|
||||||
- **Проверен на:** `f4f726a`, 2026-08-20
|
- **Проверен на:** `34f28f9`, 2026-08-20
|
||||||
- **Пути:** `src/HSchool.Server/Game/SchoolWorker.cs`,
|
- **Пути:** `src/HSchool.Server/Game/SchoolWorker.cs`,
|
||||||
`src/HSchool.Server/Game/SchoolWorker.Mailbox.cs`,
|
`src/HSchool.Server/Game/SchoolWorker.Mailbox.cs`,
|
||||||
`src/HSchool.Server/Game/SchoolWorker.Tick.cs`,
|
`src/HSchool.Server/Game/SchoolWorker.Tick.cs`,
|
||||||
@@ -61,18 +61,20 @@
|
|||||||
`src/HSchool.Client/src/ui/personCardPortrait.ts`,
|
`src/HSchool.Client/src/ui/personCardPortrait.ts`,
|
||||||
`src/HSchool.Client/src/ui/personCardDom.ts`,
|
`src/HSchool.Client/src/ui/personCardDom.ts`,
|
||||||
`tests/HSchool.Server.Tests/SchoolWorkerShapeTests.cs`,
|
`tests/HSchool.Server.Tests/SchoolWorkerShapeTests.cs`,
|
||||||
|
`tests/HSchool.Server.Tests/PersonCardReaderShapeTests.cs`,
|
||||||
`tests/HSchool.AppHost.Tests/ServiceabilityTests.cs`
|
`tests/HSchool.AppHost.Tests/ServiceabilityTests.cs`
|
||||||
- **Итог:** обещания 58–59 на месте; тесты из списков фаз есть; код не чинился. Этап A (56–57) в этот проход не входил. 46 и 60 — **в работе на момент проверки**, как готовые не закрывались.
|
- **Итог:** перепроверка после `f4f726a`. По путям этапа дрейфовали воркер и `ServiceabilityTests`: в mailbox/persist пришла речь (фаза 46), `DressGenerator.NeedsDressing` взял каталог. Обещания 58–59 держатся; `lock` вокруг `School`/`World` нет; дамп по-прежнему ждёт `NodeId` на идущих часах. Дописан `PersonCardReaderShapeTests` — единственный публичный `Read`. Код фаз не чинился. Этап A (56–57) в этот проход не входил.
|
||||||
|
- **Первая проверка:** `f4f726a`, 2026-08-20.
|
||||||
|
|
||||||
### Что проверено
|
### Что проверено
|
||||||
|
|
||||||
**58.** `SchoolWorker` — один `internal sealed partial` (почта / тик / запись), тот же `LongRunning`-поток и тот же mailbox; `lock` вокруг `School`/`World` нет. `PersonCardReader.Read(School, personId, locale)` — единственный публичный вход; вкладки в `partial`. Клиент: вкладки в модулях, `personCardHost.ts` по-прежнему `fetchPerson` / `fetchPersonLog`. `GameLoopService` не резался. Протокол и сейв не тронуты. Карточка: `PeopleApiTests.Card_IncludesFamilyAndLiveNeeds`, `InventoryApiTests.Card_IncludesWornAndCarried_ListDoesNot`, `Card_ConnectionsCarryOnlyThisPersonsOpinions`. UI: `personCard.test.ts` (вкладки, портрет, связи). Пауза: `PausingOneSchool_DoesNotStopAnother`. Форма воркера: `SchoolWorkerShapeTests` (прогнан, 1/1).
|
**58.** `SchoolWorker` — один `internal sealed partial` (почта / тик / запись), тот же `LongRunning`-поток и тот же mailbox; `lock` нет. `PersonCardReader.Read(School, personId, locale)` — единственный публичный вход; вкладки в `partial`. Клиент: вкладки в модулях, `personCardHost.ts` по-прежнему `fetchPerson` / `fetchPersonLog`. `GameLoopService` не резался. Карточка: `PeopleApiTests.Card_IncludesFamilyAndLiveNeeds`, `InventoryApiTests.Card_IncludesWornAndCarried_ListDoesNot`, `Card_ConnectionsCarryOnlyThisPersonsOpinions`. UI: `personCard.test.ts` (вкладки, портрет, связи). Пауза: `PausingOneSchool_DoesNotStopAnother`. Форма: `SchoolWorkerShapeTests` и `PersonCardReaderShapeTests` (прогнаны, 1/1 каждый). Клиент и Architecture.Tests — этап A, не гонялись.
|
||||||
|
|
||||||
**59.** `Dump_ReturnsPeopleNodesAndTimetable` нанимает математику, требует идущие часы, ждёт непустой `NodeId`, отдельно нужды и `Lessons` Mathematics. На паузе wait сразу красный, не висит. Неизвестный id — 404 `unknown-school`. JSON дампа и `SchoolDumpReader` не расширялись; ручка по-прежнему за `HSchool:AllowSaveReload`; HTTP кладёт `DumpSchool` в mailbox, `World` читает только работник.
|
**59.** `Dump_ReturnsPeopleNodesAndTimetable` нанимает математику, требует идущие часы, ждёт непустой `NodeId`, отдельно нужды и `Lessons` Mathematics. На паузе wait сразу красный, не висит. Неизвестный id — 404 `unknown-school`. JSON дампа и `SchoolDumpReader` не расширялись; ручка по-прежнему за `HSchool:AllowSaveReload`; HTTP кладёт `DumpSchool` в mailbox, `World` читает только работник.
|
||||||
|
|
||||||
### Что дописано
|
### Что дописано
|
||||||
|
|
||||||
- (нет — списки фаз закрыты существующими тестами)
|
- `PersonCardReader_HasOnePublicRead` — рефлексия: один публичный `Read(School, personId, locale)`
|
||||||
|
|
||||||
### Что исправлено
|
### Что исправлено
|
||||||
|
|
||||||
@@ -80,4 +82,4 @@
|
|||||||
|
|
||||||
### Открытое
|
### Открытое
|
||||||
|
|
||||||
- Нет. Этап A (56–57) проверяет соседний проход. 46 и 60 чужие 🔄.
|
- Нет. Этап A (56–57) — соседний проход. TalkCircle и остаток `review/slice-9-cd` не трогались.
|
||||||
|
|||||||
@@ -32,7 +32,7 @@
|
|||||||
| Срез 9. Этапы A–B — мнения и разговоры | `a80c6f0` | [09-social](09-social/reviewed.md) |
|
| Срез 9. Этапы A–B — мнения и разговоры | `a80c6f0` | [09-social](09-social/reviewed.md) |
|
||||||
| Срез 9. Этапы C–D — конфликт, присутствие, речь и romance | `19554d4` | [09-social](09-social/reviewed.md) |
|
| Срез 9. Этапы C–D — конфликт, присутствие, речь и romance | `19554d4` | [09-social](09-social/reviewed.md) |
|
||||||
| Срез 10. Этап A — страховка | `cecd79c` | [10-craft](10-craft/reviewed.md) |
|
| Срез 10. Этап A — страховка | `cecd79c` | [10-craft](10-craft/reviewed.md) |
|
||||||
| Срез 10. Этапы B–C — работник, карточка и дамп | `f4f726a` | [10-craft](10-craft/reviewed.md) |
|
| Срез 10. Этапы B–C — работник, карточка и дамп | `34f28f9` | [10-craft](10-craft/reviewed.md) |
|
||||||
| Связность урока (вне очереди) 48, 50–53 | `efa27ab` | [off-queue](off-queue/reviewed.md) |
|
| Связность урока (вне очереди) 48, 50–53 | `efa27ab` | [off-queue](off-queue/reviewed.md) |
|
||||||
| Портреты (вне очереди) 60–61 | `5e23d1f` | [off-queue](off-queue/reviewed.md) |
|
| Портреты (вне очереди) 60–61 | `5e23d1f` | [off-queue](off-queue/reviewed.md) |
|
||||||
| Портреты (вне очереди) 62 | `d093ea3` | [off-queue](off-queue/reviewed.md) |
|
| Портреты (вне очереди) 62 | `d093ea3` | [off-queue](off-queue/reviewed.md) |
|
||||||
|
|||||||
@@ -0,0 +1,29 @@
|
|||||||
|
using System.Reflection;
|
||||||
|
using HSchool.Server.Game;
|
||||||
|
using HSchool.Simulation;
|
||||||
|
|
||||||
|
namespace HSchool.Server.Tests;
|
||||||
|
|
||||||
|
public class PersonCardReaderShapeTests
|
||||||
|
{
|
||||||
|
[Fact]
|
||||||
|
public void PersonCardReader_HasOnePublicRead()
|
||||||
|
{
|
||||||
|
var reader = typeof(PersonCardReader);
|
||||||
|
Assert.True(reader.IsAbstract && reader.IsSealed);
|
||||||
|
Assert.False(reader.IsPublic);
|
||||||
|
|
||||||
|
var publicMethods = reader.GetMethods(
|
||||||
|
BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static | BindingFlags.DeclaredOnly)
|
||||||
|
.Where(method => !method.IsSpecialName)
|
||||||
|
.ToArray();
|
||||||
|
var read = Assert.Single(publicMethods);
|
||||||
|
Assert.Equal("Read", read.Name);
|
||||||
|
|
||||||
|
var parameters = read.GetParameters();
|
||||||
|
Assert.Equal(3, parameters.Length);
|
||||||
|
Assert.Equal(typeof(School), parameters[0].ParameterType);
|
||||||
|
Assert.Equal(typeof(string), parameters[1].ParameterType);
|
||||||
|
Assert.Equal(typeof(string), parameters[2].ParameterType);
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user