feat(math5): Глава 2 «Выражения. Уравнения» — §1–9 + финал (Sonnet по эталону)

Числовые выражения и порядок действий, выражения с переменными, уравнение
(SVG-весы + решение/проверка корня), формулы (P,S,путь), решение задач
уравнением, угол (SVG-рисунок + классификация острый/прямой/тупой/развёрнутый),
прикладные/занимательные/исторические § + финал-боссы. Реализовано Sonnet-агентом
по образцу math_5_ch1, проверено: грузится без ошибок, §1–9 без заглушек. Тесты: 11/11.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Maxim Dolgolyov
2026-06-03 10:18:29 +03:00
parent 12a08e7d42
commit 06e9846cc3
2 changed files with 961 additions and 5 deletions
+27 -4
View File
@@ -75,10 +75,33 @@ for (const ch of CHAPTERS) {
});
}
test('ch2/ch3: §§ без билдеров — заглушка движка (каркас ждёт наполнения)', async () => {
for (const f of ['math_5_ch2.html', 'math_5_ch3.html']) {
const { doc } = await loadDom(f);
assert.ok(doc.querySelector('#p1-body .m6-placeholder'), f + ': заглушка § 1');
test('ch3: §§ без билдеров — заглушка движка (каркас ждёт наполнения)', async () => {
const { doc } = await loadDom('math_5_ch3.html');
assert.ok(doc.querySelector('#p1-body .m6-placeholder'), 'ch3: заглушка § 1');
});
test('ch2: выражения/уравнения/углы + финал', async () => {
const { doc, errors } = await loadDom('math_5_ch2.html');
const win = doc.defaultView;
assert.ok(!doc.querySelector('#p1-body .m6-placeholder'), '§1 наполнен');
assert.ok(doc.querySelector('#p1-iv1 #p1-a'), '§1: тренажёр выражений');
win.goTo('p3'); await wait(80);
assert.ok(doc.querySelector('#p3-iv1 #p3-a'), '§3: решение уравнения');
win.goTo('p6'); await wait(80);
assert.ok(doc.querySelector('#p6-fig svg'), '§6: SVG угла');
win.goTo('final'); await wait(80);
assert.ok(doc.querySelector('#fin-go'), 'финал: арена боссов');
win.bumpProgress('final', 100); await wait(20);
assert.ok(win.M6STATE.achievements.has('ch2_done'), 'достижение «Глава 2 пройдена»');
assert.deepEqual(errors, [], 'нет ошибок: ' + errors.join(' | '));
});
test('ch2: все § §1–§9 наполнены (нет заглушек)', async () => {
const { doc } = await loadDom('math_5_ch2.html');
const win = doc.defaultView;
for (let n = 1; n <= 9; n++) {
win.goTo('p' + n); await wait(20);
assert.ok(!doc.querySelector('#p' + n + '-body .m6-placeholder'), '§' + n + ' наполнен');
}
});