mirror of
https://github.com/Matysh/houseplan-card
synced 2026-09-30 11:49:16 +00:00
refactor: one function owns the junction geometry of a space (#229 r2 M1)
Дефект High-1 был одинаковым в двух местах — и в живом рисовании, и в
«Оптимизировать планы», — потому что каждый вызывающий собирал геометрию
примыканий сам. Ревью r2 справедливо заметило, что и защита получилась
однобокой: юнит и мутант сторожили только оптимизатор, а путь карты — тот, где
дефект и был виден пользователю, — не сторожил никто. Заплатка в виде второго
мутанта-близнеца оставила бы причину на месте: два списка координат, которые
обязаны совпадать, но ничем не связаны.
Поэтому геометрия переехала в `spaceMergeGeometry(space, { excludeDraftId })`:
один источник комнат, колонн и концов черновиков, одни координаты, одно место,
где можно ошибиться. Оба вызывающих теперь строчка вызова.
Покрытие идёт за причиной, а не за симптомом: три юнита в
`test/wall-merge.test.mjs` проверяют масштаб полигонов (включая комнаты в форме
x/y/w/h и комнату без геометрии), исключение активного черновика и сам T-стык к
середине стороны комнаты. Мутанты `partition-merge-rescales-rooms` и
`chain-merge-sees-own-draft` перенацелены на общий модуль и теперь краснеют для
обоих путей сразу: 2 и 1 падение, проверено применением патча.
Сценарий с комнатой в смоке пробовал — не взлетел: рисование в комнату
поднимает `_offerWallFaces`, и цепочка не завершается штатно. Ломать смок под
тест не стал, юниты общего модуля покрывают оба пути честнее.
Issue: #229
User-Visible: no
This commit is contained in:
@@ -719,27 +719,27 @@ export const MUTANTS = [
|
||||
},
|
||||
{
|
||||
id: 'partition-merge-rescales-rooms',
|
||||
guard: 'node --test --test-name-pattern="issue 229" test/plan-optimizer.test.mjs',
|
||||
guard: 'node --test --test-name-pattern="issue 229" test/wall-merge.test.mjs',
|
||||
because: 'комнаты хранятся в тех же координатах, что перегородки: лишнее деление '
|
||||
+ 'уносит их в угол и примыкание к стене комнаты перестаёт находиться '
|
||||
+ '(CODE-REVIEW-229-r1, High-1)',
|
||||
patches: [{
|
||||
file: 'src/plan-optimizer.ts',
|
||||
find: ` .filter((poly: number[][] | null): poly is number[][] => !!poly),`,
|
||||
replace: ` .filter((poly: number[][] | null): poly is number[][] => !!poly)
|
||||
.map((poly: number[][]) => poly.map((p) => [p[0] / NORM_W, p[1] / NORM_W])),`,
|
||||
file: 'src/wall-merge.ts',
|
||||
find: ` .filter((poly: number[][] | null): poly is number[][] => !!poly),`,
|
||||
replace: ` .filter((poly: number[][] | null): poly is number[][] => !!poly)
|
||||
.map((poly: number[][]) => poly.map((p) => [p[0] / 1000, p[1] / 1000])),`,
|
||||
}],
|
||||
},
|
||||
{
|
||||
id: 'chain-merge-sees-own-draft',
|
||||
guard: 'node demo/smoke_wall_chain_merge.mjs',
|
||||
guard: 'node --test --test-name-pattern="issue 229" test/wall-merge.test.mjs',
|
||||
because: 'завершаемая цепочка ещё лежит в room_drafts, и её собственные концы '
|
||||
+ 'нельзя принимать за чужое примыкание — иначе стык с существующей стеной '
|
||||
+ 'никогда не срастается (CODE-REVIEW-229-r1, High-2)',
|
||||
patches: [{
|
||||
file: 'src/houseplan-card.ts',
|
||||
find: ' if (draft?.id && draft.id === this._activeDraftId) return [];',
|
||||
replace: ' void 0;',
|
||||
file: 'src/wall-merge.ts',
|
||||
find: ' if (exclude && draft?.id === exclude) return [];',
|
||||
replace: ' void exclude;',
|
||||
}],
|
||||
},
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user