Files
andrey 7d788404f8 Фаза 4: персистентность, полная суита и полировка
- index.html: реальная персистентность (loadSave/applySave/persist/freshSave,
  SAVE_VERSION=1, форма сейва v1, base64-поле, миграции), резюм незавершённой
  партии после reload, авто-пауза при visibilitychange без перезаписи сейва;
  полировка: modeForState вместо мёртвого mode, валидация FIELD_SIZES,
  setFieldSize игнорирует чужие значения, согласованный дефолт fieldH,
  сброс hoverCell на pointerup/cancel, актуализирован комментарий mode.
- tests/test.js: расширена 65 -> 123 проверок (резюм R1/R2/R3, миграция/битый
  сейв, настройки, resize, клики DOM-кнопок, applyIntent, паритет сохранён).
- tools/old-ref/: harness паритета перенесён в репозиторий (old_ref.cpp,
  reference*.json, генераторы, diff-our.js, ref-*.txt, ce1.txt, README).
- AGENTS.md/README.md: форма сейва, миграции, резюм, harness, структура.
- .gitignore: секрет .gitea_token и бинарники/логи harness.
- Прогоны: check: OK; npm test — ИТОГ 123/123; паритет clean 273/273.
- Ревью-гейт 4 (Oracle): PASS; minor/mit закрыты.
2026-10-11 09:29:20 +03:00

37 lines
1.8 KiB
JavaScript

'use strict';
/* Формирует компактную фикстуру паритета для суиты:
<repo>/tests/parity-fixture.json
Источники: reference.json (proto) и reference-clean.json (clean).
Кейсы: классика (clean==proto) + плотные смешанные двухцветные + минимальный
контрпример бага parent[] (cc_3x3_stale).
Запуск: node gen-fixture.js
*/
const fs = require('fs');
const path = require('path');
const DIR = __dirname;
const OUT = path.join(DIR, '..', '..', 'tests', 'parity-fixture.json');
const proto = JSON.parse(fs.readFileSync(path.join(DIR, 'reference.json'), 'utf8'));
const clean = JSON.parse(fs.readFileSync(path.join(DIR, 'reference-clean.json'), 'utf8'));
const cleanByName = new Map(clean.map(c => [c.name, c]));
const SELECT = [
'block2x2_5x5', // классика: неподвижный блок
'blinker_h_5x5', // классика: блинкер
'glider_8x8', // классика: глайдер
'rnd_6x6_s1', // плотное смешанное двухцветное
'rnd_8x8_s2', // плотное смешанное двухцветное (много расхождений proto)
'cc_3x3_stale', // минимальный контрпример бага parent[]
];
const out = SELECT.map(name => {
const p = proto.find(c => c.name === name);
const cl = cleanByName.get(name);
if (!p || !cl) throw new Error('нет кейса ' + name);
return { name, w: p.w, h: p.h, clean: cl.steps, proto: p.steps };
});
fs.writeFileSync(OUT, JSON.stringify(out, null, 1) + '\n');
console.log('фикстура записана:', OUT, '| кейсов:', out.length,
'| размер:', fs.statSync(OUT).size, 'байт');